起源
- 测试部在定位问题的时候不确定是三端哪个出问题,提供一个app内部抓包方便测试部去定位问题, 并且可在调试数据多样性的接口的时候增加断点功能,更改请求后的数据或者请求头等,项目地址RnpLog,可直接使用cocoapods引入
pod 'RnpLog', :git => 'https://github.com/yangtianyan/RnpLog.git', :configurations => 'Debug'
大致原理
- 抓包
继承 NSURLProtocol 与 NSURLSessionConfiguration,注册自定义的 NSURLProtocol,将所有的网络请求拦截下来,使用自己的NSUrlSession去请求,并将请求头请求体响应头响应体保存下来
- 断点
在
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data函数内判断是否开启断点,如果断点开启了就阻断[self.client URLProtocol:self didLoadData:data];调用,并将所有的data数据请求存储下来,然后在- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error函数中弹出修改请求结果页面并拦截[self.client URLProtocolDidFinishLoading:self];函数执行,但是这个函数在修改完数据后是要执行的
如果有超时顾虑可以在设置断点的时候就设置好响应数据
遇到问题
- WKWebview抓包
拦截是不会将webview抓包的,需要调用webview的私有类的方法
- web中请求重定向了界面会有问题
症状:
因为开启抓包后webview感知不到重定向了,所以里面的
资源文件(js/媒体文件)会用原先的host去请求造成404
解决方案:
在查阅苹果文档并google等查询定位到
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler协议,然后解决问题
- WKWebview中有POST请求抓包后会丢失请求体
使用js hook ajax请求 并将请求丢向原生
- cookie丢失问题
在请求接口的时候读取本地的cookie拼接上去
- 暂未解决
webview在ajax请的时候自己组装的cookie会丢失,暂时没解决,思路是同样hook ajax请求
新版webview分支已解决