如何在 iOS 上使用 Objective-C 触发按需 ***

Posted

技术标签:

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

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

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

NSString* urlFor*** = @"http://..";
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlFor***] 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)。因此,我希望以下代码在尝试解析服务器名称时应该启动 ***,但它也不起作用。它只是无法获取IP地址。我必须手动打开 *** 才能连接到服务器。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何在 iOS 上使用 Objective-C 触发按需 ***的主要内容,如果未能解决你的问题,请参考以下文章

创建跨平台c ++触摸管理器。在c ++中传递Objective-c对象涉及代码

iOS 上 MonoTouch 中的多点触控

如何从Javascript调用Objective-C方法并将数据发送回iOS中的Javascript?

无法在 Tableview (ios 7) 上禁用多点触控

iOS 11 中的 SafeArea:如何在没有安全区域的情况下使用自定义导航栏在主屏幕上添加来自 Objective-c 代码的视图

如何在 iOS(Objective-C)中分享到 Facebook Messenger 应用程序的链接?