Изображение из вложения из локального уведомления не отображается в UNNotificationContentExtension
Я работал над богатым опытом уведомлений, который был представлен в iOS10, и придерживался передачи изображений в виде приложений к UNNotificationContentExtension
,
Вот мой ContentExtension:
class NotificationViewController: UIViewController, UNNotificationContentExtension {
@IBOutlet weak var attachmentImage: UIImageView!
func didReceive(_ notification: UNNotification) {
if let attachment = notification.request.content.attachments.first {
if attachment.url.startAccessingSecurityScopedResource() {
attachmentImage.image = UIImage(contentsOfFile: attachment.url.path)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
}
В качестве учебного пособия я следил за видео Advanced Notification от WWDC. Я проверил - UIImage
Я назначаю UIImageView:
- не
nil
- имеет надлежащее
CGSize
(191x191) - attachment.url.path равно
/var/mobile/Library/SpringBoard/PushStore/Attachments/<bundle of app>/<...>.png
Вот как я отправляю локальное уведомление из приложения:
let content = UNMutableNotificationContent()
content.title = "Sample title"
content.body = "Sample body"
content.categoryIdentifier = "myNotificationCategory"
let attachement = try! UNNotificationAttachment(identifier: "image",
url: Bundle.main.url(forResource: "cat", withExtension: "png")!,
options: nil)
content.attachments = [ attachement ]
let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: nil)
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().add(request){(error) in
if (error != nil){
}
}
"cat.png" - это просто фиктивный ресурс, который я добавил в proj.
Как видите, уведомление показывает картинку, поэтому я предполагаю, что отправляю ее правильно, но в развернутом состоянии (в NotificationViewController
Мне никогда не удавалось показать одно и то же изображение.
Что я делаю неправильно? Спасибо!
1 ответ
Когда вы создаете UIImage с contentsOfFile
объект UIImage считывает только заголовок изображения, который указывает основную информацию, такую как размер изображения и т. д.
Итак, попробуйте двигаться stopAccessingSecurityScopedResource
в [NotificationViewController dealloc]
,
Или используя следующее:
кодцели-c:
NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; UIImage *image = [UIImage imageWithData:imageData];
быстрый код:
let imageData = NSData(contentsOf: attachment.url) let image = UIImage(data: imageData! as Data)
Нет документов о том, что contentsOfFile
только читает заголовок изображения. Но когда я запускаю код следующий:
NSString *docFolderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *pngPath = [docFolderPath stringByAppendingPathComponent:@"test.png"];
UIImage *image = [UIImage imageWithContentsOfFile:pngPath];
[[NSFileManager defaultManager] removeItemAtPath:pngPath error:nil];
imageView.image = image;
Произошла ошибка:
ImageIO: createDataWithMappedFile:1322: 'open' failed '/Users/fanjie/Library/Developer/CoreSimulator/Devices/FFDFCA06-A75E-4B54-9FC2-8E2AAE3B1405/data/Containers/Data/Application/E2D26210-4A53-424E-9FE8-D522CFD4FD9E/Documents/test.png'
error = 2 (No such file or directory)
Поэтому я делаю вывод, что UIImage contentsOfFile
только читает заголовок изображения.
Благодаря @jeffery,
Вот точный код изображения, показанного в расширении уведомления:
if let attachment = notification.request.content.attachments.first {
if attachment.url.startAccessingSecurityScopedResource() {
let data = NSData(contentsOfFile: attachment.url.path);
self. attachmentImage?.image = UIImage(data: data! as Data);
attachment.url.stopAccessingSecurityScopedResource()
}
}