3

私のコードでは、インターネットをチェックするために 3 つの方法を使用していましたが、これらには制限があります。

1/ 到達可能性方法:

- (BOOL)isInternetOk
{
    Reachability *curReach = [Reachability reachabilityWithHostName:@"apple.com"];
    NetworkStatus netStatus = [curReach currentReachabilityStatus];

    if (netStatus != NotReachable) //if internet connexion ok
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

制限: ほとんどの場合は機能しますが、私の問題は、インターネットに接続せずに Wi-Fi アンテナを接続すると、接続は問題ないと表示され、正しくないことです。これは良い解決策ではありません。Reachability で使用できないように見えるステータス コードを確認する必要があります。

2/sendSynchronousRequest:

- (BOOL)isInternetOk2
{
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init];
    NSURL* URL = [NSURL URLWithString:@"https://www.google.com"];
    NSError *error = nil;

    [request setURL:URL];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setTimeoutInterval:15];

    NSData* response2 = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    if (error)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

制限:それも機能しますが、私の問題は、タイムアウトが発生すると、常に発生する可能性があり、長時間アプリがフリーズすることです. スレッドに入れると、dispatch_asyncでリクエストを行うと、レスポンスが考慮されていないようです。

3/sendAsynchronousRequest:

    NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"]];
    request.timeoutInterval = 10;

    [NSURLConnection sendAsynchronousRequest:request queue:myQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
         NSLog(@"response status code: %ld, error status : %@", (long)[httpResponse statusCode], error.description);

         if ((long)[httpResponse statusCode] >= 200 && (long)[httpResponse statusCode]< 400)
         {
             // do stuff
             NSLog(@"Connected!");
         }
         else
         {
             NSLog(@"Not connected!");
         }
     }];

制限:それがより良い方法だと思いますが、私の問題は、コードのあらゆる場所にそれを書かなければならないことです。これは汚染になります。負担の少ない方法はないかと考えています。

あなたはそれについてどう思いますか?アプリをフリーズせずにインターネットが機能しているかどうかを簡単に確認する別の方法はありますか?

前もって感謝します。

4

2 に答える 2