在 iOS 12 中检查设备是否连接到 VPN
Check whether device is connected to a VPN in iOS 12
我正在使用下面的代码(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' 为前缀,后跟数字)。
for key: String in keys.allKeys as! [String] {
if (key == "tap" || key == "tun" || key == "ppp" || key == "ipsec" || key == "ipsec0" || key == "utun1") {
return true
}
}
return false
键列表自 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()
我也写了一篇关于它的小博客posthere
我正在使用下面的代码(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' 为前缀,后跟数字)。
for key: String in keys.allKeys as! [String] {
if (key == "tap" || key == "tun" || key == "ppp" || key == "ipsec" || key == "ipsec0" || key == "utun1") {
return true
}
}
return false
键列表自 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()
我也写了一篇关于它的小博客posthere