iOS 13ベータ4はもはや与えない
1)PHImageFileURLKey 2)画像結果情報キーのPHImageResultIsDegradedKey。
誰もがPHAssetのfileurlを見つける方法を知っていますか?
1 .PHImageResultIsDegradedKeyが最新のiOS 13で利用可能になりましたGMおよびGM2。1つの問題が解決されました。
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からのみ利用可能
それを探している人のためのObjective-Cコードの例:
PHContentEditingInputRequestOptions *editOptions = [[PHContentEditingInputRequestOptions alloc] init];
[myPHAsset requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
if (contentEditingInput.fullSizeImageURL) {
//do something with contentEditingInput.fullSizeImageURL
}
}];
Xamarin.iOSで同じことを実現しようとしている場合、これは私のC#バージョンのSwiftコード:
phAsset.RequestContentEditingInput(new PHContentEditingInputRequestOptions(), phcontentediting);
その後:
private void phcontentediting(PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo)
{
}
phcontentediting
が呼び出されると、contentEditingInputにはCreationDate
、FullSizeImageUrl
、さらにはLocation
などの多くの有用な情報が含まれます。
let resourse = PHAssetResource.assetResources(for:self.phasset)
let url = resourse.first?.originalFilename
これは私のために働きます!
使用できます
let photoPath = photoAsset.localIdentifier
交換する
let photoPath = info["PHImageFileURLKey"]
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();
});
IOS 13.0では、PHImageFileURLKeyは削除されました。 PHAssetデータにアクセスするために、requestImageDataにこの関数を呼び出すと、このキー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.
}
})
Guhan0の提案により、小さな変更を加えました。実際、時々、1つ以上の「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
}