如何检测 iOS 用户连接的是蜂窝网络还是 Wi-Fi?
How to detect if an iOS user is connected to cellular network versus wi-fi?
我需要区分 iPhone/iPad 用户连接到手机和 wifi。在 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)
编辑:
如果您正在使用此代码,请确保在后台线程上调用它,而不是主线程。
您可以使用 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"
}
}
}
然后您可以执行以下操作:
- 检查设备是否连接到移动数据/蜂窝网络或 Wifi。
- 观察可达性/互联网连接。
希望对您有所帮助
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
}
如果此 return 为零,则说明您已通过蜂窝网络连接,如果设备连接到 wifi,则它将 return wifi 名称 (SSID)
不要忘记打开网络扩展并访问有关项目功能的 wifi 信息
这在模拟器上不起作用(它应该是真实的设备)!!!!
并添加这两个
导入网络扩展
导入SystemConfiguration.CaptiveNetwork
我需要区分 iPhone/iPad 用户连接到手机和 wifi。在 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)
编辑:
如果您正在使用此代码,请确保在后台线程上调用它,而不是主线程。
您可以使用 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"
}
}
}
然后您可以执行以下操作:
- 检查设备是否连接到移动数据/蜂窝网络或 Wifi。
- 观察可达性/互联网连接。
希望对您有所帮助
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
}
如果此 return 为零,则说明您已通过蜂窝网络连接,如果设备连接到 wifi,则它将 return wifi 名称 (SSID) 不要忘记打开网络扩展并访问有关项目功能的 wifi 信息
这在模拟器上不起作用(它应该是真实的设备)!!!! 并添加这两个
导入网络扩展
导入SystemConfiguration.CaptiveNetwork