当应用程序在后台运行时,iOS 13.3中未调用didReceiveRemoteNotification

时间:2020-01-23 10:57:02

标签: ios objective-c apple-push-notifications ios13 silent-notification

我在敲头。我正在实施推送通知。一切正常(接收到推送,更新了徽章),但是在iOS 13.3下,当应用程序在后台运行时,不会调用application(_:didReceiveRemoteNotification:fetchCompletionHandler :)方法。如果应用程序在前台或使用iOS 12设备,则将调用该方法。我通过以下方式注册推送通知:

[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        });
    }
}];

有效负载设置为以下

{"aps": {
    "badge": 10,
    "alert": "test",
    "content-available": 1
}}

我尝试在所有变体中添加“远程通知”和“背景处理”作为应用程序功能(仅“远程通知” /“背景处理”,而没有其中的任何一项功能,同时启用了这两项)。我为UNUserNotificationCenter设置了委托,但再次没有成功。我相应地设置标题:

curl -v \
 -H 'apns-priority: 4' \
 -H 'apns-topic: xx.xxxxx.xxxx' \
 -H 'apns-push-type: alert' \
 -H 'Content-Type: application/json; charset=utf-8' \
 -d '{"aps": {"badge": 10,"alert": "test", "content-available":1}}' \
 --http2 \
 --cert pushcert.pem \
 https://api.sandbox.push.apple.com/3/device/1234567890

从文档中可以看出,即使应用程序在后台运行,该方法也会被调用:

使用此方法为您的应用处理传入的远程通知。 与application:didReceiveRemoteNotification:方法不同,该方法是 仅当您的应用在前台运行时才调用 当您的应用在前台运行时调用此方法,或者 背景。

对于iOS 13,我在这里缺少什么?

7 个答案:

答案 0 :(得分:11)

您设置了

"content-available": 1

您的后端APS有效载荷是什么?

还需要确保已在iOS应用的info.plist文件中启用了后台模式

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>

答案 1 :(得分:3)

我花了一张支持票来解决这个问题。

事实证明,有关此主题的文档对于iOS 13并非100%“有效”。设备决定是否唤醒。尽管文档中指出的内容有所不同。

Apple作为通知扩展的首选实现方式。之后,您必须调整有效负载以包含“可变内容”。

之后我问支持者是否要提出雷达要求,他们回答“是”。

答案 2 :(得分:1)

此委托方法:-

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
当我们单击iOS 13的通知且应用程序处于后台时,

被调用。

答案 3 :(得分:0)

在应用的委托中实施didRegisterForRemoteNotificationsWithDeviceToken以及didFailToRegisterForRemoteNotificationsWithError,以检查设备是否与Apple的APN服务器建立了良好的连接。如果不是这种情况,请重新启动设备和/或尝试通过另一个Wi-Fi网络建立连接,然后重新启动应用程序。

答案 4 :(得分:0)

需要激活“ BackGround fetch”,进入File Project-登录功能-BackgroundModes-并同时检查Background fetch和Remote通知

记住didFinishAlunchWithOptions

    Messaging.messaging().delegate = self
    UNUserNotificationCenter.current().delegate = self

在方法中我有一个响应-didReceive响应-在后台,但只有在点击通知的情况下。

我找到了这个信息...但是我不知道这是不是真的

”“如果这是iOS的新系统行为,则FCM不太可能提供解决方法。需要注意的几件事:

Apple的文档提到静音通知将被系统限制以节省电量。过去,我们已经看到在设备插入电源的情况下测试无提示通知会减少限制。 在较早的iOS版本中,Apple的文档提到了强制退出应用程序将完全阻止从静默通知中唤醒。我不确定情况是否仍然如此。“

在收到通知的那一刻,我仍在后台寻找应用程序中更新徽章图标的通知。

答案 5 :(得分:0)

我有同样的问题。 阅读:https://medium.com/fenrir-inc/handling-ios-push-notifications-the-not-so-apparent-side-420891ddf10b

我使用Iphone XS 软件版本13.7

1。 在iOS 10之前,使用UIApplication方法: registerUserNotificationSettings( :) 从iOS 10开始,使用UserNotifications框架方法: requestAuthorization(options:completionHandler :) setNotificationCategories(:)

keySet()

“推送通知”,“远程通知”和后台模式功能是必需的(info.plist和Entitlements.plist)

3。

实施DidReceiveRemoteNotification方法和RegisteredForRemoteNotifications

此更改后,调用了DidReceiveRemoteNotification方法。

尝试使用此方法使推送通知静音:

if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
        {
            UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound,
                                                                    (granted, error) => InvokeOnMainThread(UIApplication.SharedApplication.RegisterForRemoteNotifications));
        }
        else if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
        {
            var pushSettings = UIUserNotificationSettings.GetSettingsForTypes(
                    UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                    new NSSet());

            UIApplication.SharedApplication.RegisterUserNotificationSettings(pushSettings);
            UIApplication.SharedApplication.RegisterForRemoteNotifications();
        }
        else
        {
            UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
            UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
        }

尝试使用此按钮进行“普通推送通知”:

{
    "aps" : {
        "alert" : "",
        "content-available" : 1
    },
}

答案 6 :(得分:-1)

您需要实施一个通知内容扩展

当我使用OneSignal及其设置代码时,这对我来说效果很好 https://documentation.onesignal.com/docs/ios-sdk-setup

不确定OneSignal位是否有所不同,但无论如何都要附加它们

import UserNotifications
import OneSignal

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var receivedRequest: UNNotificationRequest!
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.receivedRequest = request;
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

}