如何在Alamofire中使用unsatisfiedReason与localNetworkDenied?
基于Alamofire适配iOS本地网络权限检测方案
1. 配置支持等待连接的Alamofire Session
首先创建自定义Session实例,开启waitsForConnectivity属性,确保请求会等待用户处理权限弹窗:
import Alamofire let configuration = URLSessionConfiguration.default configuration.waitsForConnectivity = true let session = Session(configuration: configuration)
2. 检测本地网络权限被拒绝的状态
Alamofire的错误会封装底层URLError,我们可以在请求的错误回调中,通过unsatisfiedReason判断是否是本地网络权限被拒绝:
session.request("你的请求URL").response { response in if let error = response.error { // 解析底层URLError guard let urlError = error.underlyingError as? URLError else { // 处理其他错误 return } // 检查是否是本地网络权限被拒绝 if #available(iOS 15.0, *) { if urlError.unsatisfiedReason == .localNetworkDenied { // 展示友好提示,引导用户去设置开启权限 showPermissionDeniedAlert() } } else { // iOS 14-14.5版本,可通过错误码间接判断(错误码1005对应本地网络权限问题) if urlError.code == .networkConnectionLost { // 结合场景判断是否是权限问题,再展示提示 showPermissionDeniedAlert() } } } } // 示例提示弹窗函数 func showPermissionDeniedAlert() { 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 } UIApplication.shared.open(settingsUrl) }) // 注意:需在主线程展示弹窗 DispatchQueue.main.async { UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true) } }
3. 额外说明
- iOS 15及以上版本可以直接通过
unsatisfiedReason精准判断localNetworkDenied状态,无需依赖错误码。 - iOS 14到14.5版本没有
unsatisfiedReason属性,可结合请求场景(比如已知是连接本地服务器时),通过错误码URLError.Code.networkConnectionLost间接判断,再提示用户检查权限。 - 确保
Info.plist中已添加NSLocalNetworkUsageDescription字段,说明使用本地网络的原因,否则权限弹窗不会弹出。
内容的提问来源于stack exchange,提问作者chamaeleon
相关产品推荐
相关产品推荐

