Дело в том, что расширение службы уведомлений само по себе бесполезно, за исключением одной вещи, которую можно показать, когда приложение убито. Таким образом, с помощью уведомлений в приложении и расширения содержимого я могу показывать настраиваемое уведомление, но это уведомление будет отображаться только в том случае, если приложение не было убито / принудительно закрыто. Вопрос: Как управлять уведомлениями в приложении, если есть расширения для уведомлений о содержимом и службах, и как заставить расширение службы уведомлений вызывать / активировать расширение содержимого уведомлений.
IOS: уведомление в приложении + служба уведомлений + расширения содержимого
Ответы (1)
Казалось, что мне нужно очистить проект, удалить приложение и снова установить. Вот полные шаги для FCM в этом случае, возможно, некоторые из шагов избыточны, но я не хочу касаться его, пока он работает:
Приложение убито / закрыто: уведомление отображается с настраиваемым представлением содержимого Приложение находится в фоновом режиме: отображается уведомление с настраиваемым представлением содержимого Приложение находится на переднем плане: уведомление поступает беззвучно
Со стороны сервера уведомление должно выглядеть так
{"notification": // обязательный {"data": {}, "body": "" // тоже казался обязательным, в любом случае вы можете изменить его в расширении службы} "content_available": true, // обязательно "mutable_content" : true, // обязательно "в": "" // обязательно}
Создайте цель расширения службы уведомлений.
- В info.plist в разделе NSExtension добавьте UNNotificationExtensionCategory как Array и добавьте одну категорию с любым именем, которое вы хотите, но используйте одно и то же везде.
- В цели расширения службы уведомлений убедитесь, что все такое же, как и в основной цели (быстрая версия, версия сборки, цель развертывания, устройства).
- В возможностях добавьте группы приложений (они должны быть такими же, как в основной цели).
В NotificationService в didReceive получить изменяемый контент
bestAttemptContent = (request.content.mutableCopy () как? UNMutableNotificationContent)
Добавьте свою категорию в контент
bestAttemptContent.categoryIdentifier = "yourCategory"
После звонка
contentHandler(bestAttemptContent)
появляется стандартное уведомление.Создайте цель расширения содержимого уведомлений.
- В info.plist в разделе NSExtension добавьте UNNotificationExtensionCategory в качестве массива и добавьте одну категорию с тем же именем, которое вы уже создали для службы.
- Измените дизайн в MainInterface.storyboard в соответствии с вашим дизайном.
- В NotificationViewController пользовательские данные будут в
notification.request.content.userInfo["gcm.notification.data"]
. Итак, в NotificationViewController заполните представления данными. Не забывайте оpreferredContentSize
. - В возможностях добавьте группы приложений (они должны быть такими же, как в основной цели).
- В основной цели AppDelegate реализовать
UNUserNotificationCenterDelegate
. В
didFinishLaunchingWithOptions
добавитьUNUserNotificationCenter.current (). Delegate = self UNUserNotificationCenter.current (). RequestAuthorization (options: [.badge, .alert, .sound]) {(разрешено, ошибка) в} application.registerForRemoteNotifications ()
В AppDelegate добавьте
приложение func (_ приложение: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {Messaging.messaging (). apnsToken = deviceToken}
В 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}
Здесь обрабатывается беззвучное уведомление:
func application (_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completedHandler: @escaping (UIBackgroundFetchResult) -> Void)
- 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"]
- Если у вас есть асинхронные сетевые вызовы для загрузки данных / изображений, не забудьте реализовать
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void)
Вроде все :). А, расширения работают, начиная с iOS 10. Пожалуйста, поправьте меня, если чего-то не хватает или что-то избыточное.