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

는 도움이되기를 바랍니다.

스위프트의 코드는 당신이 정말 원하는 것은 지속적으로 개체를 식별하는 고유 한 문자열입니다 localIdentifier 인이

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

보풀은 항상 file : ///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG가됩니까? 암호를 해독하고 파일 이름을 test.png로 가져 오는 방법이 있습니까? –

+0

그리고 이미지의 이름을 바꾸지 못하게 할 방법이 있습니까? 내 장치로 이미지를 전송하는 경우 컴퓨터에있는 것과 동일한 파일 이름을 유지하고 싶습니다. 컴퓨터에서 파일을 전송할 때와 동일한 파일 이름을 유지 한 다음 응용 프로그램으로 가져 오십시오. 그 이후로 만들 수 있습니까? –

0

처럼 보일 것입니다. here

16

또 하나 개의 옵션입니다

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

더 많은 정보를 볼 수 있습니다 : :

사용이 캐릭터 라인을 사용하여 객체를 찾는 것은

[asset valueForKey:@"filename"] 

은 "합법"의 이것은 당신이 결정할 것입니다.

+1

PHAsset의 'filename'속성이 없습니다. 어떻게 작동할까요? –

+0

Magic. =] 공개 API에서는 노출되지 않는 개인 소유물입니다. 'filename'이라는 다른 공개 API 속성이 있기 때문에 상대적으로 사용하기 쉽습니다. –

+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'을 키로 사용하여 정렬 설명자를 사용하여 코드를 사용해 보았습니다. '가져 오기 옵션에서 지원되지 않는 정렬 설명자'오류가 발생합니다. – Angelo

2
스위프트와

간단한 대답이 자산을 참조 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