调用UIImageWriteToSavedPhotosAlbum报错:缺少指定Entitlement权限
问题:从服务器保存图片时触发RBSServiceErrorDomain权限错误
我用Swift实现从服务器URL保存图片的功能,代码如下:
let urlString = "http://someValidUrlToAnImage.png" let url = URL(string: urlString ) DispatchQueue.global().async { if let data = try? Data(contentsOf: url!) { if let image = UIImage(data: data) { DispatchQueue.main.async { UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) print( "Image saved !!!!" ) } } } }
此前功能正常,但现在出现以下错误:
Error acquiring assertion: <Error Domain=RBSServiceErrorDomain Code=1 "(originator doesn't have entitlement com.apple.runningboard.assertions.webkit AND originator doesn't have entitlement com.apple.multitasking.systemappassertions)" UserInfo={NSLocalizedFailureReason=(originator doesn't have entitlement com.apple.runningboard.assertions.webkit AND originator doesn't have entitlement com.apple.multitasking.systemappassertions)}>
我通过USB连接Xcode测试,且已在Xcode的plist文件和AppStoreConnect后台添加所有权限,请问该错误的原因是什么?
问题分析与解决方案
这个错误核心是系统RunningBoard服务的权限断言校验失败,和代码里的同步网络请求以及iOS版本的权限管控变化直接相关,具体原因和修复方式如下:
错误原因
- 同步网络请求触发系统后台管控:你使用的
Data(contentsOf:)是同步阻塞式网络请求,在后台队列执行时,一旦请求耗时较长,iOS(尤其是iOS 16+)会触发RunningBoard的后台权限检查,而报错里的两个权限都是苹果系统级私有权限,第三方App根本无法获取。 - SDK/iOS版本更新导致校验收紧:苹果在新版本系统或SDK中加强了后台任务的权限校验,之前的代码在旧版本中可以正常运行,但新版本会拦截这类潜在的后台违规操作。
- 权限配置可能未正确生效:虽然你说添加了所有权限,但可能存在Xcode缓存导致配置未更新,或者漏加了相册写入的关键权限
NSPhotoLibraryAddUsageDescription。
修复步骤
- 替换同步请求为异步网络请求:用
URLSession的异步方式替代Data(contentsOf:),避免同步阻塞触发系统检查,示例代码:
let urlString = "http://someValidUrlToAnImage.png" guard let url = URL(string: urlString) else { return } URLSession.shared.dataTask(with: url) { data, response, error in guard let data = data, error == nil, let image = UIImage(data: data) else { print("图片加载失败: \(error?.localizedDescription ?? "未知错误")") return } DispatchQueue.main.async { UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) print("Image saved !!!!") } }.resume()
- 确认相册写入权限配置:检查
Info.plist中是否添加了NSPhotoLibraryAddUsageDescription(iOS 11及以上版本必填),键值要明确说明用途,比如"需要保存图片到相册"。 - 清理Xcode缓存并重建:按
Command+Shift+K清理构建缓存,再重新运行App,避免旧配置残留导致权限未生效。 - 适配iOS新版本后台规则:如果测试设备是iOS 16+,确保你的后台操作符合苹果最新的后台任务规范,避免长时间在后台执行网络请求。
内容的提问来源于stack exchange,提问作者sanchez
相关产品推荐
相关产品推荐

