Alamofire(AFNetworkActivityLoggerに似たもの)を使用して各リクエスト/レスポンスを記録する方法はありますか?
Printable、DebugPrintable、およびOutput(cURL)は知っていますが、探しているものとはまったく異なります。
このようなものがあなたが探していたものかもしれません:
extension Request {
public func debugLog() -> Self {
#if DEBUG
debugPrint(self)
#endif
return self
}
}
使用法:
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
.debugLog()
.response {…}
すべての応答を印刷する場合は、このチュートリアルの上部にあるresponseObject()メソッドに似た独自の応答メソッドを作成できます。
http://www.raywenderlich.com/87595/intermediate-alamofire-tutorial
[更新:@trauztiからのリクエストごとに以下に追加。]
次に、everyリクエストで出力を印刷するためにresponseObject()アプローチを行う方法を示します。
警告:私はこのコードを個人的にテストしたことはないので、本番環境ではおそらく異なる選択をするでしょう。これは、Wenderlichチュートリアルコードにデバッグログを含める方法を示しています。また、注意:チュートリアルはSwift 2.0より前なので、print()の代わりに古いprintln()を使用しました。
@objc public protocol ResponseObjectSerializable {
init(response: NSHTTPURLResponse, representation: AnyObject)
}
extension Alamofire.Request {
public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void) -> Self {
let serializer: Serializer = { (request, response, data) in
#if DEBUG
println("Request: \(request.URL)")
#endif
let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
let (JSON: AnyObject?, serializationError) = JSONSerializer(request, response, data)
if response != nil && JSON != nil {
#if DEBUG
println("Response:")
debugPrint(JSON)
#endif
return (T(response: response!, representation: JSON!), nil)
} else {
#if DEBUG
println("Failed Serialization:")
debugPrint(serializationError)
#endif
return (nil, serializationError)
}
}
return response(serializer: serializer, completionHandler: { (request, response, object, error) in
completionHandler(request, response, object as? T, error)
})
}
}
これには甘いポッドがあります: https://github.com/konkab/AlamofireNetworkActivityLogger
これをポッドファイルに追加します。
pod 'AlamofireNetworkActivityLogger', '~> 2.0'
AppDelegateで:
import AlamofireNetworkActivityLogger
次に、didFinishLaunchingWithOptions
に以下を追加します:
NetworkActivityLogger.shared.level = .debug
NetworkActivityLogger.shared.startLogging()
編集:私は実際に本番環境でこれにクラッシュが発生しました。安全のために、「ビルドフラグ」を使用して、デバッグでのみこれを使用します。次のようなものです。
#if DEBUG
NetworkActivityLogger.shared.level = .debug
NetworkActivityLogger.shared.startLogging()
#endif
ティンバージャックはあなたが探しているものです。 Timberjackは、シンプルで邪魔にならないネットワークアクティビティロガーです。アプリが行うすべてのリクエストを記録するか、必要に応じて特定のNSURLSessionを使用するリクエストのみに制限します。それがあなたのことなら、Alamofireでも動作します。
https://cocoapods.org/pods/Timberjack
使用法:
import Alamofire
import Timberjack
class HTTPManager: Alamofire.Manager {
static let sharedManager: HTTPManager = {
let configuration = Timberjack.defaultSessionConfiguration()
let manager = HTTPManager(configuration: configuration)
return manager
}()
}
Alamofire 4.0+の上記の回答に追加Swift 3
_extension DataRequest {
public func LogRequest() -> Self {
//Your logic for logging
return self
}
}
_
リクエストするとき
_Alamofire.request(requestUrl, method: .post, parameters: parameter, encoding: JSONEncoding.default)
.LogRequest()
.responseJSON { response in
//Do your thing
}
_
どんな場合でもリクエストをキャンセルしたい場合(これは私が望んでいたものでした)、selfを返す前にどこでもself.cancel()
できます