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

Cla*_*lis 6 uiimagepickercontroller ios swift

以前的解决方案已弃用- 不要投票或将其标记为重复

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 : <UIImage: 0x1d04b4760> size {3024, 4032} orientation 3 scale 1.000000
Run Code Online (Sandbox Code Playgroud)

(请注意UIImagePickerControllerReferenceURL,尽管已弃用,但仍然存在,并且建议的替换UIImagePickerControllerPHAsset丢失了。)

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

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

苹果会忘记实施UIImagePickerControllerPHAsset吗?有任何解决方法的想法(不使用不推荐使用的方法)吗?

mat*_*att 3

您可以通过 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
            // ....
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,当我运行代码时,PHAsset _is_ 就会出现。这只是事实。您可以看到我在显示的最后一行中获取了它的“playbackStyle”。您可以下载示例项目并自行运行。 (2认同)