网络判断Reachability

使用Reachability判断网络使用情况

特别说明:启动监测需要在`AppDelegate`的`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions`方法中实现。

 

.h文件

 

 

#import <Foundation/Foundation.h>
#import "Reachability.h"

@interface NetworkManager : NSObject

///单例模式
+ (NetworkManager *)shareNetworkManager;

///开启网络状态监听
- (BOOL)startNetworkStatusNotifier;

///获得当前的网络状态
+ (BOOL)getNetworkStatus;

@end


.m文件

 

 

 

#import "NetworkManager.h"

static NetworkManager *staticNetworkStatusManager; //单例实例
static NetworkStatus staticCurrentNetworkStatus;   //当前网络连接

@implementation NetworkManager
{
    Reachability *hostReachbility;
}

//单例模式
+ (NetworkManager *)shareNetworkManager
{
    if (nil == staticNetworkStatusManager)
    {
        staticNetworkStatusManager = [[NetworkManager alloc] init];
    }
    return staticNetworkStatusManager;
}

//开启网络状态监听
- (BOOL)startNetworkStatusNotifier
{
   // 检测设备网络状态,可以以多种形式初始化
    hostReachbility = [Reachability reachabilityWithHostName:@"www.baidu.com"];
    
   // 获得设备现在的网络状态
    staticCurrentNetworkStatus = [hostReachbility currentReachabilityStatus];
    
   // 开启网络状况的监听
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChanged:)
                                                 name:kReachabilityChangedNotification
                                               object:nil];
    
    //开始监听,会启动一个run loop
    return [hostReachbility startNotifier];
}

//处理连接改变后的情况
- (void)updateInterfaceWithReachability:(Reachability *)curReach
{
    staticCurrentNetworkStatus = [curReach currentReachabilityStatus];
}

//连接改变
- (void)reachabilityChanged:(NSNotification *)note
{
    Reachability *curReach = [note object];
//    NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
    if ([curReach isKindOfClass:[Reachability class]])
    {
        [self updateInterfaceWithReachability: curReach];
    }
}

//获得当前的网络状态
+ (BOOL)getNetworkStatus
{
    return staticCurrentNetworkStatus;
}

@end

 

 

 

 

 

使用

1 导入头文件

 

 

#import "NetworkManager.h"

 

2 初始化

在AppDelegate的方法“

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions”中设置

 

 

//获得设备的网络状态
[[NetworkManager shareNetworkManager] startNetworkStatusNotifier];

 

3 使用

 

 

if ([NetworkManager getNetworkStatus] == NotReachable)
{

}

 

补充完善

2019-03-27

1、网络状态说明

使用`AFNetworking`中的`AFNetworkReachabilityManager`类。

(1)没有网络`AFNetworkReachabilityStatusNotReachable`

(2)wifi网络`AFNetworkReachabilityStatusReachableViaWiFi`

(3)蜂窝移动网络`AFNetworkReachabilityStatusReachableViaWWAN`

2、网络权限说明

使用系统原生`CTCellularData`类。

(1)关闭,网络状态为`AFNetworkReachabilityStatusNotReachable`

(2)WLAN,若`无线局域网`关闭,或`蜂窝移动网络`开启时,则网络状态为`AFNetworkReachabilityStatusNotReachable`;若`WLAN`开启时,则网络状态为`AFNetworkReachabilityStatusReachableViaWiFi`;

(3)WLAN与蜂窝移动网,若关闭、或`WLAN`关闭时、或`蜂窝移动网络`关闭时,则网络状态为`AFNetworkReachabilityStatusNotReachable`;若`WLAN`开启时,则网络状态为`AFNetworkReachabilityStatusReachableViaWiFi`;若`蜂窝移动网络`开启且`WLAN`关闭时,则网络状态为`AFNetworkReachabilityStatusReachableViaWWAN`

 

代码示例

// 导入头文件
#import <AFNetworking/AFNetworking.h>

// 开启监测
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

// 获取状态
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        if (status == AFNetworkReachabilityStatusUnknown) {
            NSLog(@"未知, AFNetworkReachabilityStatusUnknown");
        } else if (status == AFNetworkReachabilityStatusNotReachable) {
            NSLog(@"无网, AFNetworkReachabilityStatusNotReachable");
        } else if (status == AFNetworkReachabilityStatusReachableViaWWAN) {
            NSLog(@"蜂窝移动网络, AFNetworkReachabilityStatusReachableViaWWAN");
        } else if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
            NSLog(@"wifi, AFNetworkReachabilityStatusReachableViaWiFi");
        }
}];
// 导入头文件
#import <CoreTelephony/CTCellularData.h>

// 移动蜂窝网络
CTCellularData *cellularData = [[CTCellularData alloc] init];
// 监测权限变化
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState restrictedState) {
     switch (restrictedState) {
        case kCTCellularDataRestrictedStateUnknown:
            // 关闭
            NSLog(@"蜂窝移动网络状态:未知");
         break;
         case kCTCellularDataRestricted:
             // WLAN
            NSLog(@"蜂窝移动网络状态:关闭");
         break;
        case kCTCellularDataNotRestricted:
             // WLAN与蜂窝移动网
            NSLog(@"蜂窝移动网络状态:开启");
         break;

         default:
            NSLog(@"蜂窝移动网络状态:未知");
         break;
     }
};

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值