web-dev-qa-db-ja.com

AFNetworking 2.0の到達可能性

AFNetworking 2.0と「AFNetworkReachabilityManager」を使用して、ユーザーがインターネットに接続されているかどうかを確認しようとしていますが、うまくいかないようです。インターネットがオフになっていても、有効なインターネット接続があることは常に返されます。これは私のコードです:

 -(BOOL)connected {

   __block BOOL reachable;

    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        switch (status) {
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"No Internet Connection");
                reachable = NO;
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");

                reachable = YES;
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G");
                reachable = YES;
                break;
            default:
                NSLog(@"Unkown network status");
                reachable = NO;
                break;

                [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        }
    }];

    return reachable;

}

このメソッドは、viewDidLoadメソッドから呼び出されます。動作していないため、コードに何か問題がありますか?

そのブロックは、到達可能性changesの場合にのみ実行されるためです。

現在のステータスを取得するには、次を実行できます。

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}
64
Marcelo Fabri

これを必要以上に難しくしている。これを試して:

- (void)viewDidLoad {
   [super viewDidLoad];

   [[AFNetworkReachabilityManager sharedManager] startMonitoring];

}

- (BOOL)connected {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}   

ステータスが変更されたときにも通知を受ける場合は、setReachabilityStatusChangeBlockを実装します

お役に立てれば!

102
backofthecup

コードが機能しない2つのコードエラーがあります。

まず、到達可能性の変化に応じて起動されるブロック内で「監視を開始」する呼び出しが発生します。したがって、ブロックは起動しません(他の場所で監視を開始しない限り)。

第二に、そのブロックがいつ実行されるかについての保証はありません。その結果、初期化された値を「到達可能」が返すことが常に表示されます。明らかにこれは通常nullです。最初のエラーを修正したとしても、戻る前にブロックが起動するという保証はありません(実際にはかなりありそうにありません)。

最後に、より一般的なレベルでは、onlyを非同期で実行できるコードを同期的にテストしようとしています。つまり、到達可能性マネージャーが到達可能性を瞬時に正確に判断することは不可能です。 「私はWiFiを使用していると思う」または「3Gを使用していると思う」と言うことができますが、実際にできるかどうかを確認する必要もありますreachインターネット(したがって、名前の到達可能性)それが確実になる前に。到達可能性とは、単に「wifiを持っている」または「3gを持っている」という接続だけではなく、それを介してインターネットにアクセスできるかどうかも重要です。これは、デバイスが実際にリクエストを送信する必要があることを意味し、これは技術的には同期的に行うことができますが、本のすべてのルールはネットワークコードmustを非同期に、そして良い方法で行うことを主張しています理由。同期した場合は、ネットワークコールが返されるまでUIをブロックします。適切なタイムアウトに応じて、おそらく30秒、40秒、50秒、さらには60秒後です。

あなたがすべきことは、アプリの到達可能性シングルトン監視を開始し、アプリデリゲートのメソッドをロードし、後でそのデータを取得することです。アプリの構造を知らなくても、正確さを保証しようとはしませんが、少なくともある程度は役立つはずです。

11
RonLugge

これを試して、

AppDelegatedidFinishLaunchingWithOptionsメソッド

{ // SETUP AFNETWORKING's NETWORK INDICATOR AND REACHABILITY
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
}

HttpManagerクラスでは、

- (BOOL)isNetworkRechable {

    if ([AFNetworkReachabilityManager sharedManager].reachable) {

        if ([AFNetworkReachabilityManager sharedManager].isReachableViaWiFi)
            NSLog(@"Network reachable via WWAN");
        else
            NSLog(@"Network reachable via Wifi");

        return YES;
    }
    else {

        NSLog(@"Network is not reachable");
        return NO;
    }
}

yourViewControllerで、

[[HttpManager sharedObject] isNetworkRechable];

:最初はチェックしないでくださいnetworkRechability動作しないためです。そのため、少なくとも1秒待ってから確認してください。

7
Balaji G

私の経験では、

_[[AFNetworkReachabilityManager sharedManager] startMonitoring];
_

setReachabilityStatusChangeBlockを実行するのに少し時間がかかるので、-(BOOL)connectedから値を返す必要はありません。

そのため、ネットワークが接続/切断されたら、いくつかのタスクを実行できます。

次の関数は、その場で(同期的に)接続を確認するのに最適です。

_[AFNetworkReachabilityManager sharedManager].reachable;
_
6
For Guru

他の答えは間違っています!これを使用して可用性を確認することをお勧めします。

if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable)

理由は、最初にステータス変更ブロックが呼び出されるまでnetworkReachabilityStatusがAFNetworkReachabilityStatusUnknownに設定され、コードがネットワークが利用できない場合に利用できないとコードが判断するのを防ぐためです。

3
user5664685
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [self checkNetworkReachability];
}    


+(BOOL) isReachable{
   return [AFNetworkReachabilityManager sharedManager].reachable;
}

+(void) checkNetworkReachability{
        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

            // Check the reachability status and show an alert if the internet connection is not available
            switch (status) {
                case -1:
                    // AFNetworkReachabilityStatusUnknown = -1,
                    NSLog(@"The reachability status is Unknown");
                    break;
                case 0:
                    // AFNetworkReachabilityStatusNotReachable = 0
                    NSLog(@"The reachability status is not reachable");
                    break;
                case 1:
                    NSLog(@"The reachability status is reachable via wan");
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
                    break;
                case 2:
                    // AFNetworkReachabilityStatusReachableViaWiFi = 2
                    NSLog(@"The reachability status is reachable via WiFi");

                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
                    break;

                default:
                    break;
            }

        }];
    }
1
Bassant Ashraf