如何检测iPhone的VPN连接?

我需要检测iphone是否连接到VPN,编程方式。 我正在开发一个应用程序,试图加载URL,这个页面只有当设备连接到VPN时才打开。 在加载这个URL之前,我需要检查VPN连接。 我尝试了以下。 但是这并不像预期的那样工作。

- (BOOL)checkForVPNConnectivity { NSDictionary *dict = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings()); //NSLog(@"cfnetwork proxy setting : %@", dict); return [dict count] > 0; } 

我不认为应该通过检查CFNetworkCopySystemProxySettings()中的非零数量的元素来确定VPN连接。 (例如,我在WiFinetworking上查看条目,但在VPN上查看条目。)

所以有两点意见:

  1. 我会考虑使用SystemConfiguration.framework并使用以下代码与您的VPN上的东西的主机名:

     - (BOOL)checkForConnectivity:(NSString *)hostName { BOOL success = false; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]); SCNetworkReachabilityFlags flags; success = SCNetworkReachabilityGetFlags(reachability, &flags); CFRelease(reachability); NSLog(@"success=%x", flags); // this is the standard non-VPN logic, you might have to alter it for VPN connectivity BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); if (isAvailable) { NSLog(@"Host is reachable: %d", flags); return YES; }else{ NSLog(@"Host is unreachable"); return NO; } } 

    假设success是非零的,你可能不得不做一些关于flags位设置的实证研究。 有关这些标志的技术定义,请参阅SCNetworkReachability参考 。 我听说他们得到kSCNetworkReachabilityFlagsReachable | kSCNetworkReachabilityFlagsTransientConnection 当VPN连接时, kSCNetworkReachabilityFlagsReachable | kSCNetworkReachabilityFlagsTransientConnection ,但我没有一个VPN,所以我不能testing这种说法。 我build议尝试使用和不使用VPN,看看你是否得到不同的flags返回。

  2. 无关的问题,您的代码示例将泄漏。 如果使用ARC,不要忘记使用CFBridgingRelease__bridge_transfer 。 或者不pipe是否在ARC中,在返回之前显式调用CFRelease

    如果在最新版本的Xcode中运行静态分析器(按shift + command + B或从“Product”菜单中select“Analyze”),它会警告您关于Core Foundation调用的内存pipe理。

    无论如何,这是我倾向于在ARC中处理它的方式:

     - (BOOL)checkForVPNConnectivity { NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings()); return [dict count] > 0; } 

对于上述问题,您可以使用简单的解决方法。

只需使用苹果可达性来检查哪些设备连接到互联网或不。 如果没有抛出互联网连接错误。如果是的话,尝试使用NSURLConnection访问您的VPN依赖的URL。如果您获得成功200这样,即您连接到VPN.If此请求返回主机找不到或任何错误,如-1001意味着你没有连接到VPN.Then你可以抛出相应的VPN连接错误的用户。快乐的编码…. Arun kumar

欲了解更多信息,请参阅我的博客http://aruntheiphonedeveloper.blogspot.in