2009-04-06 12 views
5

ReachabilityというAppleのサンプルアプリは、接続を検出する方法を示しています。あなたが唯一の無線LANではなく、インターネットを持っている場合は、以下の2行目分を超えるためのアプリの屋台:Reachabilityサンプルアプリがここで停止しているのはなぜですか?

SCNetworkReachabilityFlags reachabilityFlags; 
BOOL gotFlags = SCNetworkReachabilityGetFlags(reachabilityRef, &reachabilityFlags); 

SCNetworkReachabilityGetFlagsがSystemConfiguration.frameworkから来ています。これを回避する方法に関する提案はありますか?

答えて

6

SCNetworkReachabilityGetFlags()は、あなたが説明した特定の状況下で返される時間が長い(例えば、WiFi経由のリモートホストの到達可能性を確認するなど)ために、インターネットのないルータへの接続)。いくつかのオプション:

オプション1.残りのアプリケーションを実行し続けることができるように、別のスレッドで呼び出します。

// Modified version of existing "updateStatus" method 
- (void)updateStatus 
{ 
    // Query the SystemConfiguration framework for the state of the device's network connections. 
    //self.remoteHostStatus   = [[Reachability sharedReachability] remoteHostStatus]; 
    self.remoteHostStatus = -1; 
    self.internetConnectionStatus = [[Reachability sharedReachability] internetConnectionStatus]; 
    self.localWiFiConnectionStatus = [[Reachability sharedReachability] localWiFiConnectionStatus]; 
    [tableView reloadData]; 

    // Check remote host status in a separate thread so that the UI won't hang 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSTimer *timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(updateRemoteHostStatus) userInfo:nil repeats:NO]; 
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
    [pool release]; 
} 
// New method 
- (void) updateRemoteHostStatus 
{ 
    self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; 
    [tableView reloadData]; 
} 

OPTION 2.リモートホストに接続しようとすると、タイムアウト値を使用して異なるAPI /関数を使用します。たとえば、次のようにReachabilityAppDelegate.mを変更します。そうすることで、あなたのアプリは放棄される前にX秒間しかハングしません。

注意すべきいくつかの他の事:

  • について、あなたは求めているSCNetworkReachabilityGetFlagsに固有の呼び出しは()(Reachability.mではすなわち、ライン〜399)www.apple.comかどうかを確認しようとしています「外部インターネット」が一般的に「到達可能」であるかどうかを推測するために「到達可能」である。
  • アップルのシステム構成フレームワークでは、「到達可能」とは、あなたが考えるものを意味するものではありません。公式の文書によると、「到達可能」とは理論上、コンピュータがホストXに接続できるが、実際に接続を最初に確立する必要がある(例えば、モデムを最初にダイヤルする)ことを意味するようだ。つまり、SCNetworkReachabilityGetFlags()は実際に接続を確立しません。
+0

ありがとうございました。タイムアウト時間が経過するとコールバックに戻るようにタイムアウトを作成するにはどうすればよいですか?タイムアウト間隔の前にUIWebViewDelegate :: webViewDidFinishLoadが呼び出された場合、タイムアウトをキャンセルできます。 – 4thSpace

+0

NSTimerのscheduledTimerWithTimeInterval:メソッドを見てください。たとえば、5秒後に何らかの方法を実行するタイマーを現在のスレッドに作成することができます。このメソッドは、SCNetworkReachabilityGetFlags()が終了したかどうかを確認し、終了していない場合は、タイムアウトロジックを実行します。 –