You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:20:42