当我从Xcode运行我的应用程序时,一切正常。我调用了handleNotificationReceived回调,我可以从通知中读取数据并根据数据处理它。如果我点击通知,则会调用handleNotificationAction回调并在此处进行相同的操作。如果我然后最小化应用程序它的工作原理相同 - 调用回调,我可以处理通知。
当我通过最近的应用程序菜单从iPhone终止应用程序并从桌面上的图标启动它时,问题就开始了。如果应用程序位于前台,一切正常,就像我从Xcode启动应用程序一样。当我最小化它时,我仍然收到通知,但不再调用handleNotificationReceived回调。如果我点击通知,应用程序进入前台,然后调用handleNotificationAction,并且在调用handleNotificationReceived之后不久。只要应用程序处于前台,它就会继续正常工作并调用回调函数。只要我再次最小化应用程序,handleNotificationReceived就不再被调用。
如果我附加调试器,一切都会再次正常工作。
为什么不叫它?我在通知中收到一些数据,我必须保存在Core Data中。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
AppDelegate.configOneSignal(launchOptions)
return true
}
class func configOneSignal(_ launchOptions: [UIApplicationLaunchOptionsKey: Any]? = nil) -> Void {
let onesignalInitSettings = [kOSSettingsKeyAutoPrompt: false]
OneSignal.initWithLaunchOptions(launchOptions,
appId: "MY_APP_ID",
handleNotificationReceived: { notification in
print("notification received")
AppDelegate.handleNotification(notification)
},
handleNotificationAction: { (result) in
print("notification action")
AppDelegate.handleNotification(result?.notification)
},
settings: onesignalInitSettings)
OneSignal.inFocusDisplayType = OSNotificationDisplayType.notification;
OneSignal.promptForPushNotifications(userResponse: { accepted in
print("User accepted notifications: \(accepted)")
})
}
Xcode版本:10.1经过测试的iOS版本:10,11,12
只有在正文中设置了以下标志时,才会在后台触发handleNotificationReceived(请参阅doc,在section-content-language下):
通过POST主体中的上述两个标志,OS会唤醒您的应用程序,以便将状态设置为BACKGROUND。当应用程序标记为这些状态时,将触发处理程序。
你可以通过Postman测试。
{ "app_id" : "<your one signal app id>", "included_segments" : ["All"], -> or whatever you want "content_available": "1", "mutable_content": "1", "data": {
"custom_key" : "custom_value" }, "contents": {"en":"notification title"} }
不要忘记设置标题(内容类型和授权)
Here是一个使用示例。