LoginSignup
38
37

More than 5 years have passed since last update.

AFNetworking 3.xへの対応

Last updated at Posted at 2016-02-04

前書き

2015/12/10にリリースされたAFNetworking 3.0 よりNSURLConnection ベースのコードが全て削除されてしまいました。
そのため、AFHTTPRequestOperationManagerをベースに記述していた全てのコードをNSURLSessionを利用した形に修正しなくてはいけません。

公式から、「AFNetworking 3.0 Migration Guide」といった形でAFNetworking2.xからの移行ガイドが提供されています。
以降のドキュメントはこの内容を英語が堪能では無い私がGoogle翻訳しながらかいつまんで書いていく内容になりますので実際には公式をちゃんと読んだ方がいいかもしれませんね。

以下のバージョンを参考に書いています。(11 days agoだから2016/1/24版かな?)

AFNetworking 3.0 Migration Guide
Eugene Dymov edited this page 11 days ago · 17 revisions

◆ AFNetworking 3.0 Migration Guide
https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide

サポートするOSの変更

  • iOS 7+
  • Mac OS X 10.9+
  • watchOS 2+
  • tvOS 9
  • Xcode 7.

より古いOSバージョンで利用したい場合は、READMEを参照して対応しているバージョンを使ってください。
https://github.com/AFNetworking/AFNetworking/blob/master/README.md#requirements

NSURLConnectionのAPIを削除

  • 旧バージョンへのメンテナンス負担の軽減およびNSURLSessionにおける将来拡張のサポートを可能にするため
  • そもそもXcode7からはNSURLConnectionのAPIがAppleから非推奨にされている
  • AFNetworking2.xへの重大なバグやセキュリティに関する修正は続けるが、新規機能の追加はないので移行を推奨。

削除されたクラス

  • AFURLConnectionOperation
  • AFHTTPRequestOperation
  • AFHTTPRequestOperationManager

修正されたクラス

以下のクラスでは、内部実装に含まれていたNSURLConnectionのAPIをNSURLSessionを使用する形にリファクタリングした。
* UIImageView+AFNetworking.h
* UIWebView+AFNetworking.h
* UIButton+AFNetworking.h

移行手順

AFHTTPRequestOperationManager

もしAFHTTPRequestOperationManagerを利用していた場合は、AFHTTPSessionManagerへ移行する必要があります。
いくつかのコンポーネントは、これらのクラス(以下を含む)の間で再利用されています。
* securityPolicy
* requestSerializer
* responseSerializer

以下はAFHTTPSessionManagerへ移行する際の簡単な例になります。
HTTP動詞のメソッド(GETやPOSTなど)がAFHTTPRequestOperationではなくNSURLSessionTaskを返すことに注意してください。
成功と失敗のblocksでも、AFHTTPRequestOperationではなくNSURLSessionTaskを渡します。

AFNetworking 2.x

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

AFNetworking 3.x

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

AFHTTPRequestOperation

NSURLConnectionのオブジェクト(セッション管理、キャッシュポリシー、クッキーの保存、およびURLプロトコル)の設定は、アプリケーション全体にまたがって共有されていましたがNSURLSessionのオブジェクトでは、個別に設定することになります。
セッションが特定の構成で初期化されると、それがデータをフェッチするためのタスクを派遣し、ファイルをアップロードまたはダウンロードすることができます。

AFNetworking2.0ではAFHTTPRequestOperationにてこ入れして、追加のオーバーヘッドなしで単一のRequestを作成し、リモートデータをフェッチすることが可能でした。
NSURLSessionがRequest自体へのアクセスを得るためには、ややオーバーヘッドが必要です。

単一のRequestをするためには、AFHTTPSessionManagerからタスクを作成し、それを開始する形になります。

AFNetworking2.x

NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];

AFNetworking 3.x

NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:URL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

NSURLSessionNSOperationの上に構築されていないことに注意してください。
あなたのアプリケーションがAFURLConnectionOperationのNSOperationを使った側面に強く依存している場合、AFHTTPSessionManagerNSOperationベースのアプローチをするための追加開発が必要かもしれません。

終わり

と、ここまでが自分に必要な箇所だったので終了。
結局あんまり参考にならなかったのでこれからAFHTTPRequestOperation周りについて再開発します。
NSURLRequestやAFHTTPRequestOperation、Serializerをオーバーライドして拡張してたから排除されちゃってるAFHTTPSessionManagerに移行し辛いんだけどな、と思って読んでたけど特に書いてなかった。。。

残りの箇所、
* Tracking Progress
* UIKit Migrations
* UIAlertView Category has been removed
* Streamlined Example
に関しては特記することもないので。

38
37
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
37