iOS 13 beta4 ne donne plus
1) PHImageFileURLKey 2) PHImageResultIsDegradedKey dans les clés d'informations de résultat d'image.
Quelqu'un sait comment trouver le fileurl du PHAsset?
1 .PHImageResultIsDegradedKey est maintenant disponible dans la dernière version d'iOS 13 GM et GM2. Un problème a donc été résolu.
2 .PHImageFileURLKey ne sera pas disponible dans iOS 13 et si vous avez tellement besoin de fileURL d'un élément d'image et que vous en avez besoin sans aucun rappel de méthodes de PhotoKit, optez pour l'expression régulière dans la description de l'élément. Ça va marcher.
Vous pouvez obtenir le description
d'un objet PHAssetResource en utilisant + [PHAssetResource assetResourcesForAsset:], utilisez le premier objet du tableau résultant, puis extrayez le fileURL
de la chaîne en utilisant l'expression régulière:
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
}
Remarque: uniquement disponible à partir d'iOS9
Un exemple de code Objective-C pour quiconque le recherche:
PHContentEditingInputRequestOptions *editOptions = [[PHContentEditingInputRequestOptions alloc] init];
[myPHAsset requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
if (contentEditingInput.fullSizeImageURL) {
//do something with contentEditingInput.fullSizeImageURL
}
}];
Si quelqu'un cherche à obtenir le même résultat sur Xamarin.iOS, il s'agit de ma version C # du code Swift:
phAsset.RequestContentEditingInput(new PHContentEditingInputRequestOptions(), phcontentediting);
puis:
private void phcontentediting(PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo)
{
}
lorsque phcontentediting
est appelé, contentEditingInput a beaucoup d'informations utiles telles que CreationDate
, FullSizeImageUrl
et même Location
!
let resourse = PHAssetResource.assetResources (pour: self.phasset)
laissez url = resourse.first? .originalFilename
Cela fonctionne pour moi!
Vous pouvez utiliser
let photoPath = photoAsset.localIdentifier
pour remplacer le
let photoPath = info["PHImageFileURLKey"]
Si quelqu'un a besoin de la taille du fichier lors de l'utilisation de RequestContentEditingInput dans Xamarin.
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();
});
Dans iOS 13.0, PHImageFileURLKey est supprimé. Afin d'accéder aux données PHAsset, lorsque nous appelons cette fonction pour requestImageData, nous pouvons obtenir des informations sur l'image via cette clé 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.
}
})
Avec la suggestion de guhan0, j'ai fait un petit changement. En effet, parfois, il y a plus de 1 "fileURL: ...", donc, je prends le premier lorsque la valeur commence par "file: //" ce qui signifie qu'il y a une URL de fichier. Je pense qu'il y a une meilleure solution, mais pour l'instant, cela fonctionne bien:
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
}