Vous pouvez le faire sournoisement † en utilisant la propriété undocumentedPHAsset.ALAssetURL
, mais je cherche quelque chose de documenté.
† En Objective-C, cela aidera
@interface PHAsset (Sneaky)
@property (nonatomic, readonly) NSURL *ALAssetURL;
@end
Créez l'URL d'asset en utilisant l'identificateur local de la PHAsset
. Exemple: PHAsset.localidentifier
renvoie 91B1C271-C617-49CE-A074-E391BA7F843F/L0/001
Maintenant, prenez les 32 premiers caractères pour construire le assetURL, comme:
assets-library://asset/asset.JPG?id=91B1C271-C617-49CE-A074-E391BA7F843F&ext=JPG
Vous pouvez changer l'extension JPG
en fonction de l'UTI de l'actif (requestImageDataForAsset
renvoie l'UTI), mais dans mes tests, les extensions de l'assetLL semblent de toute façon être ignorées.
Je voulais aussi pouvoir obtenir une URL pour un actif. Cependant, j'ai réalisé que la localIdentifier
peut être conservée à la place et utilisée pour récupérer la PHAsset
.
PHAsset* asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil].firstObject;
Les URL d'actif héritées peuvent être converties à l'aide de:
PHAsset* legacyAsset = [PHAsset fetchAssetsWithALAssetUrls:@[assetUrl] options:nil].firstObject;
NSString* convertedIdentifier = legacyAsset.localIdentifier;
(avant que cette méthode ne devienne obsolète ...)
(Merci holtmann - localIdentifier
est caché dans PHObject
.)
Voici le code de travail testé sur iOS 11 simulateur et appareil
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
[result enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
PHAsset *asset = (PHAsset *)obj;
[asset requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) {
NSLog(@"URL:%@", contentEditingInput.fullSizeImageURL.absoluteString);
NSString* path = [contentEditingInput.fullSizeImageURL.absoluteString substringFromIndex:7];//screw all the crap of file://
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isExist = [fileManager fileExistsAtPath:path];
if (isExist)
NSLog(@"oh yeah");
else {
NSLog(@"damn");
}
}];
}];
Lire le bas!
ResultHandler for PHImageManager.requestImage renvoie 2 objets: result et info.
Vous pouvez obtenir le nom de fichier d'origine de PHAsset (comme IMG_1043.JPG) ainsi que son chemin d'accès complet sur le système de fichiers avec:
let url = info?["PHImageFileURLKey"] as! URL
Cela devrait fonctionner correctement, mais pour une raison quelconque, Apple a tout gâché. Donc, fondamentalement, vous devez copier votre image dans un fichier, puis accéder à celui-ci, puis le supprimer.
PHImageFileURLKey peut être utilisé pour obtenir le nom du fichier d'origine, mais vous ne pouvez pas accéder à ce fichier. Cela tient probablement au fait que le code en arrière-plan peut accéder au fichier alors que d'autres applications peuvent le supprimer.
Pensez au temps que vous perdriez à le comprendre depuis qu'Apple a foiré au lieu de simplement le documenter. C’est peut-être sincère, c’est peut-être parce qu’ils avaient des développeurs différents qui ne comprenaient pas et ne voulaient pas travailler. Ici, je travaille bien, et Apple a combien de centaines de milliards dans la banque?
Oui, désolé Apple, mais je ne suis pas d’accord avec <500 dollars et une valeur nette de moins de 1 an sur 1 700 abonnés payant 1 To iCloud @ 10 $ par mois pour avoir travaillé pendant la même période de votre vie. dette (2001 -> maintenant). C'était l'iPhone d'origine, n'est-ce pas? Vous leur apprenez certainement ces tailles de données, mais pas en ce qui concerne les prix mensuels d'iCloud <1% du revenu mensuel moyen aux États-Unis!