iOS设备判断是否开启VPN
1.导入头文件
#include <ifaddrs.h>
2.声明变量
NSString *const kRRVPNStatusChangedNotification = @"kRRVPNStatusChangedNotification";
{
BOOL _vpnFlag;
}
3.具体实现方法:
- (BOOL)isVPNOn
{
BOOL flag = NO;
NSString *version = [UIDevice currentDevice].systemVersion;
// need two ways to judge this.
if (version.doubleValue >= 9.0)
{
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){
flag = YES;
break;
}
}
}
else
{
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:@"ipsec"].location != NSNotFound ||
[string rangeOfString:@"ppp"].location != NSNotFound)
{
flag = YES;
break;
}
temp_addr = temp_addr->ifa_next;
}
}
// Free memory
freeifaddrs(interfaces);
}
if (_vpnFlag != flag)
{
// reset flag
_vpnFlag = flag;
// post notification
__weak __typeof(self)weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
__strong __typeof(weakSelf)strongSelf = weakSelf;
[[NSNotificationCenter defaultCenter] postNotificationName:kRRVPNStatusChangedNotification
object:strongSelf];
});
}
return flag;
}
网友评论