对于我们的应用程序,每当应用程序用户尝试发布消息时,我们都会使用以下代码来检查互联网连接。当我们测试该功能时,它在打开飞行模式时工作正常。然后,当我们关闭飞行模式时,对连接的调用仍然返回NO。可能是什么原因呢?我们是否需要在订单中增加"设置"才能正确处理?例如监听网络状态更改通知?
+ (BOOL)connected
{
Reachability *hostReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [hostReach currentReachabilityStatus];
return !(netStatus == NotReachable);
}
苹果工程师认为这完全依赖于Rechability。
来自 SO 帖子(块引用的来源)
On a WWDC talk this year the Apple engineer on stage recommended users to never base
the application internet access on the Reachability example app status. Often
reachability doesn't provide a complete information (it is based on a complex mechanism)
and the suggestion provided by the engineer was this:
1. try to do your internet connection, whatever it is the Reachability status;
then set your UI hint based on success/fail result
2. if it fails due to networking issue, then register to Reachability and retry again
when Reachability gives the green light; this is needed when you want to recover
automatically from the fail condition
3. in any case give the user the possibility to "force a retry", whatever is the
Reachability status. If it succeeds, reset your UI hint immediately.
我做了什么?
例如,每次我需要建立连接时
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString
stringWithFormat:@"http://myadress.com"]]];
[self performSelectorOnMainThread:@selector(responseHandler:)
withObject:data waitUntilDone:TRUE];
- (void)responseHandler:(NSData *)responseData {
if(!responseData) {
ReachabilityController *reachability = [[ReachabilityController alloc] init];
[reachability checkReachability];
return;
}
// you handle your data
}
那里发生的事情是,只有在连接失败时才会测试可达性。我制作了一个通用的可达性控制器,只处理可达性。我这样做了,这样我每次发出请求时都可以从所有其他控制器发出调用。
我的 ReachabilityController.m 看起来像
-(void) checkReachability {
Reachability* internetAvailable = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [internetAvailable currentReachabilityStatus];
NSString *messageText;
if (netStatus == NotReachable)
{
messageText = [NSString stringWithFormat:@"Internet access not available"];
}
else
{
Reachability *netReach = [Reachability reachabilityWithHostName:host];
NetworkStatus hostStatus = [netReach currentReachabilityStatus];
if (hostStatus == NotReachable)
{
messageText = [NSString stringWithFormat:@"Host Unreachable"];
}
else
{
messageText = [NSString stringWithFormat:@"Problem with remote service"];
}
}
NSLog(@"%@", messageText);
}
它不会使您的应用程序崩溃,因为您自己处理"nil"数据参数,最后确定原因。
希望这有帮助!
更新:
如果您显示有关互联网连接的虚假信息,Apple 可能会拒绝您的应用程序。他们非常认真地对待自己在iPhone上的声誉。如果互联网连接可用,但如果您的应用程序报告互联网连接不可用,这将被视为非常严重
您应该只尝试网络连接,而不是为此使用可达性。NSURLConnection将导致无线电启动。但是,请确保在失败时/如果失败时处理错误。
您正在使用某种方便的构造函数来检查可访问性 - 这将不起作用。
有关如何使用可达性的最佳示例之一,请参见 SO:
https://stackoverflow.com/a/3597085/653513
或者 EricS 建议的,根本不使用可达性 - 这是一个可行的选择。