前書き
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);
}];
NSURLSession
がNSOperation
の上に構築されていないことに注意してください。
あなたのアプリケーションがAFURLConnectionOperation
のNSOperationを使った側面に強く依存している場合、AFHTTPSessionManager
へNSOperation
ベースのアプローチをするための追加開発が必要かもしれません。
終わり
と、ここまでが自分に必要な箇所だったので終了。
結局あんまり参考にならなかったのでこれからAFHTTPRequestOperation周りについて再開発します。
NSURLRequestやAFHTTPRequestOperation、Serializerをオーバーライドして拡張してたから排除されちゃってるAFHTTPSessionManagerに移行し辛いんだけどな、と思って読んでたけど特に書いてなかった。。。
残りの箇所、
- Tracking Progress
- UIKit Migrations
- UIAlertView Category has been removed
- Streamlined Example
に関しては特記することもないので。