2011-07-21 10 views
2

私は自分のプロジェクトにネットワークステータス通知を統合し、このためにAppleのReachabilityクラスを使用しました。それにもかかわらず、私は自分のコードにバグを見つけたかもしれないし、おそらくシミュレータ自体によっても引き起こされるかもしれない。AppleのReachabilityソースコードに重いバグがありますか? (reachabilityForLocalWiFi)

ここでコード:今すぐ

- (void)start { 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(updateStatus:) 
               name:kReachabilityChangedNotification 
               object:nil]; 

    Reachability *wifi = [[Reachability reachabilityForLocalWiFi] retain]; 
    [wifi startNotifier]; 

} 

- (void)updateStatus:(NSNotification *)notice { 
    NetworkStatus s = [[notice object] currentReachabilityStatus]; 
    if(s == NotReachable) { 
     NSLog(@"Wifi not reachable"); 
    } else { 
     NSLog(@"Wifi is reachable"); 
    } 
} 

、 "開始" が呼び出されたときに何が起こるか:

1)UpdateStatusをメッセージが発射されていない - 大丈夫、バグではないかもしれないが、多分それはあります

2)Macの空港をオフにしてからnetworkstatusをeqにすると、updateStatusメッセージが表示されます。私は再び上でMacの空港の電源を入れたときに「NotReachable」するのではなく、UpdateStatusをメッセージが解雇され、NETWORKSTATUSは「NotReachable」ステー

私は状況に個別のリクエストをして、startメソッドでタイマーを追加

- (void)start { 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(updateStatus:) 
               name:kReachabilityChangedNotification 
               object:nil]; 

    Reachability *wifi = [[Reachability reachabilityForLocalWiFi] retain]; 
    [wifi startNotifier]; 

    /* Added */ 
    [NSTimer scheduledTimerWithTimeInterval:0.5F target:self selector:@selector(updateSeparately:) userInfo:nil repeats:YES]; 
    /* * */ 

} 

と "updateSeparately" 方法自体

/* Added */ 
- (void)updateSeparately:(NSTimer *)timer { 

    NetworkStatus s = [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus]; 

    if(s == NotReachable) { 
     NSLog(@"updateSeparately:Wifi not reachable"); 
    } else { 
     NSLog(@"updateSeparately:Wifi is reachable"); 
    } 
} 
/* * */ 

は私に次のシナリオのためのコンソールで次の出力を与える:

1)のAirMacがオンになって、私はこれはまだ )のAirMacがオフされた後、私は再びそれをオン(アプリケーション正しいと思わアプリを起動し、

... 
2011-07-21 09:41:41.242 MyProject[7091:207] updateSeparately:Wifi is reachable 
2011-07-21 09:41:41.742 MyProject[7091:207] updateSeparately:Wifi is reachable 
2011-07-21 09:41:42.242 MyProject[7091:207] updateSeparately:Wifi is reachable 
2011-07-21 09:41:42.264 MyProject[7091:207] --- Status Change --- 
2011-07-21 09:41:42.265 MyProject[7091:207] Wifi not reachable 
2011-07-21 09:41:42.743 MyProject[7091:207] updateSeparately:Wifi not reachable 
2011-07-21 09:41:43.243 MyProject[7091:207] updateSeparately:Wifi not reachable 
2011-07-21 09:41:43.743 MyProject[7091:207] updateSeparately:Wifi not reachable 
... 

オフのAirMacをオンランニング)

... 
2011-07-21 09:45:42.702 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:43.202 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:43.701 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:43.795 MyProject[7133:207] --- Status Change --- 
2011-07-21 09:45:43.795 MyProject[7133:207] Wifi not reachable 
2011-07-21 09:45:44.200 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:44.700 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:45.200 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:45.701 MyProject[7133:207] updateSeparately:Wifi is reachable 
2011-07-21 09:45:46.201 MyProject[7133:207] updateSeparately:Wifi is reachable 
2011-07-21 09:45:46.701 MyProject[7133:207] updateSeparately:Wifi is reachable 
... 

これはNetworkStatus変更が注目されていることを示して....しかし、なぜそれが約2秒間「NotReachable」に滞在しますか?

誰でも説明がありますか?

PS。同じことは、Appleの到達可能性のサンプルプロジェクト(利用可能ここではhttp://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html)で読書のための

おかげで、

マイザー

+0

あなたは端末で実行しようとしましたか? – bobbypage

答えて

2

使用この到達可能性クラスhere

私はすべての私のアプリでそれを使用して、それをたまたま本当にうまくいく。

2

この時点では(9か月後)、私はこのReachabilityのものをチェックしていましたが、到達できないものから到達できないものへの2秒の遅延の可能性のある説明が見つかりました。重要

http://developer.apple.com/library/ios/samplecode/Reachability/Listings/ReadMe_txt.html#//apple_ref/doc/uid/DTS40007324-ReadMe_txt-DontLinkElementID_7で説明したように、名前解決に問題がある可能性があります:到達可能性は、それがそのホストの到達可能性を判断することができます 前に、ホスト名を解決するためにDNSを使用する必要があり、これは、特定のネットワーク接続に時間 がかかる場合があります。このため、APIは名前解決が完了するまで NotReachableを返します。この遅延は、一部のネットワークのインターフェイスに表示される です。

名前付きホスト(デフォルトでapple.com)のチェックをipに変更すると問題が解決するはずです。

関連する問題