私の iOS プロジェクトでは、特定のネットワーク操作の前にインターネットに接続するようにユーザーにメッセージを表示したいので、Apple の Reachability クラスを使用して次のチェックを作成しました。
Reachability *reach = [Reachability reachabilityWithHostName:@"google.com"];
if([reach currentReachabilityStatus] == NotReachable) {
// ...prompt user to establish an internet connection
} else {
// ...send an asynchronous request with a timeout
}
ただし、これには 1 つの非常に大きな問題がありました。デバイスが非常に損失の多いネットワーク上にある場合 (たとえば、OS X Lion のNetwork Link Conditionerでアップリンク パケット損失が 100% に設定されている場合)、[Reachability reachabilityWithHostName:@"google.com"]
メイン スレッドがブロックされる前に 30 秒間ブロックされます。接続を確認できませんでした。ただし、次のコードはブロックしません。
if([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == NotReachable) {
// ...prompt user to establish an internet connection
} else {
// ...send an asynchronous request with a timeout
}
Reachability の実装を見ると、これらのメソッドはどちらも を使用していますSystemConfiguration.framework
が、最初のメソッドは を使用SCNetworkReachabilityCreateWithName
し、2 番目のメソッドは を使用していますSCNetworkReachabilityCreateWithAddress
。最初のメソッドはブロックするのに、2 番目のメソッドはブロックしないのはなぜですか? 2 番目の方法は、接続を確認する良い方法ですか? それとももっと良い方法がありますか?