PhotoKit iOS8 - 使用“PHImageFileURLKey”检索图像

时间:2014-11-21 16:13:39

标签: ios ios8 xamarin photokit

无论如何,我可以使用从"PHImageFileURLKey"返回的路径进入照片库并检索图像吗?

返回的路径采用以下格式:

"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG"

我的计划是将此路径存储在数据库中,并在需要将其恢复时使用它来获取图像。

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:8)

我认为您从URL检索Photo Kit资产的解决方案是错误的。

以下是我要做的事情(假设您有权访问PHAsset):

存储localIdentifier:

PHAsset *asset = /*Your asset */
NSString *localIdentifier = asset.localIdentifier;

//Now save this local identifier, or an array of them

当需要检索它们时,您只需执行以下操作:

PHFetchResult *savedAssets = [PHAsset fetchAssetsWithLocalIdentifiers:savedLocalIdentifiers options:nil];
[savedAssets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
    //this gets called for every asset from its localIdentifier you saved
}];

如果您只能访问“PHImageFileURLKey”,请忽略此答案。

答案 1 :(得分:2)

这是没有记录的,因此我强烈建议不要将该网址用于原型应用以外的任何其他内容。也就是说,这确实有效:

dispatch_queue_t queue = dispatch_queue_create("photoLoadQueue", 0);
dispatch_async(queue, ^{
    NSURL *privateUrl = [NSURL URLWithString:@"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG";
    NSData *imageData = [NSData dataWithContentsOfURL:privateUrl];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image = [UIImage imageWithData:imageData];
    });
});

当然,您需要将用于启动网址的字符串替换为对您的手机有效的字符串。

这样做可能存在很多问题 - 它不是如何使用框架的。这里有一些我的头脑:

  1. 在模拟器中运行时,根路径会在应用程序的启动之间定期更改,因此如果您存储这样的absoluteUrls,您的数据库将很快充满死URL。至少可以说这是不方便的。
  2. 更糟糕的是,图片的网址可能会在真实设备上发生变化 - 您无法控制它,并且一旦他们更改了应用程序的错误就会让用户重新选择它们或者其他什么。
  3. 您永远不会知道照片来自PHAsset的更改。
  4. 这可能会绕过用户对照片访问的权限 - 如果您的应用访问照片的权限被撤销,会发生什么?然而,这可能是存储照片供以后使用的许多方法的问题。
  5. 您无法控制文件 - 如果用户将其删除,该怎么办?
  6. 如果我是你,我会使用PHImageManager requestImageForAsset: targetSize: contentMode: options: resultHandler:从照片框架中正确检索图像,然后将其存储在应用程序目录中的文件中,以合理的分辨率为您提供任何帮助&#39用它来做这仍然无法为您提供资产变更,但这是一个非常好的解决方案。

    如果您想自己存储资产并且只在实际需要时请求图片,那么可能值得调查transient asset collections,虽然我没有使用它们,所以可能不适用于您需要。