【问题标题】:How to trigger on-Demand VPN with Objective-C on iOS如何在 iOS 上使用 Objective-C 触发按需 VPN
【发布时间】:2014-05-19 21:54:17
【问题描述】:

我有一个 iPad 应用程序,它使用 C 中的套接字库打开到 Intranet 中服务器的套接字连接。在启动应用程序时,如果 iPad 没有连接到同一网络(即无法解析服务器的域名),我希望它会自动建立 VPN 连接。但是应用程序中的套接字调用和 getaddrinfo() 方法不能做到这一点。他们只是无法连接到服务器而没有尝试打开 VPN 连接。

使用 Safari,浏览到地址“http://...”可以正常工作并成功启动 VPN。如果我在应用程序的开头使用下面的代码发出类似的 HTTP 请求,我可以让它启动 VPN 连接。但是发送一个额外的http请求对我来说是最好的解决方案。 VPN 应该在 iPad 需要解析域名时启动,而不依赖于协议或远程端口号。

NSString* urlForVPN = @"http://..";
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlForVPN] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

在 Apple 开发者网站上,它说“避免在连接到主机之前解析 DNS 名称。连接到主机的首选方式是使用接受 DNS 名称的 API,例如 CFHost 或 CFNetService" (https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html)。因此,我希望以下代码在尝试解析服务器名称时应该启动 VPN,但它也不起作用。它只是无法获取IP地址。我必须手动打开 VPN 才能连接到服务器。

NSString* hostname = @"myserver";
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname);
BOOL isSuccess = CFHostStartInfoResolution(hostRef, kCFHostAddresses, nil);

如何让应用了解它需要启动 VPN? “按需 VPN”是否仅适用于 URL 连接?

【问题讨论】:

    标签: objective-c ios7 dns httprequest vpn


    【解决方案1】:

    根据我通过文章和第一手资料了解到的情况,VPN-on-Demand 只会在您使用利用 WebKit 的 Apple 库(NSURLSession、NSURLConnection 等)时触发。

    因此基于套接字的网络请求无法触发 Apple 的按需 VPN。

    出现支持这一点的文档可在此处找到: https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html#//apple_ref/doc/uid/TP40010220-CH4-SW2

    【讨论】:

      【解决方案2】:

      对于遇到此问题的人,使用 POSIX 套接字不会触发按需 VPN,因为这些规则按域匹配,而这些套接字没有域信息。

      一种解决方法是通过通常的 NSURLSession / NSURLConnection 向正确的域发起一个虚拟请求,以触发 VPN。

      您可能还想get the reachability status 并检查“kSCNetworkReachabilityFlagsTransientConnection”,当 VPN 连接可用时(因为许多现代 VPN 基于 ppp),它凭经验会出现。通过这种方式,您可以检测 VPN 何时关闭以启动另一个虚拟请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-28
        • 2012-07-21
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2022-01-08
        • 1970-01-01
        相关资源
        最近更新 更多