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

SCNetworkReachabilityCreateWithAddress已弃用,求网络可达性检测替代方案

替代SCNetworkReachability的网络可达性检测方案

Apple已弃用SCNetworkReachabilityCreateWithAddress,尽管文档未标记SCNetworkReachabilityGetFlags为弃用,但这套API整体已进入淘汰周期,且官方未给出明确替代方案。以下是两种可靠的替代实现方式:

方法一:使用NWPathMonitor(Network框架)

这是Apple推荐的现代网络状态监测方案,支持iOS 12+、macOS 10.14+,能精准识别当前网络类型(Wi-Fi/蜂窝/有线)、路径可用性,以及是否需要VPN等细节。

Swift代码示例:

import Network

class NetworkMonitor {
    static let shared = NetworkMonitor()
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "NetworkMonitorQueue")
    var isReachable: Bool = false
    var isReachableOnCellular: Bool = false
    
    private init() {
        monitor.pathUpdateHandler = { [weak self] path in
            self?.isReachable = path.status == .satisfied
            self?.isReachableOnCellular = path.isExpensive
        }
        monitor.start(queue: queue)
    }
    
    // 获取当前网络状态的便捷方法
    var currentStatus: String {
        if isReachable {
            return isReachableOnCellular ? "蜂窝网络可用" : "Wi-Fi/有线网络可用"
        } else {
            return "无可用网络"
        }
    }
}

// 使用方式
let status = NetworkMonitor.shared.currentStatus
print(status)

方法二:发起轻量网络请求验证特定服务

如果你的场景是需要确认某个具体域名/服务是否可达(而非单纯检测网络连接),直接发起一个HEAD请求或请求一个极小的接口会更准确——毕竟传统可达性API只能判断设备是否连上网,无法验证目标服务是否正常响应。

Swift代码示例:

import Foundation

func checkServiceReachability(for urlString: String, completion: @escaping (Bool) -> Void) {
    guard let url = URL(string: urlString) else {
        completion(false)
        return
    }
    
    var request = URLRequest(url: url)
    request.httpMethod = "HEAD" // 仅请求头部,减少数据传输
    request.timeoutInterval = 5.0 // 设置超时时间
    
    let task = URLSession.shared.dataTask(with: request) { _, response, error in
        if let error = error {
            print("请求失败:\(error.localizedDescription)")
            completion(false)
            return
        }
        // 检查响应状态码是否在200-399之间
        if let httpResponse = response as? HTTPURLResponse, (200...399).contains(httpResponse.statusCode) {
            completion(true)
        } else {
            completion(false)
        }
    }
    task.resume()
}

// 使用方式
checkServiceReachability(for: "https://www.example.com") { isReachable in
    print("服务是否可达:\(isReachable)")
}

方案选择建议

  • 若需全局监测设备的网络连接状态,优先用NWPathMonitor,功能全面且符合Apple的现代API规范。
  • 若需验证特定服务的可用性,直接发起轻量请求更可靠,避免出现“设备连网但服务不可用”的误判。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:52:03