読者です 読者をやめる 読者になる 読者になる

sakaharaのブログ

アプリ開発に関する話や日々の出来事など

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を自前で用意してもよいでしょう。

リクエストパラメータをJSONにしたい場合

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で書いてしまう方が開発効率上がってよいと思いました。