web-dev-qa-db-fra.com

Comment obtenir une URL ALAsset auprès d'un PHAsset?

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
18
Clay Bridges

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.

43
holtmann

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.)

8
Matt

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");
            }
        }];
    }];
1
Lance Mao

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!

0
Andrew Hodel