Swiftを使ったAFNetworking 2.0 のまとめ [iOS]
概要
以前書いた記事を勉強がてらSwiftに置き換えてみました。 習うより慣れろ!と言う言葉通り実際触ってみるのがやはり使えるようになるための一番の近道です。
AFNetworking 2.0以降を使うには下記が必須要件となっていますので導入前に確認してください。
大きな変更点としてドキュメントにあるようにiOS7以降のサポートのみでよければAFHTTPSessionManager
のサブクラスを作成して実装することが推奨されています。
iOS6やそれ以前のバージョンをサポートする場合の選択肢としてAFHTTPRequestOperationManager
が用意されています。
前回のまとめ同様に主にAFHTTPRequestOperationManager
の使い方について触れておきます。
使い方
Objective-Cを使う際と同様にインストールもCocoaPodsで簡単に導入できますので、下記Podfileをプロジェクトのルート直下に作成してインストールしましょう。
platform :ios, '7.0' pod "AFNetworking", "~> 2.0"
GETで使う場合
let manager = AFHTTPRequestOperationManager() manager.responseSerializer = AFHTTPResponseSerializer() manager.GET("http://hoge/sample.json", parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject:AnyObject!) in println("response: \(responseObject)") }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("error: \(error)") })
POSTでパラメータを設定する場合
let manager = AFHTTPRequestOperationManager() var param:Dictionary<String, String> = ["param1" : "value1", "param2" : "value2"] manager.POST("http://hoge/sample.json", parameters: param, success: { (operation: AFHTTPRequestOperation!, responseObject:AnyObject!) in println("response: \(responseObject)") }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("Error: \(error)") })
レスポンスがJSONではない場合
let manager = AFHTTPRequestOperationManager() manager.responseSerializer = AFXMLParserResponseSerializer()
としてAFHTTPResponseSerializer
をセットしておきましょう。
デフォルトがAFJSONResponseSerializer
のためJSONのパースエラーになります。
レスポンスがXMLの場合
let manager = AFHTTPRequestOperationManager() manager.responseSerializer = AFXMLParserResponseSerializer() as AFHTTPResponseSerializer // 許可するContentTypeの設定が必要 manager.responseSerializer.acceptableContentTypes = NSSet(object: "application/rss+xml")
結果のresponseObjectがNSXMLParser
なので自前でパースする必要があります。
パースするSerializerを自前で用意してもよいでしょう。
let manager = AFHTTPRequestOperationManager() manager.requestSerializer = AFJSONRequestSerializer()
上記ようにAFJSONRequestSerializer
を設定します。
通信ログについて
通信の詳細なログが見たい時はAFNetworkActivityLogger
を別途インストールするとリクエストヘッダー、レスポンスヘッダーもログ出力してくれます。
platform :ios, '7.0' pod "AFNetworking", "~> 2.0" pod "AFNetworkActivityLogger", "~> 2.0"
PodfileにAFNetworkActivityLogger
を追加してインストールします。
AppDelegate.swift'の'application:didFinishLaunchingWithOptions::
にログを開始する処理を記述します。
AFNetworkActivityLogger.sharedLogger().startLogging()
ログレベルをAFLoggerLevelDebug
にすればリクエストヘッダー、レスポンスヘッダーを含む通信のやりとりをログに出力できます。
AFNetworkActivityLogger.sharedLogger().level = .AFLoggerLevelDebug
キャッシュポリシー、タイムアウトについて
AFHTTPRequestOperationManager
を使用せずAFHTTPRequestOperation
を直接使用する場合はcachePolicyの設定ができます。
let URL = NSURL.URLWithString("http://hoge/sample.json") let request = NSURLRequest(URL: URL, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval:60.0) let operation = AFHTTPRequestOperation(request: request) operation.responseSerializer = AFJSONResponseSerializer() operation.setCompletionBlockWithSuccess({ (operation: AFHTTPRequestOperation!, responseObject:AnyObject!) in println("response: \(responseObject)") }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("Error: \(error)") }) operation.start()
セキュリティポリシー
テスト環境などでSSL通信をする際にオレオレ証明書(自己署名証明書)を使っている場合は、AFHTTPRequestOperationManager
にオレオレ証明書を許可する設定を行うことで通信できます。
let manager = AFHTTPRequestOperationManager() manager.securityPolicy.allowInvalidCertificates = true // 以降は通常通りAFHTTPRequestOperationManagerを使って通信を行う
まとめ
NSURLSession
の登場によって今後はNSURLConnection
がベースとなっているAFHTTPRequestOperationManager
ではなくAFHTTPSessionManager
が主流になるのでそちらについても書きたいと思ったのですが時間の都合上、別の機会に書くことにします。
Swiftに書き換えた印象として、Swiftはスクリプト言語の経験がある方ならすんなり入れるはずです。 Objective-CのBlocks構文などとても書きづらく辛さしかなかったのですが、Swiftにシフトすればそんな問題からも解放されるし、いいこと尽くめではないかと思います。 もう少しSwiftのノウハウがたまってからでもよいかもしれませんが、個人的には新規アプリはSwiftで書いてしまう方が開発効率上がってよいと思いました。