iOS保存JPG时24小时制开关影响Photos日期显示问题咨询
问题定性
这是iOS Photos框架存在多年的已知Bug,既不是官方设计规范,也不是你的代码写错了。
这个Bug的触发逻辑和你观察到的完全一致:
- 系统关闭24小时制(使用12小时时间显示)时,
creationRequestForAssetFromImage(atFileURL:)接口会正常解析JPG内EXIF存储的原始拍摄时间,Photos App展示的就是EXIF记录的时间。 - 系统开启24小时制时,接口内部解析EXIF时间的逻辑会出现格式匹配错误,读不到EXIF里的时间字段,就会默认把文件写入相册的时间作为照片创建时间,也就是你看到的实际保存时间。
问题根源是苹果内部实现EXIF时间解析的时候,没有强制用EXIF标准规定的yyyy:MM:dd HH:mm:ss固定格式做匹配,错误地关联了系统12/24小时制的显示设置,导致格式匹配失败。这个问题从iOS 10版本开始就有开发者提交过Feedback,到近年的iOS版本也没有完全修复,苹果也没有在公开文档中说明过这个逻辑。
临时规避方法
不要依赖系统自动解析EXIF时间,手动读取JPG里的EXIF原始时间,显式赋值给PHAsset的creationDate字段就能绕开这个Bug,参考实现:
PHPhotoLibrary.shared().performChanges({ guard let imageData = try? Data(contentsOf: jpgFileUrl), let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil), let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any], let exifInfo = properties[kCGImagePropertyExifDictionary] as? [CFString: Any], let dateStr = exifInfo[kCGImagePropertyExifDateTimeOriginal] as? String else { PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: jpgFileUrl) return } let formatter = DateFormatter() // 强制用EXIF标准格式解析,不受系统时间设置影响 formatter.dateFormat = "yyyy:MM:dd HH:mm:ss" formatter.locale = Locale(identifier: "en_US_POSIX") guard let originalDate = formatter.date(from: dateStr) else { PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: jpgFileUrl) return } let request = PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: jpgFileUrl) request?.creationDate = originalDate }, completionHandler: { success, error in print("success=\(success), error=\(String(describing: error))") })

内容的提问来源于stack exchange,提问作者M.Masa
相关产品推荐
相关产品推荐

