在开发中要获取网络类型是很简单的,导入Reachability直接获取状态就行了,现在我们要做一个类似下载器的那种实时把上传下载速度显示出来。

需要用到的头文件

使用Reachability

要测速度所以必须要有一个定时器,咱们为了不耗用户的流量,取的是数据的总量,然后减去上一次的检测的总量,得出的就是速度。网络现在分为wifi以及wwan两种类型。

首先头文件.h建立一个检测的数据类

@interface MonitorData : NSObject

@property (assign, nonatomic) float wwanSend;

@property (assign, nonatomic) float wwanReceived;

@property (assign, nonatomic) float wifiSend;

@property (assign, nonatomic) float wifiReceived;

@end

然后建立一个检测类

@interface MonitorFlow : NSObject

//开始检测

- (void)startMonitor;

//停止检测

- (void)stopMonitor;

@end

实现文件.M

//成员变量是内部可见的

@interface MonitorFlow ()

@property (strong,nonatomic) NSTimer *timer;

@property (assign, nonatomic) float tempWWANReceived;

@property (assign, nonatomic) float tempWWANSend;

@property (assign, nonatomic) float tempWifiReceived;

@property (assign, nonatomic) float tempWifiSend;

@end

直接把代码附上,里面有注释

@implementation MonitorFlow

- (void)startMonitor {

[self currentFlow];

self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(refreshFlow) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

}

- (void)stopMonitor{

[self.timer invalidate];

}

