TotalBytesSent变量就是上传了多少流量
ContentLength或者totalBytesRead就是下载的流量
所以要记录的话,可以在这个函数直接累加这2个变量的值。当然最好是写一个钩子(category),然后把钩子放在里面,把数据钩出来,这样子就不会破坏代码的框架。
2、SDWebImage,最常用的图片下载类库
由于SDWebImage不是使用ASIHttpRequest作为Http请求的,所以无法采取第一种方法去获取流量。SDWebImage是使用原生的NSRequest和NSUrlConnection去进行Http请求的,而且仅仅是下载的行为,并没有上传数据(如果非要说有上传的话,那就是tcp的三次握手了,这样的流量几乎可以忽略不计的),所以可以在
- (void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)data 的函数里面
把data的长度读出来。
说到这里,可能会有点疑惑的了,会问为什么不在最后
- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection
其实,主要就是防止接收到数据,但是可能会出现fail的情况,所以在接收数据的时候记录比较稳妥。
以上主要是用到http请求的时候,流量监控。
还有很多地方会产生网络的,比如地图,音频视频的直播流(http live streaming)等这些,由于是系统封装好的,所以无法从表面获取到上传和下载的数据信息,这些估计要在CFSteam层或者CFSocket层上面放钩子去截取,由于实现起来相当困难,暂时没有想法如何去在底层去获取数据。
PS:直播流,是直接调用系统的avplayer去播放的,本人曾经做过这样的一个项目,如果要获取直播流的流量的话,最简单或者说最直接的方法就是在直播流里面的meta信息里面带上直播流该片的size就可以了。当然这个不是一个从根本解决问题的方法。但是起码可以解决直播流的问题。
如果想获取整个设备的流量监控,那就可以读取网卡信息了。获取网卡信息的代码,网上搜索一下就有了,这里就累赘了。不过网卡信息会在重启之后清零的,所以很多流量监控的软件,比如瓦力流量监控,QQ软件管家之类的,都不是很准的。