美文网首页
APP网络、性能及硬件监控相关

APP网络、性能及硬件监控相关

作者: 独孤流 | 来源:发表于2018-11-08 16:32 被阅读6次

1、内存、CPU等相关监控
DoraemonKit
iOS工具集DoraemonKit技术实现(一)

CocoaDebug

2、iOS获取硬件信息(全部)
iOS-System-Services

3、iOS中检测硬件和传感器


网络检测相关

4、tcp-flow网络抓包
tcpflow 抓包tcpdump和tcpflow命令实践

5、实时带宽监控
携程 App 的网络性能优化实践

iOS下的实际网络连接状态检测:RealReachability

摘抄自:iOS APP中嵌入网速监测功能
iOS 如何进行网络测速
Github: LDSpeedTest


企鹅的手机管家、一些网页都提供了网速监测功能。在开发过程中我们偶>尔也需要开发这个模块,以提示用户网速的状况,增强用户体验。

常见的网络测速方案

通过调研发现,目前常见的网络测速方案只有两种:

方案1:通过上传和下载数据包,使用 TotalSize / TotalTime 来计算真实的>上传和下载速率是多少

方案2:通过读取网卡数据来计算,读取上一秒的整体流量消耗 T1,然后读取当前的流量消耗 T2,那么 T2 - T1 其实可以表示为当前的一个网速情况。同时这个流量数据是可以区分蜂窝网络、Wi-Fi的,也可以区分哪些是上行流量,那些是下行流量。

两种方案各有优劣,可以在合适的场合来选择对应的方案

第一种方案感觉是比较准确,这个时候是真实的在下载或上传数据,比较充分的利用了当前的带宽,计算的网速也比较接近真实的网速值。但是蜂窝网络下,会消耗用户的少量流量。

第二种方案在下载和上传东西时,计算的值和第一种方案比较接近。但是如果当前系统内没有 App 在被使用,处于静止状态的话,其实当前读取的流量值是比较小的,无法反映出网速情况,但是可以实时反映流量消耗状况。

具体实施的方案有如下:

方案一:使用苹果封装的Reachability进行网络检测

如何下载Reachability?

打开Xcode,用快捷键(shift + command + 0)打开并搜索Reachability,>如下图,下载即可。

示例代码:

#import "Reachability.h"  
  
@interface LeftViewController ()  
@property (strong, nonatomic) Reachability *reachability;  
@end  
  
@implementation LeftViewController  
  
- (void)viewDidLoad {  
    [super viewDidLoad];  
  
    // 此处一定要声明全局变量,否则通知是不会执行的   
  
    self.reachability = [Reachability reachabilityForInternetConnection];  
  
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityStatusChange:) name:kReachabilityChangedNotification object:_reachability];  
    [_reachability startNotifier];  
      
}  
  
- (void)reachabilityStatusChange:(NSNotification *)notification {  
    Reachability *reachability = (Reachability *)[notification object];  
    NSParameterAssert([reachability isKindOfClass:[Reachability class]]);  
    NetworkStatus status = [reachability currentReachabilityStatus];  
    NSLog(@"%ld",(long)status);  
}  

问题1:由于上述的监测方式是利用KVO机制,所以是在网络状态变化后才会收到通知,并不是严格意义上的实时检测网络。我们大部分是需要在点击某个按钮,进行网络请求的时候,会检测网络状况,如果没有网络,那就没必要去做请求操作。这时你可以用弹窗的形式提示用户检查网络设置。况且每个视图控制器里都要去注册通知,在控制器销毁的时候移除通知,是个很繁琐的过程,也不利于代码维护(当然你在父视图控制器里用此方法,其他控制器都继承之)。

问题2:由于默认只提供了三种网络状态:NotReachable、reachableViaWiFi和reachableViaWWAN,如果我们要区分2G/3G/4G网络,则需要对Reachability进行相应的更改。

typedef enum : NSInteger {  
     
   NotReachable = 0,  
   ReachableViaWiFi,  
   ReachableViaWWAN,  
 
       ReachableVia2G,  
       ReachableVia3G,  
       ReachableVia4G  
     
} NetworkStatus;  

在源码的基础上,添加2G/3G/4G枚举状态,接下来在.m中修改方法:- networkStatusForFlags:

- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags {  
      
    PrintReachabilityFlags(flags, "networkStatusForFlags");  
      
    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)  
    {  
        // The target host is not reachable.  
        return NotReachable;  
    }  
  
    NetworkStatus returnValue = NotReachable;  
  
    if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)  
    {  
        /* 
         If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi... 
         */  
        returnValue = ReachableViaWiFi;  
    }  
  
    if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||  
        (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))  
    {  
        /* 
         ... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs... 
         */  
  
        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)  
        {  
            /* 
             ... and no [user] intervention is needed... 
             */  
            returnValue = ReachableViaWiFi;  
        }  
    }  
      
    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)  
    {  
        /* 
         ... but WWAN connections are OK if the calling application is using the CFNetwork APIs. 
         */  
          
        if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {  
            CTTelephonyNetworkInfo  *info = [[CTTelephonyNetworkInfo alloc] init];  
            NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;  
            if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {  
                returnValue = ReachableVia4G;  
            } else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {  
                returnValue = ReachableVia2G;  
            } else {  
                returnValue = ReachableVia3G;  
            }  
              
            return returnValue;  
        }  
          
        if ((flags && kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {  
            if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {  
                returnValue = ReachableVia2G;  
                return returnValue;  
            }  
            returnValue = ReachableVia3G;  
            return returnValue;  
        }  
          
        returnValue = ReachableViaWWAN;  
    }  
      
    return returnValue;  
}  

方案二:使用AFNetworkReachabilityManager进行网络监测

此类处于AFNetworking第三方库中,可自行下载。

#import "AppDelegate.h"  
  
@interface AppDelegate ()  
  
@end  
  
@implementation AppDelegate  
  
  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // Override point for customization after application launch.  
  
    // 在此全程检测网络状态,全局可以获取当前的网络状态  
  
    AFNetworkReachabilityManager *networkReachabilityManager = [AFNetworkReachabilityManager sharedManager];  
  
    [networkReachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
        // insert your code ...  
    }];  
    [networkReachabilityManager startMonitoring];      
}  

在需要的地方,调用下面的方法,便可知道目前的网络状态。

- (AFNetworkReachabilityStatus)networkReachabilityStatus {  
    return [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus;  
}  

方案三:使用RealReachability进行实时网络检测

如果我们连接上一个公用WiFi后,用上面两种方式监测网络,其结果都认为你的APP已经连接上了网络,但实际上只是本地连接上,并没有真正接入网络,大家应该有体会。RealReachability提供了实时网络监测的功能,详情可参考链接:点击打开链接。

参考博客:http://blog.csdn.net/drift_Axe/article/details/51463835

http://blog.csdn.net/olsQ93038o99S/article/details/79167070

相关文章

网友评论

      本文标题:APP网络、性能及硬件监控相关

      本文链接:https://www.haomeiwen.com/subject/ervwxqtx.html