SwiftUI iOS代码在苹果硅Mac平板模式下无法保存照片求助
问题分析与解决方案
错误代码解读
你遇到的PHPhotosErrorDomain Code=3311错误,在macOS上运行iOS应用时,通常关联相册权限的上下文异常——尤其是平板模式下,系统对iOS应用的权限管控逻辑和桌面模式存在差异,旧版相册保存API的兼容性出现了问题。
解决方案
1. 重置系统层面的相册权限
即使Info.plist中配置了权限键,仍需确认Mac系统是否正确授予应用相册访问权限,或重置权限上下文:
- 打开「系统偏好设置」→「安全性与隐私」→「照片」
- 找到你的应用,确保勾选「允许访问照片」,若权限已开启,尝试先取消勾选,重启应用后重新授予权限
- 若权限选项为灰色锁定状态,点击左下角锁形图标解锁后再操作
2. 替换为Photos框架的现代API
旧的UIImageWriteToSavedPhotosAlbum依赖已被弃用的ALAssetsLibrary框架,在苹果硅Mac平板模式下存在兼容性缺陷,建议改用PHPhotoLibrary的现代API:
import Photos class ImageSaver: NSObject { func writeToPhotoAlbum(image: UIImage) { PHPhotoLibrary.requestAuthorization(for: .addOnly) { [weak self] status in guard status == .authorized else { print("相册添加权限未授权") return } guard let imageData = image.pngData() else { print("图片数据转换失败") return } PHPhotoLibrary.shared().performChanges({ let creationRequest = PHAssetCreationRequest.forAsset() creationRequest.addResource(with: .photo, data: imageData, options: nil) }) { success, error in if let error = error { print("保存失败: \(error)") print("Save NG") } else { print("Save OK") } } } } }
该API更适配iOS on Mac的运行环境,能更精准地处理权限和保存逻辑。
结论
从你更换Xcode版本、macOS版本后问题依旧的测试结果来看,这大概率是苹果硅Mac平板模式下iOS应用的系统级兼容性缺陷,旧API在该模式下的权限处理存在bug。改用现代Photos API后,通常能绕过这个问题。
内容的提问来源于stack exchange,提问作者Shin Totoki
相关产品推荐
相关产品推荐

