PHImageResultIsDegradedKey/PHImageFileURLKey 未找到

PHImageResultIsDegradedKey/PHImageFileURLKey is not found

iOS 13 beta4 不再提供

1) PHImageFileURLKey 2) 图像结果信息键中的 PHImageResultIsDegradedKey。

有人知道找到 PHAsset 文件 url 的方法吗?

您必须从 PHAsset 对象使用此函数:

- (PHContentEditingInputRequestID)requestContentEditingInputWithOptions:(nullable PHContentEditingInputRequestOptions *)options completionHandler:(void (^)(PHContentEditingInput *__nullable contentEditingInput, NSDictionary *info))completionHandler;

然后你可以这样检索URL:

NSURL *url = contentEditingInput.fullSizeImageURL;

一些示例 Objective-C 代码供其他人查找:

PHContentEditingInputRequestOptions *editOptions = [[PHContentEditingInputRequestOptions alloc] init];

[myPHAsset requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {

    if (contentEditingInput.fullSizeImageURL) {
        //do something with contentEditingInput.fullSizeImageURL
    }

}];

1.PHImageResultIsDegradedKey 现在可用于最新的 iOS 13 GM 和 GM2。所以一个问题解决了。

2.PHImageFileURLKey 将在 iOS 13 中不可用,如果您非常需要图像资产的 fileURL 并且您需要它而没有任何 PhotoKit 的方法回调用于资产描述中的正则表达式。它会起作用。

您可以使用 +[PHAssetResource assetResourcesForAsset:] 获取 PHAssetResource 对象的 description ,使用结果数组中的第一个对象,然后提取 fileURL 来自使用正则表达式的字符串:

public static func getFileURLFromPHAssetResourceDescription(description: String) -> String? {
    let regex = try! NSRegularExpression(pattern: "(?<=fileURL: ).*(?=\s)")
    if let result = regex.firstMatch(in: description, options: [], range: NSRange(location: 0, length: description.count)) {
        let url = String(description[Range(result.range, in: description)!])
        return url
    }
    return nil
}

注意:仅从 iOS9

在guhan0的建议下,我做了一个小小的改动。确实,有时候,有多个"fileURL:...",所以,当值以"file://"开头时,我取第一个,这意味着有一个文件url。我认为有更好的解决方案,但目前效果还不错:

private func getFileURLFromPHAssetResource(resourceDescription description: String) -> String? {

        let regex = try! NSRegularExpression(pattern: "(?<=fileURL: ).*(?=\s)")

        for match in regex.matches(in: description, options: [], range: NSRange(location: 0, length: description.count)).lazy {

            let url = String(description[Range(match.range, in: description)!])

            if url.starts(with: "file://") { return url }
        }

        return nil
    }

在 iOS 13.0 中,删除了 PHImageFileURLKey。为了访问 PHAsset 数据,当我们调用这个函数来请求图像数据时,我们可以通过这个键 PHImageFileUTIKey.

来获取图像信息
PHImageManager.default().requestImageData(for: asset, options: PHImageRequestOptions(), resultHandler:{ [weak self] (imagedata, dataUTI, orientation, info) in

if let assetInfo = info, let fileURLKey = assetInfo["PHImageFileUTIKey"] as? NSString {
let fileComp = fileURLKey.components(separatedBy: ".")

if fileComp.count > 0 {
   // Do your stuff.
}

})

如果有人希望在 Xamarin.iOS 上实现相同的功能,这是我的 swift 代码的 C# 版本:

phAsset.RequestContentEditingInput(new PHContentEditingInputRequestOptions(), phcontentediting);

然后:

private void phcontentediting(PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo)
        {

        }

调用phcontentediting时,contentEditingInput有很多有用的信息,比如CreationDateFullSizeImageUrl甚至Location!

让资源 = PHAssetResource.assetResources(用于:self.phasset)

让url = resourse.first?.originalFilename

这对我有用!

如果有人在 Xamarin 中使用 RequestContentEditingInput 时需要文件大小。

var options = new PHContentEditingInputRequestOptions();
asset.RequestContentEditingInput(options, (PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo) =>
{
    var imageUrl = contentEditingInput.FullSizeImageUrl.ToString();

    NSObject fileSizeObj;
    if (contentEditingInput.FullSizeImageUrl.TryGetResource(new NSString("NSURLFileSizeKey"), out fileSizeObj))
    {
        var fileSizeNSNum = fileSizeObj as NSNumber;
        long fileSize = fileSizeNSNum.Int64Value;
    }

    // Make sure to dispose or your app will crash with a lot of photos!
    contentEditingInput.Dispose();

});

您可以使用

let photoPath = photoAsset.localIdentifier

替换

let photoPath = info["PHImageFileURLKey"]