检查设备是否连接到VPN

Bri*_*rsh 7 ios swift

我可以使用以下方法检查设备是否已连接到互联网:

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)


Pro*_*Pro 6

我正在使用下面的代码(兼容 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