关于自己应用内的流量监控

怎样做流量监控的,这个问题,一个朋友一个多星期前就问我的了,然后有点事,一直没有给他一个解决方法。后来,我找了一下,本来想把它写成一个demo的,后来发现,现在根据我掌握的资料,无法做成通用的,所以就简要写一下要点。估计会有点帮助的。
一般流量的产生主要在于http请求的时候,当然假如是基于socket的聊天软件那就不一样了。下面主要是介绍如何在http请求下面进行流量监控的。下面选择了2个很有代表性的例子:ASIHttpRequest 和 SDWebImage(本质是NSRequest和NSUrllConnection)。
     1、由于业界主流使用HttpRequest的类库是ASIHttpRequest,所以流量监控上面,ASIHttpRequest,其实已经做好了,每一次的Http请求都有记录上传了多少流量和下载了多少流量。
- (void)handleStreamComplete 的函数里面

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软件管家之类的,都不是很准的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值