今天接到该需求,上午google了许多,cocoachina了一些,结合了前人的工作,整合了一些思路,封装了一个类,
用户监测当前每秒实时网络流量、wifi信号强弱度0-3、网络环境。现把代码发布。
.h文件
//
// NetworkStateOrRSSI.h
// GHZeusLibraries
//
// Created by 郭军 on 2017/12/2.
// Copyright © 2017年 ZJBL. All rights reserved.
//
#import
typedef enum {
GHNetworkErrorType = 0,
GHNetwork2GType = 1,
GHNetwork3GType = 2,
GHNetwork4GType = 3,
GHNetworkWifiType = 5
}GHNetworkType;
@interface NSObject (NetworkStateOrRSSI)
@property (assign, nonatomic) uint32_t nowIBytes; //当前每秒下行流量,KB
@property (assign, nonatomic) uint32_t nowOBytes; //当前每秒上行流量
+ (GHNetworkType)networkType;
+ (int)wifiStrengthBars;
//开始检测,需每秒调用一次该方法,使获得nowIBytes&nowOBytes
- (void)detectionBytes;
@end
.m文件
//
// NetworkStateOrRSSI.m
// GHZeusLibraries
//
// Created by 郭军 on 2017/12/2.
// Copyright © 2017年 ZJBL. All rights reserved.
//
#import "NSObject+NetworkStateOrRSSI.h"
#include
#include
#include
#import
#import
@interface NSObject (bytes)
@property (assign,nonatomic) uint32_t historyIBytes;
@property (assign,nonatomic) uint32_t historyOBytes;
@property (assign,nonatomic) uint32_t oldIBytes;
@property (assign,nonatomic) uint32_t oldOBytes;
@property (assign,nonatomic) BOOL isFirst;
@end
@implementation NSObject (bytes)
- (void)setHistoryIBytes:(uint32_t)historyIBytes
{
objc_setAssociatedObject(self, @selector(historyIBytes), [NSNumber numberWithInt:historyIBytes], OBJC_ASSOCIATION_ASSIGN);
}
- (uint32_t)historyIBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}
- (void)setHistoryOBytes:(uint32_t)historyOBytes
{
objc_setAssociatedObject(self, @selector(historyOBytes), [NSNumber numberWithInt:historyOBytes], OBJC_ASSOCIATION_ASSIGN);
}
- (uint32_t)historyOBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}
- (void)setOldIBytes:(uint32_t)oldIBytes
{
objc_setAssociatedObject(self, @selector(oldIBytes), [NSNumber numberWithInt:oldIBytes], OBJC_ASSOCIATION_ASSIGN);
}
- (uint32_t)oldIBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}
- (void)setOldOBytes:(uint32_t)oldOBytes
{
objc_setAssociatedObject(self, @selector(oldOBytes), [NSNumber numberWithInt:oldOBytes], OBJC_ASSOCIATION_ASSIGN);
}
- (uint32_t)oldOBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}
- (void)setIsFirst:(BOOL)isFirst
{
objc_setAssociatedObject(self, @selector(isFirst), @(isFirst), OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (BOOL)isFirst
{
return [objc_getAssociatedObject(self, _cmd) boolValue];
}
- (void)getInterfaceBytes
{
struct ifaddrs *ifa_list = 0, *ifa;
if (getifaddrs(&ifa_list) == -1)
{
return;
}
uint32_t iBytes = 0;
uint32_t oBytes = 0;
for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)
{
if (AF_LINK != ifa->ifa_addr->sa_family)
continue;
if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))
continue;
if (ifa->ifa_data == 0)
continue;
/* Not a loopback device. */
if (strncmp(ifa->ifa_name, "lo", 2))
{
struct if_data *if_data = (struct if_data *)ifa->ifa_data;
iBytes += if_data->ifi_ibytes;
oBytes += if_data->ifi_obytes;
}
}
if (!self.isFirst) {
self.historyIBytes = iBytes;
self.historyOBytes = oBytes;
self.isFirst=YES;
}
self.nowIBytes = (iBytes - self.historyIBytes)/1024 - self.oldIBytes;
self.nowOBytes = (oBytes - self.historyOBytes)/1024 - self.oldIBytes;
self.oldIBytes = (iBytes - self.historyIBytes)/1024;
self.oldOBytes = (oBytes - self.historyOBytes)/1024;
freeifaddrs(ifa_list);
}
@end
@implementation NSObject (NetworkStateOrRSSI)
- (void)setNowIBytes:(uint32_t)nowIBytes
{
objc_setAssociatedObject(self, @selector(nowIBytes), [NSNumber numberWithInt:nowIBytes], OBJC_ASSOCIATION_ASSIGN);
}
- (uint32_t)nowIBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}
- (void)setNowOBytes:(uint32_t)nowOBytes
{
objc_setAssociatedObject(self, @selector(nowOBytes), [NSNumber numberWithInt:nowOBytes], OBJC_ASSOCIATION_ASSIGN);
}
- (uint32_t)nowOBytes
{
return [objc_getAssociatedObject(self, _cmd) intValue];
}
+ (GHNetworkType)networkType
{
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
int type = 0;
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}
return type;
}
+ (int)wifiStrengthBars
{
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
int type = 0;
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
type = [[child valueForKeyPath:@"wifiStrengthBars"] intValue];
}
}
return type;
}
- (void)detectionBytes
{
[self getInterfaceBytes];
}
@end