如果第一个通知在 swift 中被忽略,则安排第二个通知(或者如果通知被忽略则完成任何操作)

Scheduling a second notification if first is ignored in swift (or completing any action if notification is ignored)

所以我目前在 App Store 上有一个应用程序可以提前安排 10 个通知,假设你错过了一个,你仍然会有第二次或十次机会。现在,在你认为我会打扰这个人之前,通知对于应用程序的功能非常重要,而且确实是主要目的。该应用程序是为 iOS 7 构建的,因此根据我的理解,当时没有 "handleActionWithIdentifier" 可以完成该应用程序的操作,即使它已关闭,具体取决于用户对通知的响应。此更新对应用程序非常有帮助,因为它消除了我必须打开应用程序才能响应通知的部分问题(通知会向用户提出问题,并根据答案完成某些操作)。

剩下的问题是检测是否错过了通知,如果通知被取消或忽略,我将如何让另一个通知出现,例如第二天。我已经在 google 和堆栈溢出上搜索了这个,根据我的理解,之前的所有问题都在询问如何检测是否错过了我不需要的应用程序打开时的通知。

此时,如果用户通过按下通知上的选项之一来响应通知,我可以正确地 运行 代码:

func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
        var userInfo = [NSObject: AnyObject]()
        userInfo["text"] = responseInfo[UIUserNotificationActionResponseTypedTextKey]
        NSNotificationCenter.defaultCenter().postNotificationName("text", object: nil, userInfo: userInfo)

        print(userInfo)

        completionHandler()
    }

截至目前,我只是接受文本字段输入并打印它,但如果需要,我可以启动第二个通知。有没有一种方法可以检测何时错过通知并安排另一个通知?

总是有可能仍然无法做我想做的事,我只会提前安排 10 个通知,这看起来很草率,并且不会让我做出重复的响应。

TLDR;如果在不打开应用程序的情况下错过了本地通知,我如何检测并 运行 代码

顺便说一句:如果您有答案,swift 是首选语言

您可以混合使用后台获取某种时间戳测试

For instance:

当您安排通知时,您可以保留一些逻辑,让您跟踪该通知是否被忽略。也许在 NSUserDefaults 中保留一些数据,这是最后发送的 Notification 并且 它应该由 O.S 启动时.

One way could be to check for that timestamp:

如果您在它应该启动的那一刻之后启动此测试(并且可能有点晚,以防万一用户看到它但仍未准备好回答) 而你还没有将其标记为 未忽略,那么用户 可能 已忽略或者错过了你的通知。

This test should be able to be used in your AppDelegate.

然后,后台模式中启用后台获取功能。

This will give some CPU time to your app (when iOS thinks is a good time for that) and you can seize the opportunity ;-).

要做到这一点,您需要在 AppDelegate 实施中添加适当的功能:

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
       // your code
    }

在此函数的主体中,运行 您的 "test for ignored notification" 并根据需要安排新通知。

Don't forget to call completionHandler as soon as you finish your test!