Я написал средство выбора изображений ( NOT UIImagePickerController
) в Swift, после нажатия «Готово» я возвращаю URL-адреса выбранных PHAssets (изображения или видео или оба), а затем загружаю их в Firebaseхранилище.
URL-адрес изображения выглядит следующим образом: file:///var/mobile/Media/DCIM/101APPLE/IMG_1239.PNG
URL-адрес видео выглядит следующим образом: file:///var/mobile/Media/DCIM/101APPLE/IMG_1227.MOV
Затем я отображаю PHAsset.Не было проблем с воспроизведением видео актива:
let player = AVPlayer(url: url)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.frame
playerLayer.videoGravity = .resizeAspectFill
view.layer.addSublayer(playerLayer)
player.play()
Но когда я пытаюсь отобразить изображение, используя его URL, я получаю сообщение об ошибке «нет разрешения на чтение файла»:
do {
let data = try Data(contentsOf: url)
imageView.image = UIImage(data: data)
} catch {
print(error)
}
У меня есть разрешение на доступ к библиотеке фотографий пользователя, поэтому средство выбора изображений работает нормально.Я просто не могу читать файлы изображений, используя их URL-адреса.
Я думаю, может быть, мне следует скопировать ресурсы изображения во временный файл и прочитать его оттуда, но это не имеет никакого смысла, почему видеоресурс доступен для чтения, но не актив изображения.
-------------- ОБНОВЛЕНИЕ --------------
Вот так я получаю URL-адреса PHAsset
extension PHAsset {
func getURL(completionHandler : @escaping ((_ responseURL : URL?) -> Void)) {
if self.mediaType == .image {
let options = PHContentEditingInputRequestOptions()
options.canHandleAdjustmentData = { (adjustmeta: PHAdjustmentData) -> Bool in
return true
}
self.requestContentEditingInput(with: options, completionHandler: { (contentEditingInput: PHContentEditingInput?, info: [AnyHashable : Any]) in
completionHandler(contentEditingInput!.fullSizeImageURL as URL?)
})
} else if self.mediaType == .video {
let options = PHVideoRequestOptions()
options.version = .original
PHImageManager.default().requestAVAsset(forVideo: self, options: options, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [AnyHashable : Any]?) in
if let urlAsset = asset as? AVURLAsset {
let localVideoUrl: URL = urlAsset.url as URL
completionHandler(localVideoUrl)
} else {
completionHandler(nil)
}
})
}
}
}