web-dev-qa-db-ja.com

AFNetworkingの可用性の確認

AFNetworkingをサブクラス化せずにAFHTTPClientを実装しました。一部はDownloadQueueManagerで次のコードを使用しています。

-(void)downloadPodcastAt:(NSString *)url toPath:(NSString *)path
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
                                             cachePolicy:NSURLRequestReturnCacheDataElseLoad
                                         timeoutInterval:60.0];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        [self saveQueuedItemInformation];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        // Other stuff
    }];

    [operation start];
}

私の質問は多様です。指が麻痺するまでグーグルで検索しましたが、AFNetworkingを使用して到達可能性のステータスを簡単かつ簡単にチェックする適切なコードサンプルをまだ見つけていません。 (奇妙なことに、インポートについての議論はたくさんありますSystemConfiguration.framework、非常に簡単なようです)。ユーザーがデータ使用量を最小限に抑え、WiFiを使用してのみダウンロードしたい場合、WiFiを確認し、WiFiが利用可能な場合にのみダウンロードするにはどうすればよいですか?

次に、AFNetworkingはユーザーフレンドリーなフロントエンドになりたいようです。しかし、実際にはフロントエンドからこのフロントエンドまでを使用することができます。必要なものに到達するために雑草を取り除かなければならないものがたくさんあるからです。必要なのは、URLにアクセスし、(到達可能性に基づいて)xmlファイルをダウンロードして、それを実行することだけです。これを簡単な作業にする何かが足りないのですか?

これを理解すると、実装を簡素化するために完全に1つまたは5つのフロントエンドを構築します(私がばかではない場合を想定しています)。ご返信いただきありがとうございます。

19
AMayes

A-Liveが実際に言ったことに反しています 到達可能性IS AFNetworkingの一部です。これはAFHTTPClient.hで実装されています here 。議論されているように.pchファイルに正しいインポートが必要です here それを使用するため。

これを使用するには、おそらくAFHTTPClientのサブクラスが必要なので、setReachabilityStatusChangeBlockを定義して使用できます ここ 。以下は、サブクラスを使用しない簡単な例です。

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://google.com"]];
[client setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    if (status == AFNetworkReachabilityStatusNotReachable) {
        // Not reachable
    } else {
        // Reachable
    }

    if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
        // On wifi
    }
}];

この到達可能性設定の動作が気に入らない場合は、Appleの到達可能性の Tony Millionのフォーク をお勧めします。簡単な例:

Reachability *reach = [Reachability reachabilityWithHostname:@"google.com"];
if ([reach isReachable]) {
    // Reachable
    if ([reach isReachableViaWiFi]) {
        // On WiFi
    }
} else {
    // Isn't reachable

    [reach setReachableBlock:^(Reachability *reachblock)
    {
        // Now reachable
    }];

    [reach setUnreachableBlock:^(Reachability*reach)
    {
        // Now unreachable
    }];
}
45
Keith Smiley

AFNetworking 2.0以上では、次のように可用性を確認できます。

    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status) {
        case AFNetworkReachabilityStatusUnknown:
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            //available
            break;
        case AFNetworkReachabilityStatusNotReachable:
            //not available
            break;
        default:
            break;
    }

    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

}];

//start monitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

現在のステータスを取得するには

[AFNetworkReachabilityManager sharedManager].reachable
20
Hemang

更新のみで、AFNetworkingの新しいバージョンではAFHTTPClientが廃止されました。

代わりにAFHTTPRequestOperationManager.hを使用できます

Githubページ自体から取られた小さなもの:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url]; //url can be google.com or something you want to reach

NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)

{
    switch (status)
    {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
        {
            NSLog(@"SO REACHABLE");
            [operationQueue setSuspended:NO]; // or do whatever you want
            break;
        }

        case AFNetworkReachabilityStatusNotReachable:
        default:
        {
            NSLog(@"SO UNREACHABLE");
            [operationQueue setSuspended:YES]; 
            //not reachable,inform user perhaps
            break;
        }
    }
}];
[manager.reachabilityManager startMonitoring];
8
Shawn Frank