watchOS 应用程序在前台时处理推送通知?

Handling push notifications while watchOS app is in the foreground?

我正在构建 iOS + watchOS 应用程序,需要在 iOS 和 watch 应用程序状态的所有可能组合中通知用户更新信息:当 iOS 和watchOS 运行 在前台,当它们都 运行 在后台时,当一个或另一个在后台时。

我成功地处理了这四种情况中的三种情况的推送通知。我被卡住的地方是手表应用程序在前台打开但 iOS 应用程序在后台 - 我找不到手表通知控制器,它的 ExtensionDelegate 或 iOS 在这种情况下推送远程通知时将触发的 AppDelegate。

在 iOS AppDelegate 中,当 iOS 应用程序处于前台且手表应用程序处于任一状态时推送通知时会触发此事件:

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
                            withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

在 WatchKit Extension NotificationController 中,当 iOS 和手表应用都在后台时推送通知时会触发此事件:

override func didReceive(_ notification: UNNotification, withCompletion completionHandler: @escaping (WKUserNotificationInterfaceType) -> Swift.Void) { ... }

然而,如果 watch 应用程序在前台,iOS 应用程序在后台,当推送通知时,通知横幅会出现在 iPhone(即使屏幕被锁定),我找不到处理它和更新手表的方法,除非手表当时也在后台。

有什么想法吗?

想通了。要在手表应用程序处于后台和前台时处理通知,似乎您必须在 NotificationController 中的 didReceive 方法(用于后台通知)和 ExtensionDelegate 中的 UNUserNotificationDelegate 协议中使用 willPresent 方法(用于前台通知):

func userNotificationCenter(_: UNUserNotificationCenter, willPresent: UNNotification, withCompletionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    print("willPresent fired from watch delegate")
}

让我困惑的是文档说:

The User Notifications framework offers a unified API for use in iOS, watchOS, and tvOS apps, and supports most tasks associated with local and remote notifications. Here are some examples of tasks you can perform with this framework...

但是,虽然他们针对 iOS、tvOS 和 macOS 进行了此操作,但文档并未具体说明如何为手表执行此操作。

在 Watch ExtensionDelegate 中不需要完成注册和设备令牌步骤(实际上是不可能的,因为您需要 UIApplication 模块来完成),但是需要调用:

UNUserNotificationCenter.current().delegate = self

启动 ExtensionDelegate 时。