2017-05-30 122 views
0

我正在構建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上(即使屏幕被鎖定),我發現沒有辦法處理它並更新手錶,除非手錶也是在那個時候的背景中。

任何想法?

回答

1

想通了。要處理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。

相關問題