美文网首页iOS在路上征服iOS
Netfox无法监听AlamoFire的默认请求

Netfox无法监听AlamoFire的默认请求

作者: Archerlly | 来源:发表于2016-05-15 12:55 被阅读249次

    网络请求Debug的工具:


    简单介绍一下这两个工具:

    • NetworkEye

    使用oc编写的一个网络调试库,可以监控App内HTTP请求并显示请求相关的详细信息,方便App开发的网络调试。
    **支持范围: **

    • 网页
    • NSURLConnection
    • NSURLSession
    • AFNetworking第三方库
    • 第三方SDK等的HTTP请求
    • Netfox

    使用Swift 2.1编写的一个网络调试库。
    **支持范围: **

    • 网页
    • NSURLConnection
    • NSURLSession
    • AFNetworking
    • AlamoFire(默认请求是检查不到的,需要单独配置)

    两者的区别:

    • 由于NetworkEye的功能比较强大(与其他库存在依赖),所以在使用pod导入项目中的时候也会同时导入FMDB与SQL等第三方.
    • 两者底层的实现方式大同小异, 但由于编写的语言不同,所以存在略微的差异(这也是笔者所踩得坑)

    实现方式介绍:

    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 { }
    }
    

    来监听属性的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){
            
            //检查网络
            guard let manager = NetworkReachabilityManager() where manager.isReachable else {
                failure?("网络没有正确连接!", .NetworkUnreachable)
                return
            }
            
            alamofireManager
                .request(method, URLString, parameters: parameters, encoding: encoding, headers: headers) 
                ~~~blalbla~~~
        }
    

    趟坑之路

    1. 对于采用自签名证书的API无法捕获

    原因: NFXProtocol.swift 中用于捕获并记录API数据的startLoading如下设置session

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

    session使用默认的configuration, 无法通过那些需要自签名认证证书的API的验证, dataTaskresume()操作会导致接口的返回失败.

    解决办法: 需改其session的配置

    注:

    • Alamofire.Manager必须保证其生命周期, 若在网络请求回调前就销毁了, 那么网络请求永远都是失败的. ( 多谢cnoon大牛的指点 )
    • 对于 configuration 中的 protocolClasses 必须使用 insert(NFXProtocol.classForCoder(), atIndex: 0), 否则也无效果. ( 至于原因笔者暂时也没弄明白, 只见followstackoverflow中是这么解决的 )
    • configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders这句的目的也是因为AlamoFire中的sharedInstance有这么一句, 为了保持一致不产生别的未知bug

    若有不对, 敬请指正

    相关文章

      网友评论

      • 人不如狗629:可以分享一个你使用netfox的demo吗?
        我用这个的时候请求体一直显示为空, 响应体是有记录的
        Archerlly:这个问题我也不清楚, 在NFXProtocol的'override open class func canInit(with task: URLSessionTask) -> Bool'方法中接收的Task就已经丢失了httpBody, 其中只有系统内部处理了task

      本文标题:Netfox无法监听AlamoFire的默认请求

      本文链接:https://www.haomeiwen.com/subject/hesvrttx.html