objective-c - 如何在 iOS 上使用 Objective-C 触发按需 VPN

标签 objective-c ios7 dns httprequest vpn

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

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

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 或 < strong>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 on-demand”是否仅适用于 URL 连接?

最佳答案

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

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

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

关于objective-c - 如何在 iOS 上使用 Objective-C 触发按需 VPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22916088/

相关文章:

ios - 如何在iOS7中绘制透明的UIToolbar或UINavigationBar

ios - 在 Objective C 中使用类别

ios - UISegmentedControl 段顺序困惑

c++ - Xcode 中基于文件类型的奇怪语法错误

ios7 - CFURLDestroyResource 现在已在 iOS7 中弃用。用什么代替?

用于管理 dns 和 dhcp 的 Python 模块

java 。从包中获取 URL

c# - 领域驱动设计聚合引用问题

objective-c - 通过 AVAssetReader 读取样本

ios - 在 TabViewController 和 NavigationController 之间导航