| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- //
- // RAReachability.m
- // Apex And Drivers
- //
- // Created by Jack on 2018/10/23.
- // Copyright © 2018年 USAI. All rights reserved.
- //
- #import "RAReachability.h"
- #import "Reachability.h"
- #import "config.h"
- #define host URL_SERVER
- @interface RAReachability ()
- @property (nonatomic,copy) void(^ReachabilityBlk)(BOOL);
- @end
- @implementation RAReachability {
- Reachability *_hostReachability; ///< 服务器可达
- Reachability *_connectionReachability; ///< 本机网络状态
- }
- + (instancetype)defaultReachability {
- static RAReachability *reachability;
- static dispatch_once_t token;
- dispatch_once(&token, ^{
- reachability = [[RAReachability alloc] _init];
- });
- return reachability;
- }
- - (instancetype)_init {
- if (self = [super init]) {
- self->_hostReachability = [Reachability reachabilityWithHostName:host];
- self->_connectionReachability = [Reachability reachabilityForInternetConnection];
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityConnectionChanged:) name:kReachabilityChangedNotification object:nil];
- }
- return self;
- }
- - (void)dealloc {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
- - (void)startNotifier:(void(^)(BOOL reachable))reachableBlk {
-
- self.ReachabilityBlk = reachableBlk;
-
- dispatch_async(dispatch_get_global_queue(0, 0), ^{
-
- [self->_hostReachability startNotifier];
- [self->_connectionReachability startNotifier];
-
- [[NSRunLoop currentRunLoop] run];
- });
- }
- - (void)stopNotifier {
- self.ReachabilityBlk = nil;
- [self->_hostReachability stopNotifier];
- [self->_connectionReachability stopNotifier];
- }
- - (void)reachabilityConnectionChanged:(NSNotification *)notification {
-
- Reachability *reachability = [notification object];
- if ([reachability isMemberOfClass:[Reachability class]]) {
-
- NetworkStatus status = reachability.currentReachabilityStatus;
-
- dispatch_async(dispatch_get_main_queue(), ^{
-
- if (reachability == self->_hostReachability) {
-
- switch (status) {
- case NotReachable: {
- if (self.ReachabilityBlk) {
- self.ReachabilityBlk(false);
- }
- }
- break;
- case ReachableViaWiFi: {
- if (self.ReachabilityBlk) {
- self.ReachabilityBlk(true);
- }
- }
- break;
- case ReachableViaWWAN: {
- if (self.ReachabilityBlk) {
- self.ReachabilityBlk(true);
- }
- }
- break;
-
- default:
- break;
- }
-
- }
- else if (reachability == self->_connectionReachability) {
-
- switch (status) {
- case NotReachable: {
- if (self.ReachabilityBlk) {
- self.ReachabilityBlk(false);
- }
- }
- break;
-
- default: {
- if (self.ReachabilityBlk) {
- self.ReachabilityBlk(true);
- }
- }
- break;
- }
- }
-
- });
-
- }
- }
- @end
|