iOS 11中调用SaveToPhotosAlbum崩溃问题的解决方法
解决iOS 11中保存图片到相册崩溃的问题
兄弟,你的代码在iOS 11上崩溃的核心原因很明确——iOS 10及以后的系统强制要求申请相册访问权限,而且iOS 11对权限校验的严格程度更高,你直接跳过权限申请就调用保存方法,系统直接就崩给你看了。我给你整理了完整的修复方案,一步步来:
1. 先给Info.plist加权限描述
iOS要求必须在Info.plist里添加权限用途说明,否则连权限申请的弹窗都弹不出来,直接崩溃。你需要根据需求二选一添加:
- 仅需要写入相册:添加
NSPhotoLibraryAddUsageDescription,值填类似"需要将图片保存到您的相册"的说明文本 - 需要读写相册:添加
NSPhotoLibraryUsageDescription,填写对应的用途说明
2. 先申请权限再执行保存操作
在调用SaveToPhotosAlbum之前,必须先检查并申请相册权限,这里用PHPhotoLibrary来处理(记得先导入Photos框架)。下面是修复后的完整代码:
using Photos; // 别忘导入这个命名空间 try { string uri = "https://www.xamarin.com/content/images/pages/branding/assets/xamagon.png"; using (var url = new NSUrl(uri)) using (var data = NSData.FromUrl(url)) { // 先检查并申请相册权限 PHPhotoLibrary.RequestAuthorization(status => { if (status == PHAuthorizationStatus.Authorized || status == PHAuthorizationStatus.Limited) { // UI操作必须在主线程执行,否则可能出问题 NSOperationQueue.MainQueue.AddOperation(() => { var image = UIImage.LoadFromData(data); image.SaveToPhotosAlbum((savedImage, error) => { if (error != null) { Console.WriteLine("保存失败:" + error.LocalizedDescription); } else { Console.WriteLine("图片成功保存到相册!"); } }); }); } else { Console.WriteLine("相册权限被拒绝,无法保存图片"); } }); } } catch(Exception exx) { Console.WriteLine("下载图片出错:" + exx.Message); }
3. 几个关键细节要注意
- 权限是核心:iOS 11对权限的校验比之前系统更严格,没有权限直接调用保存方法会触发崩溃,而不是返回错误提示
- 主线程执行UI操作:
SaveToPhotosAlbum属于UI相关操作,必须放在主线程执行,否则可能出现异常或崩溃 - 兼容新权限状态:iOS 14以后新增了
Limited(有限权限)状态,判断时要包含进去,保证新系统的兼容性
另外,你原来的代码直接抛出异常,建议改成捕获后输出日志,这样更容易排查问题,而不是直接让APP崩溃。
内容的提问来源于stack exchange,提问作者Sumit Mishra




