ios8 alassetslibrary alasset photokit phasset

ios8 - ¿Cómo obtener una URL ALAsset de un PHAsset?



alassetslibrary photokit (5)

Puede hacerlo furtivamente † utilizando la propiedad PHAsset.ALAssetURL undocumented PHAsset.ALAssetURL , pero estoy buscando algo documentado.

† En Objective-C, esto ayudará

@interface PHAsset (Sneaky) @property (nonatomic, readonly) NSURL *ALAssetURL; @end


¡Lee el fondo!

ResultHandler para PHImageManager.requestImage devuelve 2 objetos: resultado e información

Puede obtener el nombre de archivo original para el PHAsset (como IMG_1043.JPG), así como su ruta completa en el sistema de archivos con:

let url = info?["PHImageFileURLKey"] as! URL

Esto debería funcionar bien, pero por alguna razón Apple lo jodió. Básicamente, debe copiar su imagen a un archivo y luego acceder a ella y luego eliminarla.

PHImageFileURLKey se puede usar para obtener el nombre del archivo original, pero en realidad no puede acceder a ese archivo. Probablemente tenga que ver con el hecho de que el código en segundo plano puede acceder al archivo mientras que otras aplicaciones pueden eliminarlo.

Piensa cuánto tiempo perderías descifrando eso, ya que Apple lo jodió en lugar de solo documentarlo. Tal vez sea sincero, tal vez es que tenían diferentes desarrolladores que no entendían y no querían trabajar. Sin embargo, aquí estoy trabajando y Apple tiene cuántos cientos de miles de millones en el banco.

Sí, lo siento Apple, pero no estoy de acuerdo cuando tengo <500 dólares y un patrimonio neto de menos de 1 año de 1700 suscriptores que pagan 1TB iCloud @ $ 10 al mes por trabajar durante el mismo período de tiempo desde el que se le revivió deuda (2001 -> ahora). Ese fue el iPhone original, ¿verdad? ¡Seguro que les está enseñando esos tamaños de datos, aunque no es así, aumentando los precios mensuales de iCloud <1% del ingreso mensual promedio de EE. UU.


Aquí está el código de trabajo probado en iOS 11, tanto el simulador como el dispositivo

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


Aquí hay una extensión PHAsset escrita en Swift que recuperará la URL.

let url = info?["PHImageFileURLKey"] as! URL


Cree el assetURL aprovechando el PHAsset del PHAsset . Ejemplo: PHAsset.localidentifier devuelve 91B1C271-C617-49CE-A074-E391BA7F843F/L0/001

Ahora tome los 32 primeros caracteres para construir el assetURL, como:

assets-library://asset/asset.JPG?id=91B1C271-C617-49CE-A074-E391BA7F843F&ext=JPG

Puede cambiar la extensión JPG dependiendo de la UTI del activo ( requestImageDataForAsset devuelve la UTI), pero en mis pruebas las extensiones del activoURL parecen ignorarse de todos modos.


También quería poder obtener una URL para un activo. Sin embargo, me di cuenta de que el localIdentifier puede persistirse y usarse para recuperar el PHAsset .

PHAsset* asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil].firstObject;

Las URL de activos heredados se pueden convertir usando:

PHAsset* legacyAsset = [PHAsset fetchAssetsWithALAssetUrls:@[assetUrl] options:nil].firstObject; NSString* convertedIdentifier = legacyAsset.localIdentifier;

(antes de que ese método quede obsoleto ...)

(Gracias, : localIdentifier está oculto en PHObject ).