IOS: уведомление в приложении + служба уведомлений + расширения содержимого

Дело в том, что расширение службы уведомлений само по себе бесполезно, за исключением одной вещи, которую можно показать, когда приложение убито. Таким образом, с помощью уведомлений в приложении и расширения содержимого я могу показывать настраиваемое уведомление, но это уведомление будет отображаться только в том случае, если приложение не было убито / принудительно закрыто. Вопрос: Как управлять уведомлениями в приложении, если есть расширения для уведомлений о содержимом и службах, и как заставить расширение службы уведомлений вызывать / активировать расширение содержимого уведомлений.


person nzackoya    schedule 27.09.2017    source источник


Ответы (1)


Казалось, что мне нужно очистить проект, удалить приложение и снова установить. Вот полные шаги для FCM в этом случае, возможно, некоторые из шагов избыточны, но я не хочу касаться его, пока он работает:

Приложение убито / закрыто: уведомление отображается с настраиваемым представлением содержимого Приложение находится в фоновом режиме: отображается уведомление с настраиваемым представлением содержимого Приложение находится на переднем плане: уведомление поступает беззвучно

  1. Со стороны сервера уведомление должно выглядеть так

    {"notification": // обязательный {"data": {}, "body": "" // тоже казался обязательным, в любом случае вы можете изменить его в расширении службы} "content_available": true, // обязательно "mutable_content" : true, // обязательно "в": "" // обязательно}

  2. Создайте цель расширения службы уведомлений.

  3. В info.plist в разделе NSExtension добавьте UNNotificationExtensionCategory как Array и добавьте одну категорию с любым именем, которое вы хотите, но используйте одно и то же везде.
  4. В цели расширения службы уведомлений убедитесь, что все такое же, как и в основной цели (быстрая версия, версия сборки, цель развертывания, устройства).
  5. В возможностях добавьте группы приложений (они должны быть такими же, как в основной цели).
  6. В NotificationService в didReceive получить изменяемый контент

    bestAttemptContent = (request.content.mutableCopy () как? UNMutableNotificationContent)

  7. Добавьте свою категорию в контент

    bestAttemptContent.categoryIdentifier = "yourCategory"

  8. После звонка contentHandler(bestAttemptContent) появляется стандартное уведомление.

  9. Создайте цель расширения содержимого уведомлений.

  10. В info.plist в разделе NSExtension добавьте UNNotificationExtensionCategory в качестве массива и добавьте одну категорию с тем же именем, которое вы уже создали для службы.
  11. Измените дизайн в MainInterface.storyboard в соответствии с вашим дизайном.
  12. В NotificationViewController пользовательские данные будут в notification.request.content.userInfo["gcm.notification.data"]. Итак, в NotificationViewController заполните представления данными. Не забывайте о preferredContentSize.
  13. В возможностях добавьте группы приложений (они должны быть такими же, как в основной цели).
  14. В основной цели AppDelegate реализовать UNUserNotificationCenterDelegate.
  15. В didFinishLaunchingWithOptions добавить

    UNUserNotificationCenter.current (). Delegate = self UNUserNotificationCenter.current (). RequestAuthorization (options: [.badge, .alert, .sound]) {(разрешено, ошибка) в} application.registerForRemoteNotifications ()

  16. В AppDelegate добавьте

    приложение func (_ приложение: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {Messaging.messaging (). apnsToken = deviceToken}

  17. В userNotificationCenter willPresent проверьте, не запущено ли ваше приложение. Я сделал это так:

    func userNotificationCenter (_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completedHandler: @escaping (UNNotificationPresentationOptions) -> Void) {if self.window? .rootViewController == nil {CompletionHandler ([. badgesound,. } UIApplication.shared.applicationIconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber + 1}

  18. Здесь обрабатывается беззвучное уведомление:

    func application (_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completedHandler: @escaping (UIBackgroundFetchResult) -> Void)

    1. Handle the tap on the notification in here:

    func userNotificationCenter (_ center: UNUserNotificationCenter, didReceive ответ: UNNotificationResponse, withCompletionHandler completedHandler: @escaping () -> Void)

здесь вы можете получить пользовательские данные таким же способом response.notification.request.content.userInfo["gcm.notification.data"]

  1. Если у вас есть асинхронные сетевые вызовы для загрузки данных / изображений, не забудьте реализовать func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void)

Вроде все :). А, расширения работают, начиная с iOS 10. Пожалуйста, поправьте меня, если чего-то не хватает или что-то избыточное.

person nzackoya    schedule 27.09.2017