- (void)refreshFlow{

// 上传、下载

//不需要连通网络获取的是总的数据

Reachability *reachability = [Reachability reachabilityWithHostName:@"Yes-Cui"];

MonitorData *monitor = [self getMonitorDataDetail];

switch (reachability.currentReachabilityStatus) {

case ReachableViaWiFi:

{

float wifiSend = monitor.wifiSend - self.tempWifiSend;

float wifiReceived = monitor.wifiReceived - self.tempWifiReceived;

NSLog(@"wifi上传速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wifiSend]);

NSLog(@"wifi下载速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wifiReceived]);

}

break;

case ReachableViaWWAN:

{

float wwanSend = monitor.wwanSend - self.tempWWANReceived;

float wwanReceived = monitor.wifiReceived - self.tempWWANSend;

NSLog(@"wwan上传速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wwanSend]);

NSLog(@"wwan下载速度:%@",[NSString stringWithFormat:@"%.0f KB/s",wwanReceived]);

}

break;

default:

{

NSLog(@"无网络");

}

break;

}

[self currentFlow];

}

//赋值当前流量

- (void)currentFlow{

MonitorData *monitor = [self getMonitorDataDetail];

self.tempWifiSend = monitor.wifiSend;

self.tempWifiReceived = monitor.wifiReceived;

self.tempWWANSend = monitor.wwanSend;

self.tempWWANReceived = monitor.wwanReceived;

}

//上传、下载总额流量

- (MonitorData *)getMonitorDataDetail

{

BOOL success;

struct ifaddrs *addrs;

struct ifaddrs *cursor;

struct if_data *networkStatisc;

long tempWiFiSend = ;

long tempWiFiReceived = ;

long tempWWANSend = ;

long tempWWANReceived = ;

NSString *dataName;

success = getifaddrs(&addrs) == ;

if (success)

{

cursor = addrs;

while (cursor != NULL)

{

dataName = [NSString stringWithFormat:@"%s",cursor->ifa_name];

if (cursor->ifa_addr->sa_family == AF_LINK)

{

if ([dataName hasPrefix:@"en"])

{

networkStatisc = (struct if_data *) cursor->ifa_data;

tempWiFiSend += networkStatisc->ifi_obytes;

tempWiFiReceived += networkStatisc->ifi_ibytes;

}

if ([dataName hasPrefix:@"pdp_ip"])

{

networkStatisc = (struct if_data *) cursor->ifa_data;

tempWWANSend += networkStatisc->ifi_obytes;

tempWWANReceived += networkStatisc->ifi_ibytes;

}

}

cursor = cursor->ifa_next;

}

freeifaddrs(addrs);

}

MonitorData *monitorData = [MonitorData new];

monitorData.wifiSend = tempWiFiSend/;

monitorData.wifiReceived = tempWiFiReceived/;

monitorData.wwanSend = tempWWANSend/;

monitorData.wwanReceived = tempWWANReceived/;

return monitorData;

}

@end

來源:https://www.jianshu.com/p/42ab08c998ae

IOS实时监控上传下载速度的更多相关文章

  1. [Swift通天遁地]四、网络和线程-(9)上传图片并实时显示上传进度

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. 【iOS 使用github上传代码】详解

    [iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...

  3. iOS上架ipa上传问题那些事

    iOS上架ipa上传问题那些事 原文: http://www.jianshu.com/p/1e22543285c2 字数513 阅读312 评论0 喜欢1 通过xcode直接打包上传,不会提示你的ip ...

  4. 使用IPTABLES限制IP上传下载速度,如何用iptables限速?

    怎样使用IPTABLES限制IP上传下载速度,如何用iptables限速?我们先来看范例: iptables限制某IP的上传速度为1000KB/秒(8Mbps,流入服务器带宽),即在此IP所在的服务器 ...

  5. iOS多图上传

    iOS多图上传涉及到多线程问题,个人比较喜欢使用GCD操作,下边是最近写的一个多图上传代码,附带相关注释 __block BOOL allSucc = YES; __block int m = 0; ...

  6. iOS自动化打包上传的踩坑记

    http://www.cocoachina.com/ios/20160624/16811.html 很久以前就看了很多关于iOS自动打包ipa的文章, 看着感觉很简单, 但是因为一直没有AppleDe ...

  7. IOS开发-图片上传

    目前IOS端开发,图片上传到服务器分为两种,一种是直接上到服务器,一种是借助第三方储存(减少服务器压力). 一.直接上传到服务器 /** * 代码演示 */ //*******UIImagePNGRe ...

  8. iOS 七牛云上传并获取图片----【客户端】

           最近做了七牛云存储的有关内容,涉及到与后台交互获取验证的token,无奈,后台自命清高,不与理会,没办法呀,于是自己搞呗.首先呢在在七牛上注册一个账号,然后呢添加一个存储空间这时候空间名 ...

  9. 【iOS】文件上传小记

    iOS由该系统提供API可以实现可以实现文件的上传和下载,有两种方法来. NSURLConnection与NSURLSession. 当中NSURLConnection是使用非常久的的一种方式.NSU ...

随机推荐

  1. BestCoder #47 1001&&1002

    [比赛链接]cid=608">clikc here~~ ps:真是wuyu~~做了两小时.A出两道题,最后由于没加longlong所有被别人hack掉!,最后竟然不知道hack别人不成 ...

  2. 简单老式Java对象 横切关注点 最小侵入性编程 声明式编程 避免强迫类继承和接口实现

    Spring In Action data injection aspect-oriented programming Plain Old Java Object 依赖注入能让相互协作的软件组件保持松 ...

  3. react遇到的各种坑

    标签里用到<label for>的,for 要写成htmlFor 标签里的class要写成className 组件首字母一定要大写 单标签最后一定要闭合 如果html里要空格转义, 注意不 ...

  4. aop学习总结一------使用jdk动态代理简单实现aop功能

    aop学习总结一------使用jdk动态代理实现aop功能 动态代理:不需要为目标对象编写静态代理类,通过第三方或jdk框架动态生成代理对象的字节码 Jdk动态代理(proxy):目标对象必须实现接 ...

  5. ETF到底是什么?

    ETF(交易所交易基金)是一种证券产品,它可以跟踪一些相关的资产,不论是股票.债券.商品,还是数字货币. ETF基金会负责跟踪指定的资产.然后放出部分股份,这些股份代表着对资产的拥有权. 交易ETF股 ...

  6. Machine Learning in Action(6) AdaBoost算法

    Adaboost也是一种原理简单,但很实用的有监督机器学习算法,它是daptive boosting的简称.说到boosting算法,就不得提一提bagging算法,他们两个都是把一些弱分类器组合起来 ...

  7. linux apache 用户认证:

    root@ubuntu:/# htpasswd -c /etc/apache2/password zhangsan (-c表示要创建一个password密码文件,文件存放目录是/etc/apache2 ...

  8. C++模板(二)【转】

    本文转自:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类 ...

  9. NSMutableURLRequest,在POST方式下传递参数

    1. [代码][C/C++]代码         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];     NSUs ...

  10. [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要

    C++中共有四种存储类别标识符:auto/static/register/extern 1.auto 函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量).如果不指定存储类别,则隐式定义 ...