2015-01-09 3 views

ответ

16

Если вы хотите, чтобы получить имя изображения (например, имя последней фотографии в фотографиях), как IMG_XXX.JPG, вы можете попробовать это:

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

Надеется, что это помогает.

В Swift код будет выглядеть следующим образом

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 
    } 
}) 
+4

Это просто грязное обходное решение. 'PHImageFileURLKey' является недокументированным ключом, и этот URL-адрес не имеет уникального имени в последнем компоненте пути, если изображение отредактировано (например, с фильтром изображения). – user500

+0

Будет ли пух всегда быть файлом: ///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG? Есть ли способ шифровать это и просто получить имя файла, например test.png? –

+0

И есть ли способ сохранить систему от переименования изображений? Если я переношу изображение на свое устройство, я бы хотел, чтобы оно поддерживало то же имя файла, которое у них есть на моем компьютере, из которого я переношу их, а затем импортирую их в приложение. С того времени? –

0

То, что вы действительно ищете, localIdentifier которая является уникальной строкой, которая настойчиво идентифицирует объект.

Используйте эту строку для поиска объекта с помощью:

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

Более подробная информация доступна here

16

Еще один вариант:

[asset valueForKey:@"filename"] 

"законностью" из это вам решать.

+1

Не существует свойства с именем 'filename' для PHAsset. Как это работает? –

+0

Magic. =] Это частная собственность, не открытая в публичном API. Это относительно использовать, потому что есть другие, общедоступные API, свойства, называемые 'filename'. –

+0

работает ли это на iOS 8? –

25

Я знаю, что этот вопрос уже был дан ответ, но я полагал, что обеспечит еще один вариант:

extension PHAsset { 

    var originalFilename: String? { 

     var fname:String? 

     if #available(iOS 9.0, *) { 
      let resources = PHAssetResource.assetResourcesForAsset(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.valueForKey("filename") as? String 
     } 

     return fname 
    } 
} 
+1

Обратите внимание, что 'PHAssetResource' доступен только для iOS 9+. – Anthony

+0

Я попытался использовать ваш код с дескриптором сортировки, используя «originalFilename» в качестве ключа, и он дает ошибку «Unsupported sort descriptor in fetch options». – Angelo

2

Простейшее ответ с Swift, когда у вас есть URL ссылки на актив:

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 
     } 
    }) 
} 
0

SWIFT4: первый 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 
       } 
      }) 
     }