网络检测的两种方式

很多情况下,我们的项目需要检测用户的网络,是否是WiFi, 是否是移动窝蜂网
那么下面的代码就是用于网络检测

第一种, 苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态

我们可以使用苹果的这个代码来实现检测的功能
一: 首先点击这里下载苹果官方的示例程序
二: 添加框架SystemConfiguration.framework , 这里其实也可以直接将你下载下来的示例程序中的Reachability的.h 和.m 文件直接拖到你的工程中
三: 具体使用

    1. 在需要的文件, 导入 #import "Reachability.h" 并声明一个属性
@property (nonatomic, strong) Reachability *r1; /**< <#属性名#> */
  • 2.在这里首先感谢@RiversMa同学提醒, 之前我并没有仔细注意到苹果官方的Reachability最新版的文件reachabilityForLocalWiFi方法已经删除,我一直都保留的是2014年3.5的版本, 而这个方法在最新版本里是完全删除了,但是方法的使用并不影响, 但是苹果官方的这个方法并不常用, 所以我就仍然用以前的最简便的方法,你如果想使用苹果官方的方法的话,建议你参考下载的文件中APLViewController 这个类有使用的示例

你可以在你的Reachability文件中手动再加上这个方法:

   + (instancetype)reachabilityForLocalWiFi
{
 struct sockaddr_in localWifiAddress;
 bzero(&localWifiAddress, sizeof(localWifiAddress));
 localWifiAddress.sin_len = sizeof(localWifiAddress);
 localWifiAddress.sin_family = AF_INET;

 // IN_LINKLOCALNETNUM is defined in  as 169.254.0.0.
 localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM);

 Reachability* returnValue = [self reachabilityWithAddress: &localWifiAddress];
 if (returnValue != NULL)
 {
  returnValue->_alwaysReturnLocalWiFiStatus = YES;
 }
    
 return returnValue;
}

并且在Reachability.m文件的类中声明私有属性时,将原来的

{
 SCNetworkReachabilityRef _reachabilityRef;
}

中添加一个私有属性, 变为

{
 BOOL _alwaysReturnLocalWiFiStatus; //default is NO
 SCNetworkReachabilityRef _reachabilityRef;
}
  • 3 初始化
 - (void)viewDidLoad {
    [super viewDidLoad];
    // 1.创建Reachability对象
    self.r1 = [Reachability reachabilityForLocalWiFi];
    // 2.给Reachability对象注册通知 调用getNetworkStatus方法
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNetworkStatus) name:kReachabilityChangedNotification object:nil];
    // 3.让Reachability对象发送网络改变的通知
    [self.r1 startNotifier];    
}
  • 4 getNetworkStatus中实现的方法
 - (void)getNetworkStatus
{
    if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable) {
        NSLog(@"当前是局域网");
    }else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable)
    {
        NSLog(@"当前是蜂窝网");
    }else
    {
        NSLog(@"没有网络");
    }
}
  • 5 移除通知
 - (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
第二种, AFNetworking框架也自带判断网络的功能, 如果你用这个第三方框架的话, 也可以直接选择这个方式
  1. 导入#import "AFNetworking.h"
  2. 下面的代码是这种方式用来判断网络类型的
    - (void)afnReachability
{
    // 1.创建网络监听管理者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    
    // 2.设置网络变化的回调
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        // 只要用户的网络发生改变, 就会调用这个block
        /*
         AFNetworkReachabilityStatusUnknown          = 不能识别,
         AFNetworkReachabilityStatusNotReachable     = 没有网络,
         AFNetworkReachabilityStatusReachableViaWWAN = 蜂窝网,
         AFNetworkReachabilityStatusReachableViaWiFi = 局域网,
         */
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"蜂窝网");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"局域网");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没有网络");
                break;
            default:
                NSLog(@"不能识别");
                break;
        }
    }];
    
    // 3.开始监听
    [manager startMonitoring];
}
  1. 然后我们可以在合适的地方调用这个方法, 或者第一种方式的那个方法也可以
     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //    [self afnReachability];
    [self getNetworkStatus];
}

你可能感兴趣的:(网络检测的两种方式)