Изображение из вложения из локального уведомления не отображается в 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()
            }
        }
    }
}

Как учебник, я следил за видео с расширенными уведомлениями из 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].

Или используя следующее:

  • objective-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 читает только заголовок изображения.