Позвольте мне сделать это шаг за шагом.
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