企鹅的手机管家、一些网页都提供了网速监测功能。在开发过程中我们偶尔也需要开发这个模块,以提示用户网速的状况,增强用户体验。
常见的网络测速方案
通过调研发现,目前常见的网络测速方案只有两种:
方案1:通过上传和下载数据包,使用 TotalSize / TotalTime 来计算真实的上传和下载速率是多少
方案2:通过读取网卡数据来计算,读取上一秒的整体流量消耗 T1,然后读取当前的流量消耗 T2,那么 T2 - T1 其实可以表示为当前的一个网速情况。同时这个流量数据是可以区分蜂窝网络、Wi-Fi的,也可以区分哪些是上行流量,那些是下行流量。
两种方案各有优劣,可以在合适的场合来选择对应的方案
第一种方案感觉是比较准确,这个时候是真实的在下载或上传数据,比较充分的利用了当前的带宽,计算的网速也比较接近真实的网速值。但是蜂窝网络下,会消耗用户的少量流量。
第二种方案在下载和上传东西时,计算的值和第一种方案比较接近。但是如果当前系统内没有 App 在被使用,处于静止状态的话,其实当前读取的流量值是比较小的,无法反映出网速情况,但是可以实时反映流量消耗状况。
具体实施的方案有如下:
方案一:使用苹果封装的Reachability进行网络检测
示例代码:
问题1:由于上述的监测方式是利用KVO机制,所以是在网络状态变化后才会收到通知,并不是严格意义上的实时检测网络。我们大部分是需要在点击某个按钮,进行网络请求的时候,会检测网络状况,如果没有网络,那就没必要去做请求操作。这时你可以用弹窗的形式提示用户检查网络设置。况且每个视图控制器里都要去注册通知,在控制器销毁的时候移除通知,是个很繁琐的过程,也不利于代码维护(当然你在父视图控制器里用此方法,其他控制器都继承之)。
问题2:由于默认只提供了三种网络状态:NotReachable、reachableViaWiFi和reachableViaWWAN,如果我们要区分2G/3G/4G网络,则需要对Reachability进行相应的更改。
在源码的基础上,添加2G/3G/4G枚举状态,接下来在.m中修改方法:- networkStatusForFlags:
此类处于AFNetworking第三方库中,可自行下载。
在需要的地方,调用下面的方法,便可知道目前的网络状态。
如果我们连接上一个公用WiFi后,用上面两种方式监测网络,其结果都认为你的APP已经连接上了网络,但实际上只是本地连接上,并没有真正接入网络,大家应该有体会。RealReachability提供了实时网络监测的功能,详情可参考链接:点击打开链接。
参考博客:http://blog.csdn.net/drift_Axe/article/details/51463835
http://blog.csdn.net/olsQ93038o99S/article/details/79167070
仅为个人收藏和学习分享,侵删,著作权属于原博主。