应用程序重启后未调用iOS OneSignal handleNotificationReceived回调

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用程序重启后未调用iOS OneSignal handleNotificationReceived回调相关的知识,希望对你有一定的参考价值。

当我从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下):

  • content_available:1
  • mutable_content:1

通过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是一个使用示例。

以上是关于应用程序重启后未调用iOS OneSignal handleNotificationReceived回调的主要内容,如果未能解决你的问题,请参考以下文章

显示 iOS 共享表后未调用 viewWillDisappear

Ionic - OneSignal 在 iOS 13.x 上不起作用

IOS13:选择保存照片后未调用 UIActivityViewController.completionWithItemsHandler

用户对 facebook 进行身份验证后未调用应用程序打开 Url 方法

以编程方式选择行后未调用 UITableView didSelectRowAtIndexPath

ios:当应用程序处于焦点时禁用警报通知(OneSignal)