【问题标题】:How to detect if an iOS user is connected to cellular network versus wi-fi?如何检测 iOS 用户是否连接到蜂窝网络而不是 Wi-Fi?
【发布时间】:2019-01-18 20:21:54
【问题描述】:

我需要区分连接到蜂窝网络和 wifi 的 iPhone/iPad 用户。在SCNetworkReachabilityFlag.isWWAN 下,Apple 表示:

The absence of this flag does not necessarily mean that a connection will never pass over a cellular network. If you need to robustly prevent cellular networking, read Avoiding Common Networking Mistakes in Networking Overview.

这意味着,如果启用此标志,则用户很可能通过蜂窝网络连接,但不能保证。我读了Avoiding Common Networking Mistakes,但没有帮助。

我怎样才能 100% 确定用户在蜂窝网络上(或不在)?

我的代码如下所示:

let reachability = SCNetworkReachabilityCreateWithName(nil, "localhost")
var flags = SCNetworkReachabilityFlags()
if let reachability = reachability {
    SCNetworkReachabilityGetFlags(reachability, &flags)
}
let isConnectedToCellular = flags.contains(.isWWAN)

编辑:

如果您使用此代码,请务必在后台线程中调用它,而不要在主线程中调用。

【问题讨论】:

  • 我怀疑这不是一个正确的问题。我假设您的意思是“我如何确保不通过蜂窝网络建立连接?”如果这是问题所在,Apple 的链接不正确(或者可能只是过时了)。它位于同一文档的“特定于平台的网络技术”中:developer.apple.com/library/archive/documentation/…
  • 正确。谢谢。

标签: ios swift reachability


【解决方案1】:

您可以使用 Reachability.swift 您可以使用它,或者了解某些特定流程是如何产生和工作的。

它有一个 Connection 枚举,如下所示:

public enum Connection: CustomStringConvertible {
        case none, wifi, cellular
        public var description: String {
            switch self {
            case .cellular: return "Cellular"
            case .wifi: return "WiFi"
            case .none: return "No Connection"
            }
        }
    }

以及网络状态

public enum NetworkStatus: CustomStringConvertible {
    case notReachable, reachableViaWiFi, reachableViaWWAN
    public var description: String {
        switch self {
        case .reachableViaWWAN: return "Cellular"
        case .reachableViaWiFi: return "WiFi"
        case .notReachable: return "No Connection"
        }
    }
}

然后您可以执行以下操作:

  1. 检查设备是否连接到移动数据/蜂窝或 Wifi。
  2. 观察可达性/互联网连接。

【讨论】:

    【解决方案2】:

    希望有帮助

       func getWiFiName() -> String? {
                var ssid: String?
                if let interfaces = CNCopySupportedInterfaces() as NSArray? {
                    for interface in interfaces {
                        if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
                            ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
                            break
                        }
                    }
                }
                return ssid
            }
    

    如果返回 nil 则您已通过蜂窝网络连接 如果设备连接到 wifi 则它将返回 wifi 名称 (SSID) 不要忘记打开网络扩展和访问项目能力的wifi信息

    这在模拟器上不起作用(它应该是真实的设备)!!!! 并添加这两个

    导入网络扩展

    导入 SystemConfiguration.CaptiveNetwork

    【讨论】:

    • 您使用什么库来获取此信息?
    • @teodikabrami 我看到您回答中的 CN 功能需要导入 CaptiveNetwork 框架,但您能解释一下为什么需要导入网络扩展吗?
    • @SanthoshR 你是对的,除非你想缩小 wifi 配置
    • @Mendo 没有库,所有内置功能
    猜你喜欢
    • 2011-07-07
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多