iOS 判断当前是否连接VPN

今天偶然看到了这位兄台的文章https://www.jianshu.com/p/8005d7e05944判断是否是vpn,哈哈这哥们还真是脑洞大开。
其实在这位老兄https://github.com/dustturtle/RealReachability的项目包含了检测VPN的方法

通过判断tap tun ipsec ppp 这些字段是否在CFNetworkCopySystemProxySettings里来判断vpn是否开启

局部代码

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;
            }
        }

整个方法

- (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);
   }


   return flag;
}

这个是判断系统的vpn状态,还有一种是调起vpnExtension或着说NEVPNManager的时候的vpn状态可以通过实例化NEVPNManager,然后通过manager.connection.status来获取当前的vpn状态

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 每到月初,我的心里总是多了一份期待,期待着“梦想清单大实验”的学习攻略揭晓的那一刻,这个月的学习书单是《改变现在的...
    优质写作侠阅读 691评论 1 7
  • 第三天的分享 先来说说,那个拥有美女歌声的天使美女,她分享的是自己在停尸房里的感受。 当她的亲人离去的时候,她陪在...
    玄月之佑阅读 264评论 0 2
  • 我一直相信龙是存在的,至少,它以前是存在的。只不过它消失在了人们的视野,很多东西都像这样,像我一直也天真的认为,所...
    振振公子阅读 246评论 0 0
  • 分享者/ 辽阳边义 叶嘉莹----唐宋词十七讲之周邦彦 在中国词史上,周邦彦是一个“结北开南”的人物。转变在哪里呢...
    舞蝶儿阅读 1,552评论 0 2