2012-06-15 53 views
3

对于我们的应用程序,只要应用程序用户试图发布消息,就会使用以下代码来检查Internet连接。当我们测试该功能时,在打开飞行模式时它可以正常工作。然后,当我们关闭飞行模式时,连接的呼叫仍然返回NO。这可能是什么原因?我们是否需要额外的“设置”顺序才能正确使用?如收听网络状态更改通知?iOS可访问性测试

+ (BOOL)connected 
{ 
    Reachability *hostReach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];  
    return !(netStatus == NotReachable); 
} 

回答

1

您应该尝试网络连接,而不是使用Reachability。 NSURLConnection将导致无线电启动。尽管如此,一定要在出现/失败时处理错误。

0

您正在使用某种便利构造函数来检查可达性 - 这不起作用。

一个如何使用可达性最好的例子是在这里发现SO:

https://stackoverflow.com/a/3597085/653513

或者有啥埃里克斯建议,不要使用可达性可言 - 这是一个可行的选择。

+0

当我们在主线程上调用Reachability时,我们发现代码中有很多超时崩溃。这会在某些不良网络条件下发生。因此,现在我们只在后台线程中调用它,并且仅将其用于“网络已发布”通知,而不是“可用于网络”测试。 – EricS

+0

您不应_call_可达性。您将其设置并收听其通知。 –

2

苹果工程师建议完全依赖Rechability。

SO post(块引用来源)

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,它只处理可达性。我这样做,这样我每次发出请求时都可以从其他所有控制器拨打电话。

我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); 
} 

它不会崩溃您的应用程序,当你正在处理“零”数据参数自己,最后你确定原因。

希望这有助于!

UPDATE:

苹果可能会拒绝你的应用程序,如果你显示有关Internet连接一个假消息。他们对iPhone的声誉非常认真。如果互联网连接可用,但如果您的应用报告互联网连接不可用,它将被认为是非常严重的