ios phasset

iOS8 Photos Framework: ¿Cómo obtener el nombre(o nombre de archivo) de un PHAset?



phasset (7)

Estoy tratando de obtener el nombre de la imagen usando PHAssets . Pero no pude encontrar metadatos para el nombre de archivo o cualquier método para obtener el nombre de la imagen. ¿Hay alguna forma diferente de obtener el nombre del archivo?


La respuesta más simple con Swift cuando tiene una URL de referencia a un activo:

if let asset = PHAsset.fetchAssetsWithALAssetURLs([referenceUrl], options: nil).firstObject as? PHAsset { PHImageManager.defaultManager().requestImageDataForAsset(asset, options: nil, resultHandler: { _, _, _, info in if let fileName = (info?["PHImageFileURLKey"] as? NSURL)?.lastPathComponent { //do sth with file name } }) }


La solución más fácil para iOS 9+ en Swift 4 (basada en la respuesta de skim):

extension PHAsset { var originalFilename: String? { return PHAssetResource.assetResources(for: self).first?.originalFilename } }


Lo que realmente está buscando es el localIdentifier, que es una cadena única que identifica el objeto de forma persistente.

Use esta cadena para encontrar el objeto usando:

fetchAssetsWithLocalIdentifiers:options:, fetchAssetCollectionsWithLocalIdentifiers:options:, or fetchCollectionListsWithLocalIdentifiers:options: method.

Más información disponible here


Sé que la pregunta ya ha sido respondida, pero pensé que proporcionaría otra opción:

extension PHAsset { var originalFilename: String? { var fname:String? if #available(iOS 9.0, *) { let resources = PHAssetResource.assetResources(for: self) if let resource = resources.first { fname = resource.originalFilename } } if fname == nil { // this is an undocumented workaround that works as of iOS 9.1 fname = self.value(forKey: "filename") as? String } return fname } }


Si desea obtener el nombre de la imagen (por ejemplo, el nombre de la última foto en Fotos) como IMG_XXX.JPG, puede intentar esto:

PHAsset *asset = nil; PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions]; if (fetchResult != nil && fetchResult.count > 0) { // get last photo from Photos asset = [fetchResult lastObject]; } if (asset) { // get photo info from this asset PHImageRequestOptions * imageRequestOptions = [[PHImageRequestOptions alloc] init]; imageRequestOptions.synchronous = YES; [[PHImageManager defaultManager] requestImageDataForAsset:asset options:imageRequestOptions resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { NSLog(@"info = %@", info); if ([info objectForKey:@"PHImageFileURLKey"]) { // path looks like this - // file:///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG NSURL *path = [info objectForKey:@"PHImageFileURLKey"]; } }]; }

Espero eso ayude.

En Swift el código se verá así

PHImageManager.defaultManager().requestImageDataForAsset(asset, options: PHImageRequestOptions(), resultHandler: { (imagedata, dataUTI, orientation, info) in if info!.keys.contains(NSString(string: "PHImageFileURLKey")) { let path = info![NSString(string: "PHImageFileURLKey")] as! NSURL } })

Swift 4 :

let fetchResult = PHAsset.fetchAssets(with: .image, options: nil) if fetchResult.count > 0 { if let asset = fetchResult.firstObject { let date = asset.creationDate ?? Date() print("Creation date: /(date)") PHImageManager.default().requestImageData(for: asset, options: PHImageRequestOptions(), resultHandler: { (imagedata, dataUTI, orientation, info) in if let info = info { if info.keys.contains(NSString(string: "PHImageFileURLKey")) { if let path = info[NSString(string: "PHImageFileURLKey")] as? NSURL { print(path) } } } }) } }


Una opción más es:

[asset valueForKey:@"filename"]

La "legalidad" de esto depende de usted para decidir.


SWIFT4: primera import Photos

if let asset = PHAsset.fetchAssets(withALAssetURLs: [info[UIImagePickerControllerReferenceURL] as! URL], options: nil).firstObject { PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { _, _, _, info in if let fileName = (info?["PHImageFileURLKey"] as? NSURL)?.lastPathComponent { print("///////" + fileName + "////////") //do sth with file name } }) }