11

私は Apple の到達可能性コードを使用しており、ネットワークの到達可能性が変化したときとサーバー接続を開始する前の両方の初期通知を設定しています。コードは、Wi-Fi を使用していて、Wi-Fi アクセス ポイントをオフにしているときに機能します。ただし、Wi-Fi と基になるブロードバンド接続が機能している状態でアプリを起動し、アプリが実行されたら、ブロードバンド ルーターから Wi-Fi ルーターを切断します (つまり、Wi-Fi はオンになっていますが、インターネットはありません)。接続)、到達可能性チェックを行うと、得られるネットワーク ステータスは ReachableViaWiFi です。私は、reachabilityForInternetConnection と reachabilityWithHostName の両方を試しました。

Apple の到達可能性コードを使用して、Wi-Fi が接続されているが、基になるネットワーク接続がない状況を検出できるかどうかについてのアイデアはありますか?

ありがとう!

4

2 に答える 2

5

わかりました、これに対する答えを見つけました - Apple の到達可能性は、ホストへの実際の接続をテストしません。以下のSOリンクで@Zhamiによる回答を参照してください。

Cocoa/Objective-C で簡単な Ping メソッドを作成する方法

基本的に、最初にアプリを起動して到達可能性チェックを行うと、iOS は DNS ルックアップを行うようで、インターネットがない場合、チェックは失敗します。したがって、初めて reachability を確認すると、実際には意味のある値が返されます。ただし、アプリの起動時に接続し、しばらくしてからインターネット接続が失われた場合 (WiFi/3G/4G には接続されているが、基盤となるインターネット接続がない場合)、インターネットまたは指定したホストに到達できない場合でも、到達可能性チェックが到達可能を返します。もう。

したがって、リアルタイムで接続を本当に確認したい場合は、次の使用を検討してください。

-(BOOL) isConnected
{

    NSString* url = [NSURL URLWithString:@"http://www.google.com/m"];
    ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]];
    [request    setTimeOutSeconds:10];
//customize as per your needs - note this check is synchronous so you dont want to block the main thread for too long
    [request setNumberOfTimesToRetryOnTimeout:0];
    [request startSynchronous];

    NSError *error = [request error];
    if (error)
    {
        DLog(@"connectivity error");
        return NO;
    }
    else
    {
        DLog(@"connectivity OK");
        return YES;
    }

}
于 2012-11-16T08:21:54.097 に答える
1

これは非常に古い投稿ですが、参照用にここにとどまることができます。到達可能性のサンプル クラスでは、以下のコードを見つけることができます。

- (BOOL)startNotifier  
{  
    BOOL returnValue = NO;
    SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};

   if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context))
   {
        if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode))
        {
            returnValue = YES;
        }
   }

   return returnValue;
}

これにより、_reachabilityRef がネットワークの変更に合わせて更新されます。

于 2015-06-03T16:50:06.487 に答える