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