UNNotificationServiceExtension's didRecieve не вызывается
Я пошёл шаг за шагом, чтобы получить богатые push-уведомления. Вот они:
- Создано расширение службы уведомлений с plist:
NotificationService didRecieve:
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
func failEarly() {
contentHandler(request.content)
}
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
// Get the custom data from the notification payload
if let data = request.content.userInfo as? [String: AnyObject] {
// Grab the attachment
// let notificationData = data["data"] as? [String: String]
if let urlString = data["attachment-url"], let fileUrl = URL(string: urlString as! String) {
// Download the attachment
URLSession.shared.downloadTask(with: fileUrl) { (location, response, error) in
if let location = location {
// Move temporary file to remove .tmp extension
let tmpDirectory = NSTemporaryDirectory()
let tmpFile = "file://".appending(tmpDirectory).appending(fileUrl.lastPathComponent)
let tmpUrl = URL(string: tmpFile)!
try! FileManager.default.moveItem(at: location, to: tmpUrl)
// Add the attachment to the notification content
if let attachment = try? UNNotificationAttachment(identifier: "video", url: tmpUrl, options:nil) {
self.bestAttemptContent?.attachments = [attachment]
}else if let attachment = try? UNNotificationAttachment(identifier: "image", url: tmpUrl, options:nil) {
self.bestAttemptContent?.attachments = [attachment]
}else if let attachment = try? UNNotificationAttachment(identifier: "audio", url: tmpUrl, options:nil) {
self.bestAttemptContent?.attachments = [attachment]
}else if let attachment = try? UNNotificationAttachment(identifier: "image.gif", url: tmpUrl, options: nil) {
self.bestAttemptContent?.attachments = [attachment]
}
}
// Serve the notification content
self.contentHandler!(self.bestAttemptContent!)
}.resume()
}
}
}
- Настроил AppId и профиль предоставления для расширения.
Богатое уведомление приходит правильно:
Но вот проблемы, с которыми я сталкиваюсь:
- didRecieve не вызывается. Для этого я прикрепил процесс serviceExtension к цели приложения и запустил приложение.
Примечание: расширение вызывается, как только приходит уведомление, но didRecieve не вызывается:
- При открытии push-уведомления (к которому есть видео-вложение) ничего не происходит. В идеале это должно быть сыграно.
- Если мне нужно открыть видео и воспроизвести его, нужно ли что-то явно делать, или расширение позаботится об этом?
Полезная нагрузка:
aps = {
alert = "This is what your message will look like! Type in your message in the text area and get a preview right here";
badge = 1;
"mutable-content" = 1;
sound = default;
};
"attachment-url" = "https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4";
deeplinkurl = "";
"message_id" = 1609;
}
Я попытался просмотреть следующие посты, но это не помогло:
iOS10 UNNotificationServiceExtension не вызывается
NotificationServiceExtension не вызывается
UNNotificationServiceExtension не работает на iPhone 5 (iOS 10)
1 ответ
Хорошие новости! Расширение вашего сервиса действительно вызывается - изображение в вашем уведомлении является доказательством этого. Вероятно, здесь происходит то, что вы не можете отладить расширение, используя рабочий процесс, к которому вы привыкли в приложениях.
Отладка расширений уведомлений не похожа на отладку приложения. Расширения являются подключаемыми модулями для процесса iOS вне вашего приложения. Просто установка точки останова не является надежным способом их устранения. Вместо:
Отладка расширения службы уведомлений
- Запустите приложение из Xcode или устройства
- В XCode выберите Прикрепить к процессу или PID по имени... из меню отладки
- Введите имя вашего расширения уведомления
- Запустить уведомление (отправив push и т. Д.).
Когда уведомление доставлено, расширение службы должно запускаться в отладчике. Расширения службы относятся только к удаленным (push) уведомлениям, поэтому вам потребуется устройство для их устранения.
Отладка расширения содержимого уведомлений Существует как минимум два способа. Шаги, показанные выше для расширения сервиса, также работают для расширения контента. Второй метод более знаком, но менее надежен.
- Выберите схему расширения в Xcode, используя панель инструментов
- В меню "Продукт" выберите " Редактировать схему"...
- Установите исполняемый файл для родительского приложения.
- Установите точку останова внутри расширения содержимого.
- Теперь соберите и запустите ваше расширение. Это запустит родительское приложение.
- Запустите уведомление, которое приведет к загрузке расширения контента.
Стоит отметить, что добавление журналов с использованием инфраструктуры журналов может быть очень полезным для отладки и устранения неполадок.
Почему видео не воспроизводится
iOS ограничивает размер контента, который может быть представлен в уведомлениях. Это описано в документации для UNNotificationAttachment. Для видео это вообще 50Мб. Убедитесь, что ваше видео настолько маленькое, насколько вы можете сделать это в байтах, и, конечно, предоставьте видео соответствующего размера для устройства, на котором оно будет воспроизводиться. Не пытайтесь воспроизводить видео 1080p в уведомлении шириной 400 точек!
На практике почти всегда лучше использовать HLS вместо загрузки видео и представлять его в расширении контента.
Другая вещь в вашем коде, которая может быть проблематичной, это идентификаторы, которые вы назначаете своим вложениям. Идентификаторы должны быть уникальными. Обычно это строка записи обратного домена, такая как идентификатор вашего пакета, за которой следует строка UUID. Вы также можете использовать исходный URL-адрес содержимого, за которым следует строка UUID. Если вы предоставите пустую строку, iOS создаст для вас уникальный идентификатор. С платформой пользовательских уведомлений, имеющей неуникальные идентификаторы (для уведомлений, вложений и т. Д.), Как правило, возникает сложность для отслеживания проблем внутри платформы. Например, это может вызвать сбой подключенного устройства watchOS.
Если вы хотите внедрить "автоматическое воспроизведение" для своего видео - из вашего вопроса не ясно, что именно вы описываете - вам нужно будет реализовать собственную функциональность проигрывателя в расширении контента.
Если вы собираетесь это сделать, опять же, HLS является предпочтительным способом отображения видео в уведомлении. Обычно он использует меньше оперативной памяти, предлагает лучший пользовательский интерфейс и имеет тенденцию быть более стабильным.