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

问题描述:

我正在构建iOS + watchOS应用程序,需要通过所有可能的iOS和Watch应用程序状态组合的更新信息通知用户:当iOS和watchOS都在前台运行时,当它们都在背景,并且当其中一个或另一个在后台时。在watchOS应用程序处于前台时处理推送通知?

我正在成功处理这四种情况中的三种情况的推送通知。我卡住的地方是手表应用程序在前台打开,但iOS应用程序在后台 - 我无法找到Watch 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上(即使屏幕被锁定),我发现没有办法处理它并更新手表,除非手表也是在那个时候的背景中。

任何想法?

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

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

了什么让我感到困惑的是,该文件说:

用户通知框架提供了一个统一的API为iOS中,watchOS和tvOS的应用程序,并且支持使用大多数与本地和远程通知相关的任务。这里是任务的一些例子,你可以用这个框架进行...

但是当他们经过这适用于iOS,tvOS和MacOS,该文档不指定究竟如何手表做到这一点。

通过注册和设备标识的步骤去,这在观看ExtensionDelegate没有必要(实际上是不可能的,因为你需要的UIApplication的模块,以做到这一点),但有必要调用:

UNUserNotificationCenter.current().delegate = self 

启动ExtensionDelegate。