我正在构建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上会显示通知横幅(即使屏幕已锁定),并且我发现无法处理它并更新手表,除非那时手表也在后台。
有什么想法吗?
答案 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。