UIImagePickerControllerDelegate从iOS 11中的拾取图像中获取日期

以前的解决方案已被弃用 – 不要下注或标记为重复

UIImagePickerControllerReferenceURL在iOS 11中已被弃用(即使它仍然在info字典中返回)并且应该被替换为UIImagePickerControllerPHAsset ,但我还没有得到包含该密钥的info字典。 由于一个被弃用而另一个被丢失,是否有一个已知的解决方案用于从拾取的图像中提取“采取日期”?

作为参考,这是从库中挑选图像时返回的示例info字典:

 ▿ 4 elements ▿ 0 : 2 elements - key : "UIImagePickerControllerImageURL" - value : file:///private/var/mobile/Containers/Data/Application/EE1BA60E-2DC3-47C5-A58D-86498E95C323/tmp/3A025D4C-B378-474B-8A09-017479A3A776.jpeg ▿ 1 : 2 elements - key : "UIImagePickerControllerMediaType" - value : public.image ▿ 2 : 2 elements - key : "UIImagePickerControllerReferenceURL" - value : assets-library://asset/asset.HEIC?id=537976CD-A550-41C9-9416-92C8072112D7&ext=HEIC ▿ 3 : 2 elements - key : "UIImagePickerControllerOriginalImage" - value :  size {3024, 4032} orientation 3 scale 1.000000 

(请注意, UIImagePickerControllerReferenceURL仍然存在,但已弃用,并且缺少建议的替换UIImagePickerControllerPHAsset 。)

如果它存在 ,获取日期将很简单:

 if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset, let resource = PHAssetResource.assetResources(for: asset).first { let dateTaken = resource.creationDate } 

可能是Apple忘了实现UIImagePickerControllerPHAsset吗? 关于变通方法的任何想法(不使用弃用的方法)?

您可以通过ImageIO框架检查所选照片的​​元数据来获取日期。

然而,PHAsset信息未到达的说法仅仅是虚假的。 它到达就好了。 你没有显示你的代码,所以谁知道你在做什么? 也许问题是你忘了获得用户授权? 如果没有用户授权,您当然无法访问PHAsset。 您将获得UIImagePickerControllerOriginalImage和UIImagePickerControllerImageURL,这就是全部。

这段代码对我来说很好(假设我们在使用图像选择器控制器之前有必要的用户授权):

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { // let asset = info[UIImagePickerControllerPHAsset] as? PHAsset let url = info[UIImagePickerControllerMediaURL] as? URL var im = info[UIImagePickerControllerOriginalImage] as? UIImage if let ed = info[UIImagePickerControllerEditedImage] as? UIImage { im = ed } let live = info[UIImagePickerControllerLivePhoto] as? PHLivePhoto let imurl = info[UIImagePickerControllerImageURL] as? URL self.dismiss(animated:true) { if let style = asset?.playbackStyle { // and so on, works fine // .... } } } 

Swift 4.1

我也挣扎了一段时间。 事实certificate,您只需要用户访问照片库的权限 – 然后info将包含密钥UIImagePickerControllerPHAsset的值。 您可以检查并请求访问,如下所示:

 let status = PHPhotoLibrary.authorizationStatus() switch status { case .authorized: // show your media picker case .denied: // probably alert the user that they need to grant photo access case .notDetermined: PHPhotoLibrary.requestAuthorization({status in if status == .authorized { // show your media picker } }) case .restricted: // probably alert the user that photo access is restricted } 

然后像往常一样使用imagePickerController(_: didFinishPickingMediaWithInfo:)方法,并可以访问UIImagePickerControllerPHAsset