Swift中UIImageWriteToSavedPhotosAlbum权限被拒后如何引导开启权限
引导用户跳转至应用设置修改相册权限的实现方案
当用户拒绝相册访问权限后,系统不会再自动触发权限申请弹窗,此时需要主动引导用户前往应用设置页面手动开启权限。以下是优化后的实现方案:
步骤说明
- 提前检查权限状态:在用户点击保存按钮时,先检查相册权限状态,避免直接进入错误流程
- 权限状态分支处理:
- 已授权:直接执行图片保存逻辑
- 未授权/受限:弹出引导弹窗,提供跳转至设置的入口
- 未请求过权限:发起权限申请,根据用户选择执行后续操作
- 跳转应用设置:利用系统提供的
UIApplication.openSettingsURLString直接跳转至当前应用的设置页面
完整代码实现
首先导入Photos框架(iOS 8+推荐使用):
import Photos
修改并补充你的代码:
@IBAction private func saveImageButtonTouch(sender: UIButton) { // 检查相册读写权限状态 let authStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite) switch authStatus { case .authorized: // 权限已通过,执行保存 saveTargetImage() case .denied, .restricted: // 权限被拒绝或受限,弹出引导设置弹窗 showPermissionGuideAlert() case .notDetermined: // 首次请求权限 PHPhotoLibrary.requestAuthorization(for: .readWrite) { [weak self] newStatus in DispatchQueue.main.async { if newStatus == .authorized { self?.saveTargetImage() } else { self?.showPermissionGuideAlert() } } } @unknown default: showPermissionGuideAlert() } } // 封装图片保存逻辑 private func saveTargetImage() { let image = areaForImageCaptureView.asImage() UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) } // 弹出权限引导弹窗 private func showPermissionGuideAlert() { let alert = UIAlertController( title: "需要相册权限", message: "请前往应用设置开启相册访问权限,才能完成图片保存", preferredStyle: .alert ) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) alert.addAction(UIAlertAction(title: "去设置", style: .default) { _ in // 跳转至应用设置页面 guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { return } if UIApplication.shared.canOpenURL(settingsURL) { UIApplication.shared.open(settingsURL) } }) present(alert, animated: true) } @objc func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) { if let error = error { // 处理保存过程中的其他错误(如图片格式异常等) let errorAlert = UIAlertController(title: "保存失败", message: "无法将图片保存至相册", preferredStyle: .alert) errorAlert.addAction(UIAlertAction(title: "确定", style: .default)) present(errorAlert, animated: true) } else { // 保存成功提示(可选) let successAlert = UIAlertController(title: "保存成功", message: "图片已存入相册", preferredStyle: .alert) successAlert.addAction(UIAlertAction(title: "确定", style: .default)) present(successAlert, animated: true) } }
关键细节
- 使用
PHPhotoLibrary进行权限管理是iOS 14+的标准方案,若需适配iOS 13及以下,可替换为ALAssetsLibrary相关逻辑 UIApplication.openSettingsURLString是系统预定义的URL,无需手动拼接,确保跳转至当前应用的设置页面- 在弹窗中明确说明权限需求的原因,提升用户配合度
内容的提问来源于stack exchange,提问作者Lena Verhoev
相关产品推荐
相关产品推荐

