Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查设备是否连接到iOS 12中的VPN_Ios_Swift_Vpn - Fatal编程技术网

检查设备是否连接到iOS 12中的VPN

检查设备是否连接到iOS 12中的VPN,ios,swift,vpn,Ios,Swift,Vpn,我正在使用下面的代码(Swift 3和Swift 4兼容)检查iOS设备上的VPN连接,该设备在iOS 12及以上版本中不工作。如何在iOS 12中检查vpn连接 func isVPNConnected() -> Bool { let cfDict = CFNetworkCopySystemProxySettings() let nsDict = cfDict!.takeRetainedValue() as NSDictionary let keys = nsDic

我正在使用下面的代码(Swift 3和Swift 4兼容)检查iOS设备上的VPN连接,该设备在iOS 12及以上版本中不工作。如何在iOS 12中检查vpn连接

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") {
            return true
        }
    }
    return false
}

感谢您的帮助。

正在尝试将密钥“utun1”添加到您的支票中(或以“utun”作为前缀,后跟一个数字)


自iOS 12和iOS 13以来,密钥列表已更改

已添加2个键

utun1和utun2

因此,功能应该是:

static func isConnectedToVPN() -> 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
}

在我的例子中,我收到一个
ipsec4
,而应用程序无法识别VPN。 因此我想出了一些不同的办法:

struct VpnChecker {

    private static let vpnProtocolsKeysIdentifiers = [
        "tap", "tun", "ppp", "ipsec", "utun"
    ]

    static func isVpnActive() -> Bool {
        guard let cfDict = CFNetworkCopySystemProxySettings() else { return false }
        let nsDict = cfDict.takeRetainedValue() as NSDictionary
        guard let keys = nsDict["__SCOPED__"] as? NSDictionary,
            let allKeys = keys.allKeys as? [String] else { return false }

        // Checking for tunneling protocols in the keys
        for key in allKeys {
            for protocolId in vpnProtocolsKeysIdentifiers
                where key.starts(with: protocolId) {
                // I use start(with:), so I can cover also `ipsec4`, `ppp0`, `utun0` etc...
                return true
            }
        }
        return false
    }
}

用法:
VpnChecker.isVpnActive()


我还写了一篇关于它的博客文章

你面临的问题是什么,我的意思是你是否验证子字符串中的密钥不可用?我的问题是我需要检查设备是否连接到vpn。不上述代码在iOS 11中运行良好,但在iOS 12中总是返回false。如何在最新的iOS中检查vpn连接?您是否验证了密钥在[string]中返回的内容?是的,始终获得“en0”我认为您在相同的IP地址中尝试了使用+1进行回答投票
struct VpnChecker {

    private static let vpnProtocolsKeysIdentifiers = [
        "tap", "tun", "ppp", "ipsec", "utun"
    ]

    static func isVpnActive() -> Bool {
        guard let cfDict = CFNetworkCopySystemProxySettings() else { return false }
        let nsDict = cfDict.takeRetainedValue() as NSDictionary
        guard let keys = nsDict["__SCOPED__"] as? NSDictionary,
            let allKeys = keys.allKeys as? [String] else { return false }

        // Checking for tunneling protocols in the keys
        for key in allKeys {
            for protocolId in vpnProtocolsKeysIdentifiers
                where key.starts(with: protocolId) {
                // I use start(with:), so I can cover also `ipsec4`, `ppp0`, `utun0` etc...
                return true
            }
        }
        return false
    }
}