You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动