UNNotificationAttachment устанавливает URL-адрес изображения в каталог Caches

У меня есть механизм кэширования изображений в моем приложении. Мне также нужно показывать локальные уведомления с изображениями. У меня проблема. Когда я пытаюсь установить UNNotificationAttachment с изображением я получаю изображение из своего кэша или, если изображение не существует, я загружаю его и кэширую. Затем я создаю URL-адрес для каталога Caches, но когда я передаю этот URL-адрес в UNNotificationAttachment, я получаю сообщение об ошибке: NSLocalizedDescription=Invalid attachment file URL, Что я делаю не так?

if let diskUrlString = UIImageView.sharedImageCache.diskUrlForImageUrl(imageUrl) {
    if let diskUrl = URL(string: diskUrlString) {
       do {
            res = try UNNotificationAttachment(identifier: imageUrlString, url: diskUrl, options: nil)
        } catch (let error) {
            print("error", error)
            // Invalid attachment file URL
        }
    }
}

func diskUrlForImageUrl(_ imageUrl: URL) -> String? {
    let urlRequest = URLRequest(url: imageUrl)
    return ImageCache.cacheDirectory.appending("/\(ImageCache.imageCacheKeyFromURLRequest(urlRequest))")
}

static fileprivate var cacheDirectory: String = { () -> String in
    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!
    let res = documentsDirectory.appending("/scAvatars")
    let isExist = FileManager.default.fileExists(atPath: res, isDirectory: nil)
    if !isExist {
        try? FileManager.default.createDirectory(atPath: res, withIntermediateDirectories: true, attributes: nil)
    }
    return res
}()

3 ответа

Решение

Я обнаружил, что если я добавлю префикс file:///private в diskUrlString, то URL строится как ожидалось. Но я до сих пор не понял, как создать URL без жесткого кодирования этого префикса. Так что теперь я могу использовать как кеш, так и UNNotificationAttachment!

Проблема здесь в том, что вы используете путь, а не URL. Путь - это строка, например "/var/log/foo.log". URL-адрес семантически более сложен, чем путь. Вам нужен URL, который описывает расположение файла изображения в файловой системе устройства.

Создайте правильно сконструированный URL для файла изображения, и вложение может работать. Вложению также может понадобиться подсказка идентификатора типа, чтобы сообщить iOS, какие данные находятся в файле.

Вам не нужно использовать URL-адреса. Вы можете использовать данные изображения с UNNotificationAttachment.

Вот пример кода.

      let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
            
let imageURL = URL(fileURLWithPath: paths.first!).appendingPathComponent("\(fileName).jpg")
let image = UIImage(contentsOfFile: imageURL.path)
let imageData = image?.pngData()

            
if let unwrappedImageData = imageData, let attachement = try? UNNotificationAttachment(data: unwrappedImageData, options: nil) {
    content.attachments = [attachement]
}
Другие вопросы по тегам