iOS无侵入式抓包,MOCK工具

1,027 阅读2分钟

起源

  • 测试部在定位问题的时候不确定是三端哪个出问题,提供一个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分支已解决