網(wǎng)絡請求Debug的工具:
簡單介紹一下這兩個工具:
-
NetworkEye
使用oc編寫的一個網(wǎng)絡調(diào)試庫,可以監(jiān)控App內(nèi)HTTP請求并顯示請求相關(guān)的詳細信息,方便App開發(fā)的網(wǎng)絡調(diào)試。
**支持范圍: **
- 網(wǎng)頁
- NSURLConnection
- NSURLSession
- AFNetworking第三方庫
- 第三方SDK等的HTTP請求
-
Netfox
使用Swift 2.1編寫的一個網(wǎng)絡調(diào)試庫。
**支持范圍: **
- 網(wǎng)頁
- NSURLConnection
- NSURLSession
- AFNetworking
- AlamoFire(默認請求是檢查不到的,需要單獨配置)
兩者的區(qū)別:
- 由于NetworkEye的功能比較強大(與其他庫存在依賴),所以在使用pod導入項目中的時候也會同時導入FMDB與SQL等第三方.
- 兩者底層的實現(xiàn)方式大同小異, 但由于編寫的語言不同,所以存在略微的差異(這也是筆者所踩得坑)
實現(xiàn)方式介紹:
- 自定義NSURLProtocol子類
NEHTTPEye(NetworkEye)
NFXProtocol(NetFox)
重寫以下方法
override public class func canInitWithRequest(request: NSURLRequest) -> Bool {}
override public class func canInitWithTask(task: NSURLSessionTask) -> Bool {}
override public func startLoading() {}
override public func stopLoading() {}
override public class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLReques {}
NSURLProtocol.registerClass(NEHTTPEye或NFXProtocol)使用黑魔法
method_exchangeImplementations為NEURLSessionConfiguration中的protocolClasses注入NEHTTPEye(僅限于OC)
正文(所踩的坑):
對于有代碼強迫癥的筆者(鐘愛于Swift的簡潔, 不允許純swift的項目中存在oc代碼), 所以毅然決然的選擇了Netfox, 但Netfox缺少以上步驟中的第4步, 所以對于NEURLSessionConfiguration采用defaultSessionConfiguration的請求將無法加載到自定義的NFXProtocol, 毫無疑問AlamoFire的默認配置就是 SessionConfiguration采用defaultSessionConfiguration
??筆者嘗試過為Netfox添加第4步的黑魔法, 但是在swift中作為屬性的protocolClasses都是使用
{
Get { }
Set { }
didSet { }
willSet { }
}
來監(jiān)聽屬性的setter與getter, 所以愚鈍的筆者拿不到其對應的getter方法, 因此黑魔法method_exchangeImplementations就沒有了用物之地.
??既然無法從Netfox下手, 那只好修改AlamoFire的SessionConfiguration. 在AlamoFire.Manager.sharedInstance的單例manager中可以拿到 manager.configuration. protocolClasses, 但是給protocolClasses賦值并沒有效果, 即無法影響manager中的session配置, 故無奈之下只能自定義AlamoFire的manager
以下是筆者的代碼(以上都可以忽略, 這才是正文):
static let shareInstence = BasicRequest()
let alamofireManager: Alamofire.Manager = {
//配置netfox檢測
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses?.insert(NFXProtocol.classForCoder(), atIndex: 0)
configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders
return Alamofire.Manager(configuration: configuration)
}()
func AlamofireRequest(method: Alamofire.Method,
URLString: URLStringConvertible,
parameters: [String : AnyObject]?,
encoding: ParameterEncoding,
headers: [String : String]?,
failure: failureClosure,
success: successClosure){
//檢查網(wǎng)絡
guard let manager = NetworkReachabilityManager() where manager.isReachable else {
failure?("網(wǎng)絡沒有正確連接!", .NetworkUnreachable)
return
}
alamofireManager
.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers)
~~~blalbla~~~
}
趟坑之路
- 對于采用自簽名證書的API無法捕獲
原因: NFXProtocol.swift 中用于捕獲并記錄API數(shù)據(jù)的startLoading如下設置session
let session = NSURLSession( configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
該session使用默認的configuration, 無法通過那些需要自簽名認證證書的API的驗證, dataTask的resume()操作會導致接口的返回失敗.
解決辦法: 需改其session的配置
注:
-
Alamofire.Manager必須保證其生命周期, 若在網(wǎng)絡請求回調(diào)前就銷毀了, 那么網(wǎng)絡請求永遠都是失敗的. ( 多謝cnoon大牛的指點 ) - 對于
configuration中的protocolClasses必須使用insert(NFXProtocol.classForCoder(), atIndex: 0), 否則也無效果. ( 至于原因筆者暫時也沒弄明白, 只見followstackoverflow中是這么解決的 ) -
configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders這句的目的也是因為AlamoFire中的sharedInstance有這么一句, 為了保持一致不產(chǎn)生別的未知bug
若有不對, 敬請指正