Обработка push-уведомлений, когда приложение watchOS находится на переднем плане?

Я создаю приложения iOS + watchOS, которые должны уведомлять пользователей с обновленной информацией во всех возможных комбинациях состояний iOS и Watch: когда и iOS, и watchOS работают на переднем плане, когда они оба работают в фоновом режиме, и когда один или другой находится в фоновом режиме.

Я успешно обрабатываю push-уведомления для трех из этих четырех ситуаций. Я застрял, когда приложение для часов открыто на переднем плане, но приложение 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) { ... }

Тем не менее, если приложение для часов находится на переднем плане, а приложение для iOS - в фоновом режиме при нажатии уведомления, баннер с уведомлением появляется на iPhone (даже когда экран заблокирован), и я обнаружил нет возможности справиться с этим и обновить часы, если они не находятся в фоновом режиме в этот момент.

Любые идеи?


person James Riley    schedule 30.05.2017    source источник


Ответы (1)


Разобрался в этом. Чтобы обрабатывать уведомления, когда приложение часов находится либо в фоновом, либо в переднем плане, кажется, что вам нужно реализовать методы как в методе didReceive в NotificationController (для уведомлений в фоновом режиме), так и в протоколе UNUserNotificationDelegate в ExtensionDelegate с методом willPresent (для уведомления на переднем плане):

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

Что меня смутило, так это то, что в документах говорится:

Платформа пользовательских уведомлений предлагает унифицированный API для использования в приложениях iOS, watchOS и tvOS и поддерживает большинство задач, связанных с локальными и удаленными уведомлениями. Вот несколько примеров задач, которые вы можете выполнять с помощью этого фреймворка ...

Но пока они проходят через это для iOS, tvOS и macOS, в документации не указано, как именно это сделать для часов.

Выполнение шагов регистрации и токена устройства не обязательно в Watch ExtensionDelegate (и фактически невозможно, потому что для этого вам нужен модуль UIApplication), но необходимо вызвать:

UNUserNotificationCenter.current().delegate = self

при запуске ExtensionDelegate.

person James Riley    schedule 30.05.2017