Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
37
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@Takumi_Mori

AFNetworking 3.xへの対応

前書き

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
に関しては特記することもないので。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
37
Help us understand the problem. What is going on with this article?