本物のインターネット接続ステータスを取得しようと懸命に努力しています。Apple の Reachability を使用しましたが、wifi 接続のステータスのみが表示されます。つまり、デバイスが wifi 経由で (ルーターまたはホットスポットに) 接続されているが、wifi ルーターまたはホットスポット自体がインターネットに接続されていない場合はカバーされません。このシナリオは、wifi ルーターからインターネット入力ケーブルを抜くことで再現できます。到達可能性の通知機能は、とReachableViaWiFi
の両方に対して返されます。私はこの問題をかなり修正しています。私も試してみましたが、バッテリーを消耗しすぎており、個人的にはバックグラウンド スレッドで URL 要求を出し続けるソリューションが好きではありません。reachabilityForInternetConnection
ReachabilityWithHostName
NSURLConnection
これが私が使用しているコードです(SOフェローの礼儀ですが、正確なリンクは覚えていません)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.google.com"] retain];
[hostReachable startNotifier];
次にオブザーバーメソッドで:
- (void) checkNetworkStatus:(NSNotification *)notice{
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
NSLog(@"The internet is down.");
self.isInternetReachable = NO;
break;
}
case ReachableViaWiFi:
{
NSLog(@"The internet is working via WIFI.");
self.isInternetReachable = YES;
break;
}
case ReachableViaWWAN:
{
NSLog(@"The internet is working via WWAN.");
self.isInternetReachable = YES;
break;
}
}
NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus)
{
case NotReachable:
{
NSLog(@"A gateway to the host server is down.");
self.isHostReachable = NO;
break;
}
case ReachableViaWiFi:
{
NSLog(@"A gateway to the host server is working via WIFI.");
self.isHostReachable = YES;
break;
}
case ReachableViaWWAN:
{
NSLog(@"A gateway to the host server is working via WWAN.");
self.isHostReachable = YES;
break;
}
}
}