ios中的应用程序以沙盒模式运行,这样可以防止它访问自己范围之外的文件。
URL,例如:
文件:///var/mobile/media/dcim/101apple/…
不在应用程序的作用域内,因此无法通过
Data(contentsOf:)
。
AVPlayer
但是,可以从外面进入
url
因为它有特殊的权限,所以你可以使用
网址
.
从
网址
,我们会用这个
网址
在内部
PHAssets.fetchAssets(withALAssetURLs:options:)
为了找回
PHAsset
为了加载它,但在ios 11中该方法已被弃用。
作为另一种选择,
PHAssets.fetchAssets(withLocalIdentifiers:options:)
是可用的,但是为了使用它,您需要提供一个
localIdentifier
.
为了这个,而不是保存
网址
,您应该保存
相位集
S
定位识别器
S.
总结:
-
把你的
相位集
S
-
保存
asset.localIdentifier
而不是他们的
网址
S
-
必要时,返回
相位集
使用
[1]
:
PHAssets.fetchAssets(withLocalIdentifiers:options:)
-
处理
相位集
据它所说
mediaType
一般示例:
警告:
fatalError()
如果您的设置有问题,则用于故意终止应用程序。
如果它崩溃了,检查你的
Info.plist
对于
NSPhotoLibraryUsageDescription
和/或照片库的权限状态,通过
PHPhotoLibrary.requestAuthorization(_:)
-
获取最新资产的演示功能(图像/视频;由您决定)
func getLatestAsset(for type: PHAssetMediaType) {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate",
ascending: false)]
fetchOptions.fetchLimit = 2
let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: type,
options: fetchOptions)
guard let asset = fetchResult.firstObject else { fatalError("Unable to fetch photos") }
//save `localIdentifier` for later use (app relaunch or whatever)
let assetIdentifier = asset.localIdentifier
print(assetIdentifier)
//Just a demo that you can get the same asset based on a local identifier
loadAsset(identifier: assetIdentifier)
}
-
基于
定位识别器
func loadAsset(identifier: String) {
guard let asset = PHAsset.fetchAssets(withLocalIdentifiers: [identifier],
options: nil).firstObject
else {
fatalError("No Asset found with identifier: \(identifier)")
}
print(asset.localIdentifier)
//Do something with the asset now
if asset.mediaType == .image {
loadImage(asset: asset)
}
else if asset.mediaType == .video {
loadVideo(asset: asset)
}
}
-
从加载图像
相位集
func loadImage(asset: PHAsset) {
PHImageManager().requestImageData(for: asset, options: nil) { (data, string, orientation, userInfo) in
guard let data = data else { fatalError("Image Data is nil") }
DispatchQueue.main.async {
self.imageView.image = UIImage(data: data)
}
}
}
-
从加载视频
相位集
func loadVideo(asset: PHAsset) {
PHImageManager().requestAVAsset(forVideo: asset, options: nil) { (avAsset, audioMix, userInfo) in
guard let avAsset = avAsset else { fatalError("AVAsset is nil") }
let playerItem = AVPlayerItem(asset: avAsset)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.frame
playerLayer.videoGravity = .resizeAspectFill
DispatchQueue.main.async {
self.view.layer.addSublayer(playerLayer)
player.play()
}
}
}
附言:你将不再需要
getURL(completionHandler:)
因为你的整个逻辑将基于
定位识别器
而不是
网址
我会说那更好。
Url
只是,有点,变化无常,所以让我们至少在这里避开他们。