8

本物のインターネット接続ステータスを取得しようと懸命に努力しています。Apple の Reachability を使用しましたが、wifi 接続のステータスのみが表示されます。つまり、デバイスが wifi 経由で (ルーターまたはホットスポットに) 接続されているが、wifi ルーターまたはホットスポット自体がインターネットに接続されていない場合はカバーされません。このシナリオは、wifi ルーターからインターネット入力ケーブルを抜くことで再現できます。到達可能性の通知機能は、とReachableViaWiFiの両方に対して返されます。私はこの問題をかなり修正しています。私も試してみましたが、バッテリーを消耗しすぎており、個人的にはバックグラウンド スレッドで URL 要求を出し続けるソリューションが好きではありません。reachabilityForInternetConnectionReachabilityWithHostNameNSURLConnection

これが私が使用しているコードです(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;

        }
}
}
4

3 に答える 3

7

到達可能性によると、wifi だけでなく WWAN/3G とインターネット アクセスがないこともチェックしますが、WIFI 以外をチェックしないのはなぜだと思いますか?

 typedef enum {

    NotReachable = 0,

    ReachableViaWiFi,

    ReachableViaWWAN

} NetworkStatus;

特定のホストへの到達可能性を確認したい場合は、このようにホストを自分で設定できます

Reachability *hostReach = [Reachability reachabilityWithHostName: @"www.google.com"];

NetworkStatus netStatus = [hostReach currentReachabilityStatus];

 switch (netStatus)
    {
        case ReachableViaWWAN:
        {
            NSLog(@"WWAN/3G");
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"WIFI");
            break;
        }
        case NotReachable:
        { 
            NSLog(@"NO Internet");
            break;
        }
}
于 2013-02-28T22:09:22.337 に答える
0

切断されていてもWifiフラグを取得していました。Reachability.m メソッドにはバグがあります。

- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags

戻り値として BOOL を使用しますが、3 つの値を持つ構造体の値を代入します。

typedef enum : NSInteger {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN
} NetworkStatus;

したがって、Wifi または Cellular が使用可能であるかどうかにかかわらず、ReachableViaWiFi になります (BOOL は 0 または 1 にすることができますが、2 つにすることはできません)。

これを修正するには、上記のメソッドを変更するだけです。

BOOL returnValue = NotReachable;

このため:

int returnValue = NotReachable;

そして、あなたは行ってもいいです。それが役に立てば幸い。

于 2013-11-07T15:24:45.863 に答える