【发布时间】:2011-12-29 05:30:24
【问题描述】:
我对这个发展很陌生。 我在互联网上搜索了很多,但找不到任何合适的解决方案。 我想检查我的 iPhone 应用程序中可用的 VPN 连接,因为我正在从通过 VPN 连接的客户端机器获取数据。 我确实检查了 Internet 连接是否可用,但无法检查 VPN 是否已连接。 请就此向我提出建议。
【问题讨论】:
我对这个发展很陌生。 我在互联网上搜索了很多,但找不到任何合适的解决方案。 我想检查我的 iPhone 应用程序中可用的 VPN 连接,因为我正在从通过 VPN 连接的客户端机器获取数据。 我确实检查了 Internet 连接是否可用,但无法检查 VPN 是否已连接。 请就此向我提出建议。
【问题讨论】:
Ping 或查找仅应在 VPN 上可用的地址,如果您可以连接,则 VPN 正在使用中。
【讨论】:
如果你想 ping 功能,你可以这样做;
它对我有用
【讨论】:
我刚刚找到了另一种检查 VPN 连接的方法,但在任何地方都没有提到。 您可以使用 getifaddrs() 来获取当前的网络接口。 然后遍历它们并检查它们的名称。如果其中任何一个包含 tap、tun 或 ppp,则用户已连接 VPN。
- (BOOL)isVPNConnected
{
struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
int success = 0;
// retrieve the current interfaces - returns 0 on success
success = getifaddrs(&interfaces);
if (success == 0) {
// Loop through linked list of interfaces
temp_addr = interfaces;
while (temp_addr != NULL) {
NSString *string = [NSString stringWithFormat:@"%s" , temp_addr->ifa_name];
if ([string rangeOfString:@"tap"].location != NSNotFound ||
[string rangeOfString:@"tun"].location != NSNotFound ||
[string rangeOfString:@"ppp"].location != NSNotFound){
return YES;
}
temp_addr = temp_addr->ifa_next;
}
}
// Free memory
freeifaddrs(interfaces);
return NO;
}
UPD:在 iOS 9 上,上面的代码不起作用。无论VPN是否连接,接口都是相同的。在这种情况下尝试以下代码:
- (BOOL)isVPNConnected
{
NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings());
NSArray *keys = [dict[@"__SCOPED__"]allKeys];
for (NSString *key in keys) {
if ([key rangeOfString:@"tap"].location != NSNotFound ||
[key rangeOfString:@"tun"].location != NSNotFound ||
[key rangeOfString:@"ppp"].location != NSNotFound){
return YES;
}
}
return NO;
}
【讨论】:
要修复在 iOS 11 上测试的 Timur Suleimanov 答案,您需要寻找 IPSec 接口;
- (BOOL)isVPNConnected {
NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings());
NSArray *keys = [dict[@"__SCOPED__"]allKeys];
for (NSString *key in keys) {
if ([key rangeOfString:@"tap"].location != NSNotFound ||
[key rangeOfString:@"tun"].location != NSNotFound ||
[key rangeOfString:@"ipsec"].location != NSNotFound ||
[key rangeOfString:@"ppp"].location != NSNotFound){
return YES;;
}
}
return NO;
}
【讨论】:
这里是 Swift 版本的代码
var isVPNConnectd : Bool {
get {
if let dict = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as? Dictionary<String, AnyObject>,
let keys = (dict["__SCOPED__"] as? [String : AnyObject])?.keys {
for key in keys {
if key.range(of: "tap") != nil ||
key.range(of: "tun") != nil ||
key.range(of: "ipsec") != nil ||
key.range(of: "ppp") != nil {
return true
}
}
return false
}
else {
return false
}
}
}
【讨论】: