我对这个开发还是个新手。我在互联网上找了很多,但找不到任何合适的解决方案。当我从通过虚拟专用网连接的客户机获取数据时,我想检查iPhone应用程序中可用的虚拟专用网连接。我确实检查了Internet连接是否可用,但无法检查VPN是否已连接。请在这方面给我提个建议。
发布于 2012-06-01 20:18:56
如果你想要ping函数,你可以这样做;
使套接字不阻塞
它对我很有效
发布于 2014-07-18 18:00:09
我刚刚找到了另一种检查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;
}
更新:在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;
}
发布于 2017-11-13 00:50:38
要修复在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;
}
https://stackoverflow.com/questions/8131807
复制相似问题