从强制退出启动应用程序时检测可操作的通知按钮 - Swift

时间:2018-01-18 22:58:12

标签: ios swift xcode notifications

以下是我的情况:

  • 我有一个应用程序,每小时给用户一个通知。
  • 此通知是可操作的,并附有“静音直到明天”按钮。正如您可能猜到的那样,此按钮应该重新安排通知,以便在第二天重新开始。
  • 因此,当您按下此按钮时,我需要执行一段代码。

如果应用程序在后台运行,我在FirstViewController.swift文件中使用此功能:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

如果应用在后台运行,则效果非常好。但是,如果应用程序已被用户强制退出,则不起作用。根据{{​​3}}, iOS将永远不会在用户强制退出后重新启动应用程序。编辑:显然按可操作通知中的按钮计为用户交互,您的应用可以运行代码以响应此情况。

因此我更改了可操作的通知按钮,以便在按下应用程序时将其置于前台,认为这样可以解决我的问题。但是,出于某种原因,当应用程序被强制关闭时,从按钮启动应用程序时,上面的函数是 not

我的第一个想法是在AppDelegate中使用此函数修复此问题:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

但基于this post,我没有看到“按下可操作通知按钮”的键或类似的任何键。

如何在强制关闭后通过可操作的通知按钮检测到我的应用已启动?

更新:根据this list of launch option keys from Apple,“如果您没有实施此方法[我上面列出的第一个],您的应用永远不会响应自定义操作。”如果这是真的并且没有其他方法可以捕获这个,我该怎么办?我想做什么根本不可能?

1 个答案:

答案 0 :(得分:2)

想出来。我移动了我最初尝试使用的方法:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

从我的FirstViewController到我的AppDelegate。我还移动了所有设置代码:

UNUserNotificationCenter.current().delegate = self
let muteAction = UNNotificationAction(identifier: "muteActionID", title: "Mute until tomorrow", options: [])
let tutorialCategory = UNNotificationCategory(identifier: "muteCategory", actions: [muteAction], intentIdentifiers: [], options: [])
UNUserNotificationCenter.current().setNotificationCategories([tutorialCategory])

到AppDelegate的didFinishLaunchingWithOptions方法。现在,当我按下可操作的通知按钮时,无论应用程序是否已强行关闭,都会调用didReceive response方法。 更好的是,它甚至无需在前台打开应用程序即可。