UNNotificationServiceExtension - скрыть, когда приложение активно

Я использую UNNotificationServiceExtension для добавления изображений в уведомления iOS APNS. Он работает хорошо, за исключением того, что уведомление отображается, даже когда приложение активно (на переднем плане). Когда приложение активно, я бы хотел обрабатывать уведомления с помощью тоста и не показывать стандартное уведомление iOS поверх активного приложения.

Вопрос: Есть ли способ определить состояние приложения из расширения службы уведомлений и заблокировать отображение уведомления, когда приложение активно?


comment
Ммм, если я не ошибаюсь, я считаю, что это поведение по умолчанию, стандартное уведомление iOS не появится, если вы не попросите об этом ???? ... Вы делаете это в своем коде: stackoverflow.com/a/40756206/5501940? Если да, то вам следует удалить файл completionHandler([.alert, .badge, .sound]).   -  person Ahmad F    schedule 10.02.2019
comment
Я НЕ хочу, чтобы появлялось уведомление. И я использую расширение службы уведомлений, поэтому изменения в методе didReceiveRemoteNotification в AppDelegate не имеют никакого эффекта.   -  person Peter    schedule 10.02.2019


Ответы (2)


Согласно документации Apple, уведомления не должны появляться, когда приложение активно. по умолчанию.

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

Не имеет значения, используете ли вы расширение службы уведомлений - уведомление всегда обрабатывается приложением в конце, хотя расширение можно использовать для его изменения в первую очередь.

Попробуйте этот код (на самом деле, поскольку уведомления появляются, когда приложение активно, вы, вероятно, где-то реализовали этот метод - если он вам не нужен, вы можете просто удалить его).

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    // Perform additional handling of the notification, if needed.

    completionHandler([])
}
person teddy    schedule 11.02.2019
comment
Это правильный ответ. Большое спасибо @teddy. - person Peter; 12.02.2019

Вызов completionHandler(.newData) внутри application(_:didReceiveRemoteNotification:fetchCompletionHandler:) приводит к отображению баннера внутри приложения. Вы можете избавиться от этого.

func application(_ application: UIApplication,
                   didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
   // completionHandler(.newData) // <- Comment it out
}
person Mojtaba Hosseini    schedule 10.02.2019
comment
Это не блокирует уведомление при использовании расширения службы уведомлений. Не вызывает и вызов self.contentHandler (nil); в расширении. - person Peter; 10.02.2019