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

Posted

技术标签:

【中文标题】CGImageSourceCopyPropertiesAtIndex 不返回关键字和其他 Photos.app 字段【英文标题】:CGImageSourceCopyPropertiesAtIndex doesn't return keywords and other Photos.app fields 【发布时间】:2016-05-04 16:48:47 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

iOS 11 更新后 CGImageSourceCopyPropertiesAtIndex 出现 bug

我也有同样的问题。我的应用在 iOS 10.3.3 中运行,更新到 iOS 11 后,我无法使用 CGImageSourceCopyPropertiesAtIndex 函数获取 PNG 文件的元数据信息(描述字段)。元数据(PNG 文件)的描述字段为空。我已经向苹果报告了这个错误,但自 2017 年 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)

【讨论】:

请解释更多而不是简单地使用链接。如果链接停止工作,您的答案将毫无用处

以上是关于CGImageSourceCopyPropertiesAtIndex 不返回关键字和其他 Photos.app 字段的主要内容,如果未能解决你的问题,请参考以下文章