我可以使用以下方法检查设备是否已连接到互联网:
var connected: Bool = true
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
var flags = SCNetworkReachabilityFlags()
if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
connected = false
}
let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags.rawValue & UInt2(kSCNetworkFlagsConnectionRequired)) != 0
if isReachable && !needsConnection && connected {
login(usernameTextField.text!, password: appPassword.text!, environment: environmentUrl)
} else {
let alert = UIAlertView()
alert.title = "No internet connection detected."
alert.addButtonWithTitle("OK")
alert.show()
return
}
Run Code Online (Sandbox Code Playgroud)
但是有没有办法检查设备是否连接到VPN?我正在编写的应用程序需要 VPN 才能访问,因此我不想让用户在未连接到 VPN 时尝试登录,而是想事先提示他们(我认为更好的用户体验)。
感谢您的帮助。
小智 10
我使用以下代码使其适用于 Swift 3/4:
private var isConnectedToVpn: Bool {
if let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as? Dictionary<String, Any>,
let scopes = settings["__SCOPED__"] as? [String:Any] {
for (key, _) in scopes {
if key.contains("tap") || key.contains("tun") || key.contains("ppp") || key.contains("ipsec") {
return true
}
}
}
return false
}
Run Code Online (Sandbox Code Playgroud)
我正在使用下面的代码(兼容 Swift 3 和 Swift 4)来检查 iOS 设备上的 VPN 连接,这对我来说工作正常。在两个私有 VPN 和 ExpressVPN 上测试,均使用 ipsec0 协议。
func isVPNConnected() -> Bool {
let cfDict = CFNetworkCopySystemProxySettings()
let nsDict = cfDict!.takeRetainedValue() as NSDictionary
let keys = nsDict["__SCOPED__"] as! NSDictionary
for key: String in keys.allKeys as! [String] {
if (key == "tap" || key == "tun" || key == "ppp" || key == "ipsec" || key == "ipsec0" || key == "utun1" || key == "utun2") {
return true
}
}
return false
}
Run Code Online (Sandbox Code Playgroud)
另外这里是代码的要点链接 - Gist Link
| 归档时间: |
|
| 查看次数: |
5473 次 |
| 最近记录: |