如何从使用库或相机拍摄的 UIImagePickerControllerPHAsset 获取图像名称?
Posted
技术标签:
【中文标题】如何从使用库或相机拍摄的 UIImagePickerControllerPHAsset 获取图像名称?【英文标题】:How to get image name from UIImagePickerControllerPHAsset taken with library or camera? 【发布时间】:2017-10-26 10:13:06 【问题描述】:我想从 ios 11.0.3 中的 UIImagePickerControllerPHAsset 获取文件名。无法使用此代码获取选取的图像文件名。请帮忙?
if #available(iOS 11.0, *)
let asset = info[UIImagePickerControllerPHAsset] as? PHAsset
fileName = ((asset?.value(forKey: "filename")) as? String)!
else
// Fallback on earlier versions
let url = info[UIImagePickerControllerReferenceURL] as! URL
let assets = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil)
fileName = PHAssetResource.assetResources(for: assets.firstObject!).first!.originalFilename
在 fileName = ((asset?.value(forKey: "filename")) as?String) 上发生崩溃!
【问题讨论】:
【参考方案1】:Apple 似乎没有将新的 iOS 11 密钥添加到信息字典中。因此,iOS 11 代码将无法正常工作,因为它一直返回 nil。看这个开雷达http://www.openradar.me/34404703
到目前为止,我发现的唯一解决方案是即使在 iOS 11 中也使用 iOS 10 代码块,而忽略 UIImagePickerControllerReferenceURL
deprecated 消息(密钥仍然存在并且在 iOS 11 中有效)
希望对你有帮助
【讨论】:
如果您有权从库中读取照片(请参阅phphotoLibrary
),则此键的值应为非空。
它是nil,因为你没有获得权限所以首先,你需要检查PHPhotoLibrary.authorizationStatus(),如果应用程序有权限,它将返回值。【参考方案2】:
你可以试试这个……
if #available(iOS 11.0, *)
let asset = info[UIImagePickerControllerPHAsset] as! PHAsset
var resources = PHAssetResource.assetResources(for: asset)
var orgFilename = (resources[0]).originalFilename
print("File Name: ",orgFilename)
【讨论】:
'UIImagePickerControllerPHAsset' 已重命名为 'UIImagePickerController.InfoKey.phAsset'【参考方案3】:如果您有权访问用户的照片库,您将能够实际从UIImagePickerController
获得PHAsset
值。 UIImagePickerController
似乎不会代表您请求权限,因此您需要自己执行此操作。
请参阅Determine if the access to photo library is set or not - PHPhotoLibrary,了解有关如何检查和请求权限的相关讨论。
【讨论】:
嘿,谢谢。我今晚去看看:)以上是关于如何从使用库或相机拍摄的 UIImagePickerControllerPHAsset 获取图像名称?的主要内容,如果未能解决你的问题,请参考以下文章