如果应用未运行时收到推送通知消失

时间:2016-05-11 22:51:08

标签: ios push-notification background-process appdelegate

我正在开发一个可以接收推送通知的应用,在某些情况下会触发后台提取操作。因此,我已为我的应用启用了remote-notification后台功能。

当应用程序暂停时,推送通知会导致应用程序唤醒并执行application:didReceiveRemoteNotification:fetchCompletionHandler,主页屏幕上会显示横幅,并且通知会保留在通知中心,直到用户点按它以启动应用程序。它完全按照预期工作。

当应用未运行时,只要用户没有强行退出,通知就会启动应用(请参阅apple's documentation),应用会执行application:didFinishLaunchingWithOptions和{{1 }}。横幅显示在主屏幕上,但随后通知消失。它不会保留在通知中心。此外,如果设备被锁定,有时通知会在发出警报声之前消失。

有趣的是,如果我禁用远程通知后台模式,一切正常。在这种情况下,推送通知到达时不会启动应用程序。

启用远程通知后台模式后,如何阻止通知消失,并且传入通知会启动未运行的应用程序?我是否需要在application:didReceiveRemoteNotification:fetchCompletionHandler中添加一些内容,让应用知道它在后台启动,并且通知不应该被丢弃?

3 个答案:

答案 0 :(得分:4)

似乎推送通知正在消失,因为当应用程序在后台启动并执行application:didFinishLaunchingWithOptions:时,它正在重新注册远程通知。重新注册似乎丢弃了任何排队的消息。

我的解决方案是在调用推送注册方法之前检查应用程序是否由于推送通知而在后台启动。我使用Kinvey SDK,因此以下代码使用Kinvey的方法,但我强烈怀疑此解决方案将适用于其他推送注册方法,包括标准UIApplication.registerForRemoteNotifications

造成我问题的代码是:

func application(application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    // Initialize Kinvey SDK singleton
    KCSClient.sharedClient().initializeKinveyServiceForAppKey("myappid",
        withAppSecret: "mysecret",
        usingOptions: nil)

    KCSPush.registerForPush()
    // rest of method...
}

我通过将其更改为:

来解决问题
func application(application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    // Initialize Kinvey SDK singleton
    KCSClient.sharedClient().initializeKinveyServiceForAppKey("myappid",
        withAppSecret: "mysecret",
        usingOptions: nil)

    if let _ = 
        launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {

        let appState: UIApplicationState = UIApplication.sharedApplication().applicationState

        if appState == .Active || appState == .Inactive {
            KCSPush.registerForPush()
        }
    } else {
        KCSPush.registerForPush()
    }
    // rest of method...
}

现在,当应用程序通过传入推送通知启动到后台时,它不会重新注册推送,并且通知将保留在iOS通知中心,直到用户点击它或手动启动应用程序。

答案 1 :(得分:2)

如此处所接受的答案所建议的那样,我尝试在应用处于后台状态时不注册通知,但此操作无法为我解决此问题。我发现手动设置应用程序徽章编号会导致通知消失。

我在application:didFinishLaunchingWithOptions:中有用于检查用户状态的代码,并且(除其他事项外)会将徽章图标设置为0(如果没有活动用户),或者将其设置为我保存在其中的值NSUserDefaults,如果有活动用户。事实证明,这些行之一将导致通知消失并几乎立即停止播放通知声音。之所以在随后的推送中没有发生是因为didFinishLaunching已经有一段时间没有被再次调用了。


tl; dr -检查以确保您没有在任何应用程序生命周期方法或didReceiveRemoteNotification中手动设置应用程序徽章图标。如果您的通知仅在第一次收到时消失,请仔细查看didFinishLaunching

答案 2 :(得分:0)

我发现手动设置应用程序证章编号导致通知消失。

它不是手动设置徽章编号。将徽章编号设置为零。

根据人机界面指南

保持徽章最新。人们查看相应信息后,请立即更新您的应用徽章。您不希望人们认为已有新信息,而只是发现自己已经看过。请注意,将徽标计数减少到零会从通知中心删除所有相关通知。

https://developer.apple.com/design/human-interface-guidelines/ios/system-capabilities/notifications/