iOS8照片框架:如何获取相集的名称(或文件名)?

iOS8照片框架:如何获取相集的名称(或文件名)?,ios,phasset,Ios,Phasset,我正在尝试使用PHAssets获取图像名称。但是我找不到文件名的元数据,也找不到任何获取图像名称的方法。是否有其他方法获取文件名?如果您想获取像IMG_XXX.JPG这样的图像名(例如照片中最后一张照片的名称),您可以尝试以下方法: PHAsset *asset = nil; PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; fetchOptions.sortDescriptors = @[[NSSortDescripto

我正在尝试使用
PHAssets
获取图像名称。但是我找不到文件名的元数据,也找不到任何获取图像名称的方法。是否有其他方法获取文件名?

如果您想获取像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
    }
})
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)
                            }
                        }
                    }
            })
        }
    }

如果您想获得像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
    }
})
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)
                            }
                        }
                    }
            })
        }
    }

您真正需要的是localIdentifier,它是一个持久标识对象的唯一字符串

使用此字符串通过以下命令查找对象:

fetchAssetsWithLocalIdentifiers:options:、fetchassetcollectionswithlocalidentiers:options:、或fetchcollectionlistwithlocalidentiers:options:method.


更多信息可用

您真正需要的是localIdentifier,它是一个持续标识对象的唯一字符串

使用此字符串通过以下命令查找对象:

fetchAssetsWithLocalIdentifiers:options:、fetchassetcollectionswithlocalidentiers:options:、或fetchcollectionlistwithlocalidentiers:options:method.

更多信息可用

还有一个选项:

[asset valueForKey:@"filename"]
“合法性”由您决定。

还有一个选项:

[asset valueForKey:@"filename"]

“合法性”由您决定。

我知道问题已经得到了回答,但我想我会提供另一种选择:

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

我知道这个问题已经得到了回答,但我想我会提供另一个选择:

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

当您有资产的参考url时,使用Swift的最简单答案是:

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

当您有资产的参考url时,使用Swift的最简单答案是:

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
        }
    })
}
SWIFT4: 首先
导入照片

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
                }
            })
        }
SWIFT4: 首先
导入照片

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

Swift 4中iOS 9+的最简单解决方案(基于skims答案):


Swift 4中iOS 9+的最简单解决方案(基于skims答案):



这只是肮脏的变通办法
PHImageFileURLKey
是未记录的密钥,并且如果编辑图像(例如使用图像过滤器),则此URL在最后路径组件中没有唯一的名称。绒毛是否总是file:///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG ? 是否有某种方法可以通过加密来获得test.png的文件名?是否有任何方法可以防止系统重命名图像?如果我将图像传输到我的设备,我希望它能保持它们在我的计算机上的相同文件名,然后将它们导入应用程序。这是因为吗?在“信息更新答案”下,此名称中没有键pls@wanttobeprofessional请参阅更新的答案。您可以在asset.creationDate属性中找到一个日期,然后使用(NS)DateFormatter将其格式化为您想要的格式。这只是一个肮脏的解决方法
PHImageFileURLKey
是未记录的密钥,并且如果编辑图像(例如使用图像过滤器),则此URL在最后路径组件中没有唯一的名称。绒毛是否总是file:///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG ? 是否有某种方法可以通过加密来获得test.png的文件名?是否有任何方法可以防止系统重命名图像?如果我将图像传输到我的设备,我希望它能保持它们在我的计算机上的相同文件名,然后将它们导入应用程序。这是因为吗?在“信息更新答案”下,此名称中没有键pls@wanttobeprofessional请参阅更新的答案。您可以在asset.creationDate属性中找到一个日期,然后使用(NS)将其格式化DateFormatter。请注意,
PHAssetResource
仅在iOS 9+上可用。我尝试将您的代码与使用“originalFilename”作为键的排序描述符一起使用,它会出现“不支持的提取选项中的排序描述符”错误。出于某种原因,我的视频文件显示“TPHM1745”当我在OSX中使用ImageCapture应用程序查看相机滚动文件时,文件名为,但您的方法抛出“IMG_6564.MP4”请注意,
PHAssetResource
仅在iOS 9+上可用。我尝试将您的代码与使用“originalFilename”作为键的排序描述符一起使用,它会出现“fetch options中不受支持的排序描述符”错误。出于某种原因,当我在OSX中使用ImageCapture应用程序查看相机滚动文件时,我的视频文件显示“TPHM1745”作为文件名,但是您的方法抛出“img6564.MP4”,因为PHAsset没有名为“filename”的属性。它是如何工作的?魔法它是私有财产,不在公共API中公开。这是相对容易使用的,因为还有其他的公共API,属性称为
filename
@caseyhanchock,我想是的。从发布答案的时间来看,它很可能是在iOS 8上测试的。确保测试以确保。PHAsset没有名为“filename”的属性。它是如何工作的?魔法它是私有财产,不在公共API中公开。这是相对容易使用的,因为还有其他的公共API,属性称为
filename
@caseyhanchock,我想是的。从发布答案的时间来看,它很可能是在iOS 8上测试的。一定要测试才能确定。太棒了,谢谢!我有没有提到,我喜欢斯威夫特做这样的事这将提供原始文件名。。但不是CameraRoll给文件的新的。谢谢!这是最短的方法。太棒了,谢谢!我有没有提到,我喜欢斯威夫特做这样的事这将提供原始文件名。。但不是CameraRoll给文件的新的。谢谢!这是最短的方法。