Netfox無法監(jiān)聽AlamoFire的默認請求


網(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)方式介紹:

  1. 自定義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_exchangeImplementationsNEURLSessionConfiguration中的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~~~
    }

趟坑之路

  1. 對于采用自簽名證書的API無法捕獲

原因: NFXProtocol.swift 中用于捕獲并記錄API數(shù)據(jù)的startLoading如下設置session

let session = NSURLSession( configuration: NSURLSessionConfiguration.defaultSessionConfiguration())

session使用默認的configuration, 無法通過那些需要自簽名認證證書的API的驗證, dataTaskresume()操作會導致接口的返回失敗.

解決辦法: 需改其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

若有不對, 敬請指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容