Как использовать расширение службы уведомлений с UNNotification в iOS10

Apple представляет новые имена расширений "UNNotificationServiceExtension", но как запустить их из push-уведомления?

Я читал, что расширение службы обеспечивает сквозное шифрование полезной нагрузки.

Какой ключ требуется для установки полезной нагрузки push-уведомления?

Как определить полезную нагрузку и как запустить расширение службы из push-уведомления?


person technerd    schedule 14.10.2016    source источник
comment
Смотрите видео. developer.apple.com/videos/play/wwdc2016/707 developer.apple.com/videos/play/wwdc2016/708   -  person matt    schedule 14.10.2016


Ответы (2)


Позвольте мне сделать это шаг за шагом.

UNNotificationServiceExtension — что это такое?

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

Как создать

Перейдите в «Файл» -> «Создать» -> «Цель» -> «Расширение службы уведомлений» и заполните данные.

Какой ключ требуется для установки полезной нагрузки push-уведомлений?

Вам нужно установить флаг mutable-content на 1, чтобы активировать расширение службы. Кроме того, если для content-available установлено значение 1, расширение службы не будет работать. Поэтому либо не устанавливайте его, либо установите для него значение 0. (Редактировать: это неприменимо. Вы можете установить или снять флаг content-available)

Как определить полезную нагрузку и как запустить расширение службы из push-уведомления?

Создайте расширение, а затем создайте и запустите приложение. Отправьте push-уведомление с mutable-content, установленным на 1.

Код

UNNotificationService предоставляет две функции:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
               withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler;

- (void)serviceExtensionTimeWillExpire;

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

Вы делаете это, изменяя свойство bestAttemptContent вашего расширения, которое является экземпляром UNNotificationContent и имеет свойства: title, subtitle, body, attachments и т. д.

Исходная полезная нагрузка удаленного уведомления доставляется через свойство request.content функционального параметра request.

Наконец, вы отправляете свой bestAttemptContent с помощью contentHandler:

self.contentHandler(self.bestAttemptContent); 

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

Пример кода

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
               withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    // Modify the notification content here...
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
    self.contentHandler(self.bestAttemptContent);
}

Приведенный выше код добавляет [modified] к исходному заголовку в полезной нагрузке PN.

Пример полезной нагрузки

{
    "aps": {
        "alert": {
            "title": "Hello",
            "body": "body.."
        },
        "mutable-content":1,
        "sound": "default",
        "badge": 1,

    },
  "attachment-url": ""
}

Обратите внимание, что ключ attachment-url является пользовательским ключом для ваших собственных нужд и не распознается iOS.

person mickeymoon    schedule 17.10.2016
comment
По делу ответ. Хорошее объяснение. Специально для You need to set the 'mutable-content' flag to 1 to trigger the service extension. Also, if the 'content-available' is set to 1, the service extension will not work.So either don't set it or set it to 0. - person technerd; 17.10.2016
comment
Вы уверены в ключе доступа к содержимому? Я использую в своем приложении, и он работает без проблем. - person Foriger; 02.11.2016
comment
@Foriger Я помню, что где-то читал об этом, а также упоминалось, что он может не работать с включенным флагом доступности контента. Я попытался найти то же самое снова, но не смог найти его. Я обновлю его, если найду. - person mickeymoon; 02.11.2016
comment
@mickeymoon, можем ли мы активировать расширение службы с помощью локального уведомления? - person Vinu David Jose; 29.12.2016
comment
@DashAndRest Да, это будет работать, если вы установите флаг mutable-content - person mickeymoon; 10.01.2017
comment
Можно ли вызвать метод AppDelegate из расширения службы? - person Dmitry; 01.05.2017
comment
@Foriger Да, вы правы насчет клавиши content-available. С этим тоже работает. Я обновил ответ соответственно. - person mickeymoon; 08.05.2017
comment
@Dmitry Нет, вы не можете вызвать UIApplication и, таким образом, не получить доступ к своему делегату приложения из расширения. - person Jonny; 15.12.2017
comment
@Jonny, могу ли я получить доступ к настройкам пользователя в расширении? И если да, то как, пожалуйста? - person FreedomOfSpeech; 08.09.2018
comment
@mickeymoon, могу ли я получить push-данные с помощью этого метода, если приложение находится в фоновом режиме или удалено из фона? - person Jigar Tarsariya; 12.10.2018
comment
@Jonny Как передать данные из AppDelegate в расширение. У вас есть блог или учебник? Пожалуйста, проверьте мой вопрос здесь: - stackoverflow.com/q/54133966/1635315 - person Kirti Nikam; 10.01.2019
comment
Обратите внимание, что если вы используете облачный обмен сообщениями Firebase, ключ называется mutable_content, а не mutable-content (подчеркивание вместо тире). - person N S; 27.01.2019
comment
@FreedomOfSpeech Вы можете получить доступ к настройкам пользователя, настроив группы приложений для своего приложения и расширения. Вам нужно читать и записывать настройки в настройках группы приложений, а не в настройках по умолчанию. - person mickeymoon; 22.08.2019
comment
Also, if the content-available is set to 1, the service extension will not work. So either don't set it or set it to 0. (Edit: This is not applicable. You can set or unset content-available flag) Это неверно. Вы не можете добавить оба флага content-available и mutable-content, так как это просто не отправит push-уведомление вообще (это то, что произошло со мной). Также проверьте это в OneSignal: documentation.onesignal.com/docs/ - person Nino Bouchedid; 03.09.2020
comment
@NinoBouchedid Понятно, на момент написания это не было ограничением, но я вижу, что в ссылке упоминается проблема. Если вы установите флаг доступности содержимого, уведомление будет отправлено как тихое уведомление, а NSE не будет запущено, но если вы установите текст, NSE будет запущено и уведомление будет показано. Таким образом, content-available нельзя использовать для отправки молчаливого уведомления и запуска NSE, поскольку OneSignal надеялся использовать его для подтверждения доставки. - person mickeymoon; 06.09.2020

Расширение службы уведомлений очень полезно для загрузки контента из данных уведомлений и отображения в уведомлениях, таких как изображения и другой контент. вы также можете использовать расширение службы уведомлений для выполнения некоторого кода, когда приложение находится в фоновом режиме или неактивно (убито).

Здесь приведены пошаговые инструкции по как использовать расширение службы уведомлений. А также вы получили демо с github.

person Bera Bhavin    schedule 24.01.2019