iOS开发-Reachability网络状态

iOS开发-Reachability网络状态

Reachablity 是一个iOS下检测,iOS设备网络环境用的库。

  • 监视目标网络是否可用
  • 监视当前网络的连接方式
  • 监测连接方式的变更情况

一、Reachability

在Podfile中引入

pod 'Reachability'

二、监听网络状态

先看下Reachability,其中两个block,reachableBlock与unreachableBlock可以很方便监听网络连接状态。

@class Reachability;

typedef void (^NetworkReachable)(Reachability * reachability);
typedef void (^NetworkUnreachable)(Reachability * reachability);


@interface Reachability : NSObject

@property (nonatomic, copy) NetworkReachable    reachableBlock;
@property (nonatomic, copy) NetworkUnreachable  unreachableBlock;

@property (nonatomic, assign) BOOL reachableOnWWAN;


+(Reachability*)reachabilityWithHostname:(NSString*)hostname;
// This is identical to the function above, but is here to maintain
//compatibility with Apples original code. (see .m)
+(Reachability*)reachabilityWithHostName:(NSString*)hostname;
+(Reachability*)reachabilityForInternetConnection;
+(Reachability*)reachabilityWithAddress:(void *)hostAddress;
+(Reachability*)reachabilityForLocalWiFi;

-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref;

-(BOOL)startNotifier;
-(void)stopNotifier;

-(BOOL)isReachable;
-(BOOL)isReachableViaWWAN;
-(BOOL)isReachableViaWiFi;

// WWAN may be available, but not active until a connection has been established.
// WiFi may require a connection for VPN on Demand.
-(BOOL)isConnectionRequired; // Identical DDG variant.
-(BOOL)connectionRequired; // Apple's routine.
// Dynamic, on demand connection?
-(BOOL)isConnectionOnDemand;
// Is user intervention required?
-(BOOL)isInterventionRequired;

-(NetworkStatus)currentReachabilityStatus;
-(SCNetworkReachabilityFlags)reachabilityFlags;
-(NSString*)currentReachabilityString;
-(NSString*)currentReachabilityFlags;

@end

使用Reachability监听网络并且通知

SDReachManager.h

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

typedef NS_ENUM(NSInteger, SDReachStatus) {
    SDReachNotable = 0,
    SDReachableViaWWAN = 1,
    SDReachableViaWiFi = 2,
};

@interface SDReachManager : NSObject

@property (nonatomic, strong) Reachability *reach;

+ (instancetype)sharedInstance;

- (void)startNetNotifier;

/**
 判断网络是否正常

 @return BOOL
 */
- (BOOL)isReachable;

/**
 网络连接状态,是wifi还是WWan

 @return 连接状态
 */
- (SDReachStatus)reachStatus;

@end

SDReachManager.m

#import "SDReachManager.h"
#import "SDContextManager.h"

static SDReachManager *_sharedInstance = nil;

@interface SDReachManager ()

@end

@implementation SDReachManager

/**
 单例模式使用 dispatch_once_t if不是线程安全的
 
 @return 实例对象
 */
+ (instancetype)sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[SDReachManager alloc] init];
    });
    
    return _sharedInstance;
}

- (void)startNetNotifier {
    _reach = [Reachability reachabilityWithHostname:@"www.laikeshuo.com"];
    _reach.reachableBlock = ^(Reachability * reachability) {
        dispatch_async(dispatch_get_main_queue(), ^{
            //网络可用
            NSLog(@"网络可用");
            [[NSNotificationCenter defaultCenter] postNotificationName:kNetworkStatusChangedNotification object:@YES];
        });
    };
    
    _reach.unreachableBlock = ^(Reachability * reachability) {
        dispatch_async(dispatch_get_main_queue(), ^{
            //网络不可用
            NSLog(@"网络不可用");
            [[NSNotificationCenter defaultCenter] postNotificationName:kNetworkStatusChangedNotification object:@NO];
        });
    };
    
    [_reach startNotifier];
}

/**
 判断网络是否正常
 
 @return BOOL
 */
- (BOOL)isReachable {
    return [SDReachManager sharedInstance].reach.isReachable;
}

/**
 网络连接状态,是wifi还是WWan
 
 @return 连接状态
 */
- (SDReachStatus)reachStatus {
    NetworkStatus networkStatus = [[SDReachManager sharedInstance].reach currentReachabilityStatus];
    SDReachStatus reachStatus = SDReachNotable;
    if (networkStatus == NotReachable) {
        reachStatus = SDReachNotable;
    } else if (networkStatus == ReachableViaWiFi) {
        reachStatus = SDReachableViaWiFi;
    } else if (networkStatus == ReachableViaWWAN) {
        reachStatus = SDReachableViaWWAN;
    }
    return reachStatus;
}

@end

三、小结

iOS开发-Reachability网络状态

Reachablity 是一个iOS下检测,iOS设备网络环境用的库。
可以监视目标网络是否可用、监视当前网络的连接方式、监测连接方式的变更情况。

学习记录,每天不停进步。

你可能感兴趣的:(移动开发,iphone开发,Objective-c,ios,网络,cocoa,Reachablity)