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设备网络环境用的库。
可以监视目标网络是否可用、监视当前网络的连接方式、监测连接方式的变更情况。
学习记录,每天不停进步。