重新启动应用后,iOS OneSignal handleNotificationReceived回调未调用

时间:2018-12-12 11:52:48

标签: ios onesignal

当我从Xcode运行我的应用程序时,一切正常。我得到了handleNotificationReceived回调,并且可以从通知中读取数据并根据数据进行处理。如果我单击通知,则将调用handleNotificationAction回调,此处相同。如果然后我将应用程序最小化,它的工作原理相同-会调用回调,并且我可以处理通知。

当我通过最近的应用程序菜单从iPhone终止该应用程序并从桌面上的图标启动它时,问题就开始了。如果应用程序位于前台,则一切正常,就像我从Xcode启动应用程序时一样。当我最小化它时,我仍然会收到通知,但不再调用handleNotificationReceived回调。如果我单击通知,则应用程序进入前台,然后调用handleNotificationAction,并在不久之后又调用handleNotificationReceived。只要应用程序处于前台状态,它就可以继续正常运行并调用回调。我再次最小化应用程序后,不再调用handleNotificationReceived。

如果我连接调试器,一切将再次恢复正常。

为什么不叫它?我在必须保存在核心数据中的通知中收到一些数据。

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

1 个答案:

答案 0 :(得分:0)

仅当您在主体中设置以下标志(请参见 section-content-language 下的doc)时,

handleNotificationReceived 才会在后台触发:

  • content_available:1
  • mutable_content:1

使用POST正文中的上述两个标志,OS唤醒您的应用程序以将状态设置为Background。当您的应用程序被标记为这些状态时,将触发处理程序。

您可以通过邮递员进行测试。

{ "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是用法的一个例子。