3

今日、ベータ版のアプリを公開しました。私はホテルにいましたが、WiFi のアクセス コードをまだ取得していませんでした。到達可能性をテストしているときに、本来あるべき失敗をしていないことに気付きました。WiFiに接続されていましたが、ログインしていなかったため、実際には何も到達できませんでした。このユースケースは、 reachabilityWithHostnameでカバーする必要があります。これが私のコードです:

AppDelegate.h で:

@interface AppDelegate : UIResponder <UIApplicationDelegate> {

    Reachability* hostReach;
    Reachability* internetReach;
    Reachability* wifiReach;
}

AppDelegate.m で:

    internetReach = [Reachability reachabilityForInternetConnection];
    [internetReach startNotifier];

    wifiReach = [Reachability reachabilityForLocalWiFi];
    [wifiReach startNotifier];

    hostReach = [Reachability reachabilityWithHostname: @"http://www.google.com"];
    [hostReach connectionRequired];
    [hostReach startNotifier];

接続が必要なモジュール:

- (BOOL) isInternetReachable
{
    Reachability *currentReach = [Reachability reachabilityForInternetConnection];
    NetworkStatus netStatus = [currentReach currentReachabilityStatus];


    return (netStatus == ReachableViaWiFi || netStatus == ReachableViaWWAN);
}

この状況をカバーする方法を知っている人はいますか?

4

4 に答える 4

3
...
[Reachability reachabilityWithHostname: @"http://www.google.com"]
...

Apple のドキュメントhttp://に従って、ホスト名 ( なし) を使用する必要があります。

于 2013-03-09T03:07:19.863 に答える
3

到達可能性を間違って使用しています。Apple のドキュメントは非常に悪いので、無視してください。

秘訣は、最初に到達可能性を調べにネットワーク接続を試みることです。NSURLConnection は無線を起動し、必要に応じて接続を確立します。もちろん、エラーを処理するようにしてください。

到達可能性は、ネットワークがオフラインになった後にオンラインに戻ったときに通知するのに役立ちます。事前に送受信できなかった情報がある場合は、その時点で再度接続を試みることができます。

また、メイン スレッドで Reachability を呼び出さないでください。低品質のネットワークでは、特にパケット損失が多いか、DNS が壊れている場合、Reachability によってアプリが 20 秒以上ハングし、システムが停止します。

于 2013-03-09T03:18:47.707 に答える
3

到達可能性を使用して、ネットワーク層を証明します。確認のためにサーバーから 1 バイトのファイルをロードしようとするよりも、問題がなければ問題ない場合。パフォーマンスは大丈夫です。

BOOL isOnline =  [[[RKClient sharedClient] reachabilityObserver] isReachabilityDetermined] != YES || [[RKClient sharedClient] isNetworkReachable];

    if(isOnline){
        NSData *data = [NSData dataWithContentsOfURL:[[URLManager sharedInstance]availabilityCheckURL]];

        NSString *strTemp = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        isOnline = [strTemp isEqualToString:@"1"];
    }
于 2013-08-20T12:22:06.983 に答える
0

Reachabilityの例では、SystemConfigurationのReachabilityAPIを使用しています。

アプリケーションによってネットワークスタックに送信されたデータパケットがローカルデバイスを離れることができる場合、リモートホストは到達可能であると見なされます。到達可能性は、データパケットが実際にホストによって受信されることを保証するものではありません。

それはおそらく2つのことをします:

  • (繰り返し?)ホスト名をIPアドレスに解決します。
  • ルーティングテーブルを監視し、そのIPの「到達可能性」が変更されたときにコールバックを配信します。

キャプティブポータル(別名Wi-Fiログインページ)の場合http://www.example.com、ログインページにリダイレクトするサイトとしてWebブラウザに表示される必要があります。これは、 (実際のIPに関係なく)www.example.com 解決する必要があり、ログインページにリダイレクトするためにそのIPにサイトが存在する必要があることを意味します。

到達可能性は、主に機内モードやWi-Fiからの切断などを検出する場合に役立ちます。

于 2013-03-09T03:25:53.057 に答える