2012-04-11 17 views
6

Reachabilityクラスを使用して、インターネット接続が利用可能かどうかを確認します。問題は、WiFiが利用可能だがインターネットではない場合です。- (NetworkStatus) currentReachabilityStatusメソッドが時間がかかりすぎます。iosで到達可能タイムアウトを定義する方法

私のコード:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"]; 
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

アプリケーション一時的に2行目に "凍結"。この待機の最大時間を定義するにはどうすればよいですか?

+0

wifiは利用できますが、インターネットは使用できません。その意味?? –

+5

これは、ルータとiPad間の無線LAN接続が正常ですが、インターネットに接続できないことを意味します。 – Anthony

+0

ok ..それを手に入れました。 :) –

答えて

3

私はそうは思わない。しかし、もっと重要なことに、私はあなたが望むと思うとは思っていません(偽陽性になるかもしれません)。到達可能性がそのコースを走らせるようにしましょう。

Reachabilityのデモプロジェクトを見てみると、インターネットが必要なときにreachabilityWithHostNamecurrentReachabilityStatusを呼び出すという概念はありません。あなたは、あなたのアプリケーションデリゲートのdidFinishLaunchingWithOptionsの間にcurrentReachabilityStatusを呼び出し、通知を設定し、インターネット接続が変更されたときにReachabilityはあなたにと通知します。私はcurrentReachabilityStatusへのその後のチェックは、(接続性に関係なく)私が(スタートアップ時に)到達可能性を設定したときに十分速いことが分かりました。 (b)ジャストインタイムで接続性をチェックする。

あなたが絶対に処理を開始する必要がある場合は、それをバックグラウンドにプッシュできるかどうかです(例:dispatch_async())。たとえば、私のアプリはサーバーから更新を取得しますが、バックグラウンドでそれが起こっているため、私も自分のユーザーも遅延を認識しません。

0

同じ問題が発生していましたが、タイムアウトを指定する方法が見つかりました。 AppleのReachability Classの中でこのメソッドを置き換えました。

- (NetworkStatus)currentReachabilityStatus 
{ 
NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL  SCNetworkReachabilityRef"); 
//NetworkStatus returnValue = NotReachable; 
__block SCNetworkReachabilityFlags flags; 

__block BOOL timeOut = NO; 
double delayInSeconds = 5.0; 

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){ 

    timeOut = YES; 

}); 

__block NetworkStatus returnValue = NotReachable; 

__block BOOL returned = NO; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) 
    { 
     if (_alwaysReturnLocalWiFiStatus) 
     { 
      returnValue = [self localWiFiStatusForFlags:flags]; 
     } 
     else 
     { 
      returnValue = [self networkStatusForFlags:flags]; 
     } 
    } 
    returned = YES; 

}); 

while (!returned && !timeOut) { 
    if (!timeOut && !returned){ 
     [NSThread sleepForTimeInterval:.02]; 
    } else { 
     break; 
    } 
} 

return returnValue; 
} 
関連する問題