PHAsset实例的creationDate属性何时会为nil?
PHAsset.creationDate 为 nil 的原因、复现方案及适配照片APP的处理逻辑
我之前做照片类APP时也踩过这个坑,折腾了好一阵子才摸清楚门道,分享给你参考:
为什么 creationDate 会变成 nil?
- 非标准来源的媒体文件:比如从老旧功能机导出、第三方工具异常处理过的媒体,完全缺失创建日期元数据,且Photos框架无法通过其他途径(比如文件属性)推断出来。
- 极端修改后的媒体:如果不仅用
exiftool -overwrite_original -all= /path/to/image.jpg清除了EXIF/IPTC元数据,还彻底抹除了文件本身的系统创建/修改时间,Photos就找不到任何可以 fallback 的时间值,此时creationDate就会为nil。 - Photos库异常:比如库文件损坏、iCloud同步中断导致元数据丢失,不过这种情况非常少见。
怎么复现这个场景?
你之前用exiftool清除元数据后导入还不为nil,是因为Photos会自动用文件的系统创建时间来填充creationDate。要彻底触发nil状态,得同时干掉文件的系统时间属性:
- 先用exiftool清除所有元数据:
exiftool -overwrite_original -all= /path/to/image.jpg - 在macOS上,用
touch命令把文件的访问和修改时间设为一个Photos无法识别的无效值(比如1970年之前的时间):touch -t 196912312359 /path/to/image.jpg - 把这个文件导入iOS设备的Photos库,此时查看对应的PHAsset,
creationDate就会是nil了。
另外还有个更简单的办法:找一些从早期非智能手机导出的无元数据图片,直接导入iOS,大概率会出现creationDate为nil的情况。
如何适配iOS照片APP的用户体验?
iOS照片APP遇到creationDate为nil的资产时,会默认显示该资产被添加到Photos库的时间(也就是dateAdded属性)。你可以直接照搬这个逻辑:
func getDisplayDate(for asset: PHAsset) -> Date { // 优先用原始创建日期 if let creationDate = asset.creationDate { return creationDate } // 照片APP的 fallback 逻辑:用添加到库的时间 return asset.dateAdded ?? Date() // 理论上dateAdded不会为nil,兜底用当前时间 }
这样处理就能和系统照片APP的表现保持一致,给用户统一的体验。
内容的提问来源于stack exchange,提问作者Meg
相关产品推荐
相关产品推荐

