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

时间:2017-05-30 21:45:55

标签: ios swift apple-push-notifications watch-os watch-os-3

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

我成功处理了这四种情况中的三种情况的推送通知。我遇到的问题是当手表应用程序在前台打开但iOS应用程序在后台时 - 我无法找到任何手表Notification Controller,其ExtensionDelegate或iOS AppDelegate的方法在这种情况下推送远程通知时会触发。

在iOS AppDelegate中,当iOS应用处于前台且观看应用处于任一状态时推送通知时会触发此消息:

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

在WatchKit扩展程序NotificationController中,当iOS和监视应用程序都在后台时按下通知时会触发:

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

然而,如果监视应用程序在前台并且iOS应用程序在后台,则在推送通知时,iPhone上会显示通知横幅(即使屏幕已锁定),并且我发现无法处理它并更新手表,除非那时手表也在后台。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

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

令我困惑的是文档说:

  

用户通知框架提供用于iOS,watchOS和tvOS应用程序的统一API,并支持与本地和远程通知相关的大多数任务。以下是您可以使用此框架执行的一些任务示例...

但是当他们为iOS,tvOS和macOS进行此操作时,文档并未详细说明这对于手表的确切方式。

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

UNUserNotificationCenter.current().delegate = self

启动ExtensionDelegate。