CGImageSourceCopyPropertiesAtIndex不返回关键字和其他Photos.app字段

时间:2016-05-04 16:48:47

标签: ios swift phasset ciimage

在OS X上的Photos.app中,我已经在我的库中为照片指定了标题,关键字和描述。在iOS上,我使用常规提取方法检索了PHAsset。

然后使用CGImageSourceCopyPropertiesAtIndex,我获取了照片的元数据。元数据是正确的(它包含所有GPS和EXIF数据),但它不包含任何这些自定义字段。

关键字和其他字段肯定在设备上,因为我可以通过这些字段在iOS上搜索Photos.app并找到照片。

是否有其他方式可以访问这些字段,或者CGImageSourceCopyPropertiesAtIndex可能存在错误?

if let metadata = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) {
    print(metadata)
}

2 个答案:

答案 0 :(得分:3)

该信息位于设备上的照片应用程序数据库中(与OS X上的照片同步),未嵌入单个媒体文件中。在Photos框架中查询这些字段没有公共API - 听起来对file a bug来说是一件好事。

答案 1 :(得分:2)

iOS 11更新后CGImageSourceCopyPropertiesAtIndex存在错误

我也有同样的问题。我的应用程序在iOS 10.3.3中工作,在更新到iOS 11之后,我无法使用CGImageSourceCopyPropertiesAtIndex函数获取PNG文件的元数据信息(描述字段)。元数据(PNG文件)的描述字段为空。我已经向苹果报告了这个错误,但自从2009年9月27日我就没回答。

以下代码适用于iOS 10.3.3(不适用于iOS 11,iOS 11.0.1,iOS 11.0.2,iOS 11.0.3,iOS 11.1,... iOS 11.2)

NSString pngFile = @" Demo.PNG" // Demo.PNG =任何带描述的PNG文件

CGImageSourceRef imgSrc = CGImageSourceCreateWithURL( (__bridge CFURLRef)[NSURL fileURLWithPath:pngFile], NULL);
NSDictionary *metaDataDict =  CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(imgSrc, 0, nil));
if (imgSrc!=nil) {
    NSDictionary *metaDataDict =  (__bridge NSDictionary *)(CGImageSourceCopyPropertiesAtIndex(imgSrc, 0, nil));
    // Release imgSrc
    CFRelease(imgSrc);
}

(详见https://forums.developer.apple.com/thread/90958