3

アプリが起動したら、すぐにインターネットに接続する必要があるため、到達可能性を確認します。ただし、私の問題は、 の即時確認がないように見えることです。つまりNetworkStatus、到達可能性がセットアップされた直後に、接続があるかどうかを確認し、実際に WiFi に接続しているかどうかに関係なく、接続がないことを返します。 /3G、または無線をオフにしました。

applicationDidFinishLaunching の直後に、「ReachableViaWiFi」をログに記録する通知があるため、実際にインターネット接続を取得していることを確認できます。

私は何を間違っていますか?有効なインターネット接続がすぐに確認されないのはなぜですか?

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];
    if (netStatus == NotReachable) {
        ErrorViewController *errorViewController = [[ErrorViewController alloc] initWithNibName:@"ErrorView" bundle:[NSBundle mainBundle]];
        [tabBarController.view removeFromSuperview];
        [window addSubview:[errorViewController view]];
        return;
    }
}

-(void)setupReachability {
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name:kReachabilityChangedNotification object: nil];
    hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
    [hostReach startNotifier];
}

-(void)reachabilityChanged:(NSNotification *)notification {
    Reachability* curReach = [notification object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    NetworkStatus netStatus = [curReach currentReachabilityStatus];
    BOOL connectionRequired = [curReach connectionRequired];
    switch (netStatus)
    {
        case NotReachable:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS];
            NSLog(@"NotReachable");
            connectionRequired = NO;  
            break;
        }

        case ReachableViaWWAN:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kREACHABLEVIAWWAN forKey:kREACHABILITYSTATUS];
            NSLog(@"ReachableViaWWAN");
            break;
        }
        case ReachableViaWiFi:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS];
            NSLog(@"ReachableViaWiFi");
            break;
        }
    }
}
4

3 に答える 3

4

OK、自分でいくつかのことを試した後、コードを 1 行追加することで、実際に動作するようになりました。

-(void)setupReachability {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotificationV2 object:nil];
    hostReach = [[ReachabilityV2 reachabilityWithHostName:@"www.google.com"] retain];
    [hostReach connectionRequired]; // this line was added, and apparently forces a connection requirement..
    [hostReach startNotifier];
}
于 2010-01-28T20:52:44.290 に答える
2

Reachability のサンプル コードは、非同期のコールバック/通知を提供して、到達可能性がいつどのように変更されたかを通知します。コードを機能させるには、コードを次のように変更する必要があります。

- (void) applicationDidFinishLaunching:(UIApplication *)application {

 // setup reachability
    [self setupReachability];
 }

次に、コールバックで通知を受け取ると、アプリケーションの必要に応じて反応します。

つまり、 でネットワークの状態をすぐに確認することはできませんapplicationDidFinishLaunching()。そうする場合は、同期/ブロック方法を使用する必要があります。たとえば、この質問に対する私の回答で提供されているコードを使用できます。

于 2010-01-28T17:27:06.680 に答える
1

hostReach をクラス レベル変数として作成する必要があります。

于 2011-03-29T12:43:16.900 に答える