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]
}