UNNotificationServiceExtension не может обновлять уведомления время от времени
У меня есть UNNotificationServiceExtension
написано в Swift. Все это делает:
- Установить заголовок уведомления
- Установить тело уведомления
- Загрузить изображение и позвонить
contentHandler ()
Вот краткая версия того, что я делаю:
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
self.bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent
bestAttemptContent!.title = GetNotificationTitle(userInfo)
bestAttemptContent!.body = GetNotificationBody(userInfo)
if let imageUrl = <get image url> {
let imageLoaderTask = URLSession.shared.dataTask(with: URL.init(string: imageUrl)!) { (newsImageData, newsImageUrl, newsImageError) -> Void in
if newsImageError == nil && newsImageData != nil {
let documentDirectory = self.GetDocumentDirectory()
if documentDirectory != nil {
let newsFileURL = documentDirectory?.appendingPathComponent("news_image").appendingPathExtension("png")
do {
try newsImageData?.write(to: newsFileURL!)
let attachment = try UNNotificationAttachment(identifier: "newsImage",
url: newsFileURL!,
options: nil)
self.bestAttemptContent?.attachments = [ attachment, ]
self.contentHandler!(self.bestAttemptContent!)
return
} catch {}
}
}
self.contentHandler!(self.bestAttemptContent!)
}
imageLoaderTask.resume()
} else {
self.contentHandler!(self.bestAttemptContent!)
}
}
В 95% случаев - работает просто отлично. Тем не менее, иногда уведомление приходит без каких-либо изменений (т. Е. Заголовок, текст остался прежним, изображение не было прикреплено).
Я знаю это:
- Это не тайм-аут
serviceExtensionTimeWillExpire
не называется - Это не похоже
UNNotificationServiceExtension
вылетает: я добавил многоNSLog()
звонки для проверки журналов устройства -self.contentHandler!(self.bestAttemptContent!)
пожары - Это происходит чаще на моем iPhone, чем на iPad
- Я не нашел ни единой подсказки в журналах устройств относительно этой проблемы.
Кто-нибудь сталкивался с этой проблемой? Есть обходные пути? Мысли?
1 ответ
Я построил UNNotificationServiceExtension
когда функция была впервые объявлена. Две идеи:
Основной
URLSession
задача данных не может получить удаленный носитель из-за системной проблемы. Возьмите sysdiagnose и найдите ошибки в libnetwork.dylib.Расширение службы - это отдельный отдельный двоичный файл и процесс. Возможно, система не запустила процесс или не смогла открыть связь между процессом приложения и расширением службы. Я также проверил бы sysdaignose для всего, что говорит порт Маха процесса
nil
,