检测网络状态

vc中使用 viewDidLoad---dealloc willAppear --- willDidDisappear
#pragma mark - 苹果提供的方法
/// 当检测到网络断开时会间隔15s再次检测,如果还是断开则弹窗提醒,防止过于频繁操作
- (void)appleReachabilityTest {
/// Reachability使用了通知,当网络状态发生变化时发送通知kReachabilityChangedNotification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appReachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];

// 被通知函数运行的线程应该由startNotifier函数执行的线程决定
typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSString *remoteHostName = @"www.bing.com";
    /**
     *  有可能有问题这个带host的实例化方法--判断不准确--可以用reachabilityForInternetConnection来替代
     */
    weakSelf.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
    [weakSelf.hostReachability startNotifier];
    
    weakSelf.routerReachability = [Reachability reachabilityForInternetConnection];
    [weakSelf.routerReachability startNotifier];
    // 开启当前线程消息循环
    [[NSRunLoop currentRunLoop] run];
});
}

/// 当网络状态发生变化时调用
 - (void)appReachabilityChanged:(NSNotification *)notification{
Reachability *reach = [notification object];
if([reach isKindOfClass:[Reachability class]]){
    NetworkStatus status = [reach currentReachabilityStatus];
    // 两种检测:路由与服务器是否可达  三种状态:手机流量联网、WiFi联网、没有联网
    if (reach == self.routerReachability) {
        if (status == NotReachable) {
//                NSLog(@"routerReachability NotReachable");
            // 15秒后再次检测
            [self performSelector:@selector(appReachabilityChangedConfirm) withObject:nil afterDelay:15];
        } else if (status == ReachableViaWiFi) {
            NSLog(@"routerReachability ReachableViaWiFi--%@",[NSThread currentThread]);
        } else if (status == ReachableViaWWAN) {
            NSLog(@"routerReachability ReachableViaWWAN");
        } else if (status == kReachableVia4G){
            NSLog(@"routerReachability ReachableVia4G");
        } else if(status == kReachableVia3G){
            NSLog(@"routerReachability ReachableVia3G");
        }else if(status == kReachableVia2G){
            NSLog(@"routerReachability ReachableVia2G");
        }
    }
    if (reach == self.hostReachability) {
        if (status == NotReachable) {
            NSLog(@"hostReachability failed");
        }else if (status == ReachableViaWiFi) {
            NSLog(@"hostReachability ReachableViaWiFi--%@",[NSThread currentThread]);
        } else if (status == ReachableViaWWAN) {
            NSLog(@"hostReachability ReachableViaWWAN");
        } else if (status == kReachableVia4G){
            NSLog(@"hostReachability ReachableVia4G");
        } else if(status == kReachableVia3G){
            NSLog(@"hostReachability ReachableVia3G");
        }else if(status == kReachableVia2G){
            NSLog(@"hostReachability ReachableVia2G");
        }
    }
}
}
/// 再次检测网络,如果还是断开,则视为网络已经断开
- (void)appReachabilityChangedConfirm {
if([self.routerReachability isKindOfClass:[Reachability class]]){
    if ([self.routerReachability currentReachabilityStatus] == NotReachable) {
        dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"网络中断" message:@"请检查网络" preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *cancelBtn = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
            UIAlertAction *okBtn = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
            [alert addAction:cancelBtn];
            [alert addAction:okBtn];
            [self presentViewController:alert animated:YES completion:nil];
        });
    }
}
}

修改源文件增加检测2G/3G/4G功能
.h修改枚举值
typedef enum : NSInteger { NotReachable = 0, ReachableViaWiFi, ReachableViaWWAN, kReachableVia4G, kReachableVia2G, kReachableVia3G } NetworkStatus;

.m
增加头文件
#import <UIKit/UIDevice.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

/Radio Access Technology values/

Paste_Image.png

然后修改此方法
- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags
{
PrintReachabilityFlags(flags, "networkStatusForFlags");
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
// The target host is not reachable.
return NotReachable;
}

NetworkStatus returnValue = NotReachable;

if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
    /*
     If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi...
     */
    returnValue = ReachableViaWiFi;
}

if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
     (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
    /*
     ... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs...
     */
    
    if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
    {
        /*
         ... and no [user] intervention is needed...
         */
        returnValue = ReachableViaWiFi;
    }
}
//
// if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
// {
//  /*
//         ... but WWAN connections are OK if the calling application is using the CFNetwork APIs.
//         */
//  returnValue = ReachableViaWWAN;
// }

if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
    /*
     ... but WWAN connections are OK if the calling application is using the CFNetwork APIs.
     */
    returnValue = ReachableViaWWAN;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CTTelephonyNetworkInfo *phonyNetwork = [[CTTelephonyNetworkInfo alloc] init];
        NSString *currentStr = phonyNetwork.currentRadioAccessTechnology;
        if (currentStr) {
            if ([currentStr isEqualToString:CTRadioAccessTechnologyLTE]) {
                returnValue = kReachableVia4G;
            }else if ([currentStr isEqualToString:CTRadioAccessTechnologyGPRS]|| [currentStr isEqualToString:CTRadioAccessTechnologyEdge]){
                returnValue = kReachableVia2G;
            }else{
                returnValue = kReachableVia3G;
            }
        }
    }else{
        if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
            
            returnValue = kReachableVia3G;
            
            if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
                returnValue = kReachableVia2G;
            }
        }
    }
}

return returnValue;
}

<发现有时候通知会发出2次;有时候通知发出1次?why!>
我觉得应该发出2次才对啊 startNotifier方法调用了2次啊!

Paste_Image.png

Paste_Image.png
Paste_Image.png

demo地址:
https://github.com/jiangweike/networkStatus
参考文章
https://blog.6ag.cn/1310.html
http://xiongzenghuidegithub.github.io/blog/2013/12/30/reachabilityyuan-ma-xue-xi/
http://blog.csdn.net/Axing1991/article/details/46649939
//www.greatytc.com/p/d95c8879d8d5
http://www.cnblogs.com/mddblog/p/5304346.html
http://www.cnblogs.com/scut-linmaojiang/p/iOS-Reachability.html
https://github.com/mddios/NetworkStauts
http://blog.csdn.net/applelg/article/details/47660577
http://www.ithao123.cn/content-2198058.html
https://www.mgenware.com/blog/?p=487
//www.greatytc.com/p/1b0901d0902b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容