今天接到该需求,上午google了许多,cocoachina了一些,结合了前人的工作,整合了一些思路,封装了一个类,
用户监测当前每秒实时网络流量、wifi信号强弱度0-3、网络环境。现把代码发布。.h文件
//// NetworkStateOrRSSI.h// GHZeusLibraries//// Created by 郭军 on 2017/12/2.// Copyright © 2017年 ZJBL. All rights reserved.//#importtypedef 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