Не вызывается didRecieve UNNotificationServiceExtension

Я шаг за шагом продвигался к обогащению push-уведомлений. Они здесь :

  1. Создано расширение службы уведомлений с 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()
            }
        }
    }
  1. Настроен AppId и профиль подготовки для расширения.

Богатые уведомления приходят правильно:

введите здесь описание изображения

Но вот проблемы, с которыми я столкнулся:

  1. didRecieve не вызывается. Для этого я прикрепил процесс serviceExtension к цели приложения и запустил приложение.
    Примечание: расширение вызывается, как только приходит уведомление, но didRecieve не вызывается:

введите здесь описание изображения

  1. При открытии push-уведомления (к которому прикреплено видео) ничего не происходит. В идеале оно должно воспроизводиться.
  2. Если мне нужно открыть видео и воспроизвести его, нужно ли мне что-то делать явно, или расширение позаботится об этом?

Полезная нагрузка:

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)


person Nitish    schedule 07.08.2018    source источник


Ответы (1)


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

Отладка расширений уведомлений не похожа на отладку приложения. Расширения - это плагины для процесса iOS вне вашего приложения. Простая установка точки останова - ненадежный способ их отладки. Вместо:

Отладка расширения службы уведомлений

  1. Запустите приложение из Xcode или устройства
  2. В Xcode выберите Присоединить к процессу или PID по имени ... в меню Отладка  Меню отладки Xcode, прикрепить к процессу или PID по имени ... < / а>
  3. Введите имя своего расширения для уведомлений  Меню отладки Xcode, введите имя процесса
  4. Вызвать уведомление (отправив push и т. Д.).

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

Отладка расширения содержания уведомлений Существует как минимум два способа. Шаги, показанные выше для расширения службы, также работают для расширения содержимого. Второй способ более привычен, но менее надежен.

  1. Выберите схему расширения в Xcode с помощью панели инструментов  Панель инструментов схемы Xcode
  2. В меню продукта выберите Изменить схему ...  Схема редактирования Xcode ..
  3. Задайте Исполняемый родительскому приложению. Xcode Set Executable
  4. Установите точку останова внутри расширения содержимого.
  5. Теперь соберите и запустите ваше расширение. Он запустит родительское приложение.
  6. Запустить уведомление, которое приведет к загрузке расширения содержимого.

Стоит отметить, что добавление ведения журнала с использованием инфраструктуры ведения журнала может быть очень полезно для отладки и устранения неполадок.

Почему видео не воспроизводится

iOS ограничивает размер контента, который может быть представлен в уведомлениях. Это описано в документации для UNNotificationAttachment. Для видео это обычно 50Мб. Убедитесь, что ваше видео настолько мало, насколько вы можете сделать его в байтах, и, конечно, предоставьте видео, размер которого соответствует устройству, на котором оно будет воспроизводиться. Не пытайтесь воспроизвести видео 1080p в уведомлении шириной 400 точек!

На практике почти всегда лучше использовать HLS вместо загрузки видео и представлять его в расширении содержимого.

Еще одна вещь в вашем коде, которая может быть проблематичной, - это идентификаторы, которые вы назначаете своим вложениям. Идентификаторы должны быть уникальными. Обычно это будет строка нотации обратного домена, такая как идентификатор вашего пакета, за которой следует строка UUID. Вы также можете использовать исходный URL-адрес содержимого, за которым следует строка UUID. Если вы укажете пустую строку, iOS создаст для вас уникальный идентификатор. С инфраструктурой пользовательских уведомлений, имеющей неуникальные идентификаторы (для уведомлений, вложений и т. Д.), Как правило, возникают трудности с отслеживанием проблем внутри структуры. Например, это может привести к сбою подключенного устройства watchOS.

Если вы хотите реализовать «автовоспроизведение» для своего видео - из вашего вопроса неясно, это ли вы описываете - вам нужно будет реализовать свои собственные функции проигрывателя в расширении содержимого.

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

person quellish    schedule 10.08.2018
comment
Спасибо за отличное объяснение. На самом деле это была моя глупость. Все работало нормально. Я не долго нажимал на уведомление, открывающее видео. Действительно глупо с моей стороны, верно: D Но я делал все шаги, как вы упомянули. - person Nitish; 10.08.2018
comment
Что делать, если расширение никогда не запускается? Я отправляю изменяемый контент: 1, и у него есть предупреждение, например, в документации по Apple разработчик. apple.com/documentation/usernotifications/, но когда я пытаюсь прикрепить, я вижу только сообщение PushService Waiting to attach Я знаю, что уведомление поступает на устройство, так как я переключаю счетчик значков и вижу, что получать обновления на устройстве ... - person Dave; 04.06.2020