web-dev-qa-db-ja.com

AFNetworking 2.0で到達可能性を設定する

新しい2.0 AFNetworking を使用して到達可能性を設定しようとしています。

私のAppDelegateで、sharedManagerを初期化します。

// Instantiate Shared Manager
[AFNetworkReachabilityManager sharedManager];

次に、関連するVCメソッドで、isReachableかどうかを確認します。

// Double check with logging
if ([[AFNetworkReachabilityManager sharedManager] isReachable]) {
    NSLog(@"IS REACHABILE");
} else {
    NSLog(@"NOT REACHABLE");
}

現在、これはシミュレーターで期待どおりに機能していませんが、シミュレーターではなくデバイスでテストする必要があると思います。

質問私がしたいのは、VC内の接続を監視することです。そのため、viewDidLoadで以下を実行します。

// Start monitoring the internet connection
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

次に、変更を登録するにはどうすればよいですか?ネットワーク接続が変更されたときに呼び出される/呼び出されるものは、ドキュメントでは確認できません。

17
StuartM

あなたが読むことができるように AFNetworking read me page

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

こちらも 公式ドキュメントへのリンク です。

43

シングルトンAFHTTPRequestOperationManagerクラスがあります。シングルトンにはメソッドがあります:

+(void)connectedCompletionBlock:(void(^)(BOOL connected))block {

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

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

    BOOL con = NO;
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

    if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {

        con = YES;
    }

    if (block) {
        [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
        block(con);
    }

}];

}

リクエストを行う前に、インターネットにアクセスできるかどうかを示すブロックを返す次のメソッドを呼び出します。

[TLPRequestManager connectedCompletionBlock:^(BOOL connected) {
    if (connected) {

       // Make a request

    }else{

        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Notice" message:@"Internet is not available." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];

        [alertView show];

    }

}];
3
Marlon Ruiz

私はあなたの質問とすべての答えを調べていました。その後、私はこれらすべてを一度行うことにしました。だから、私の既存のプロジェクトでは、ココアポッドを介してAFNetworkingを含めただけです。これが私にとって完全に目覚めているソリューションです。

解決策-まず、AFNetworkReachabilityManagerはシングルトンクラスです。 sharedManagerのAppDelegate初期化を行う必要はありません。

//[AFNetworkReachabilityManager sharedManager];

#import <AFNetworkReachabilityManager.h>

- (void)viewDidLoad {

//Starting the network monitoring process

[[AFNetworkReachabilityManager sharedManager]startMonitoring];

//Checking the Internet connection...

[[AFNetworkReachabilityManager sharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
    if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {

        UIAlertView *alertNetFound = [[UIAlertView alloc]initWithTitle:@"Network Found" message:@"Please Wait Until It is loading" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertNetFound show];

    }else{
        UIAlertView *alertNetNotFound = [[UIAlertView alloc]initWithTitle:@"No Internet" message:@"Please Check Your Internet Connection Honey" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertNetNotFound show];
    }
}];

したがって、この場合、デバイスがネットワークに接続するたびに、最初にstartMonitoringプロセスが実行され、その後は毎回ステータスブロックにヒットし、ステータスに応じてアラートが表示されます。

ステータスブロックのアラートを置き換えることで、選択に応じて何でも実行できます。これを使用してローカルストレージからWebページを自動的にロードしましたが、簡単にするためにそのコードを削除しました。

私のシミュレーターやMac miniでも動作します。

ありがとう

これがお役に立てば幸いです。

1
onCompletion

アプリのデリゲートでこれを使用します->

 func reachablityCode() {
        AFNetworkReachabilityManager.sharedManager()
        AFNetworkReachabilityManager.sharedManager().startMonitoring()
        AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock({(status) in
            let defaults = NSUserDefaults.standardUserDefaults()
            if status == .NotReachable {
                defaults.setBool(false, forKey:REACHABLE_KEY)
            }
            else {
                defaults.setBool(false, forKey: REACHABLE_KEY)
            }
            defaults.synchronize()
        })
    }

そして、これはベースファイルに->

 func isReachable() -> Bool {
        return NSUserDefaults.standardUserDefaults().boolForKey(REACHABLE_KEY)
    }
1
Kakshil Shah