手机系统最近升级到iOS 12后,原项目中,保存生成的二维码图片到系统相册失败。
1 | func UIImageWriteToSavedPhotosAlbum(_ image: UIImage, _ completionTarget: Any?, _ completionSelector: Selector?, _ contextInfo: UnsafeMutableRawPointer?) |
以上代码只是介绍需要的参数是image,接收的参数是UIImage类型,没有说明image需要满足的条件
- 在虚拟机中报的错误是:
Error Domain=ALAssetsLibraryErrorDomain Code=-3300 “写入失败” UserInfo={NSUnderlyingError=0x6000008d96b0 {Error Domain=ALAssetsLibraryErrorDomain Code=-3300 “写入失败” UserInfo={NSUnderlyingError=0x6000008d95f0 {Error Domain=ALAssetsLibraryErrorDomain Code=-3300 “写入失败” UserInfo={NSUnderlyingError=0x6000008d8d20 {Error Domain=PersistentURLTranslator Code=10 “(null)”}, NSLocalizedDescription=写入失败, NSLocalizedFailureReason=写入此资产时出现问题,因为写入无效。}}, NSLocalizedDescription=写入失败, NSLocalizedFailureReason=写入此资产时出现问题,因为写入无效。}}, NSLocalizedDescription=写入失败, NSLocalizedFailureReason=写入此资产时出现问题,因为写入无效。}
一头雾水,以为没有权限,再三检查了确认
po image?.pngData()
nil
应该是跟不能转成data数据有关了,通过检查发现,image的cgImage是空而ciImage有值。
生成的二维码是通过CIFilter生成
The CIFilter class produces a CIImage object as output
官方文档说明CIFilter生成CIImage对象,而CIImage只是CoreImage过滤处理或生成的图像的表示,而不是真正的图片数据,所以不能生成data,而CGImage才是图片数据,所以只需要将保存的image保证cgImage值不为空就能保存成功。
附上代码
a. 生成二维码的代码
1 | // String的扩展,出现问题的情况是 中间的图标为空时 |
b. 生成UIImage包含CGImage的代码
1 | extension UIImage { |