我在敲头。我正在实施推送通知。一切正常(接收到推送,更新了徽章),但是在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,我在这里缺少什么?
答案 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)
}
}
}