IOS监听网络的变化状况以及是否已连接可用的网络

2016年08月08日星期一

  • 今天改bug的时候,测试小美眉找我说,我的app在使用的时候,突然没有网络了,却没有得到提醒,是个非常不好的体验。 寻思着这个道理,我也在网上找了半天教程,结果都是,抄过来抄过去,你抄我的我抄你的,而且都TM得抄的不专业,连一个可以运行的demo都没有,简直是糟心的不行。虽然我也没有可以运行的demo,但是,我的代码至少是经过了修改的,让各位群众大兄弟不至于看到一个没有声明的变量突兀的在那里被赋值,就连最基本的变量的类型都要靠猜半天才能知道,可读性太低。蠢得一p.
  • 吐槽完毕,言归正传。
  • 网上大部分解决方案都是基于Reachability,但是,也许是我愚钝或者是想的比较多。在使用中,我遇到了麻烦,如果说是个大麻烦也不为过,因为我可能调试了有两三个小时之久。

网上的基本解决方案,大部分是这样。

1
2
3
4
5
6
7

NSString *urlStr = @"www.baidu.com";
Reachability *netConnect = [Reachability reachabilityWithHostName:urlStr];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
[netConnect startNotifier];

//然后监听reachabilityChanged:方法,网络状态一发生改变就获取改变事件。
  • 但是,这里有一个问题,就算网络发生了改变,你怎么知道发生的改变是否可用?打个比方:你手机本来用着3G网,然后你连接到一个没有接网线的无线wifi上,你是监听了是否发生改变。但是,不知道是不是我的手机有问题,还是上天对我不公,总是遇到些小问题。我就算写了urlStr,它还是只判断当前是否已经连接网络,而对于是否已经能和全世界的皮薄一起开心的嗑瓜子,貌似他就不管了。
  • 对于这种,只好发挥我自己的小聪明。我只需要知道什么时候网络发生了改变。然后改变之后,我调用一个网址,看是否能得到回应,如果能得到回应,就说明连接上了互联网,如果得不到回应,那么,就说明了我没有连接上互联网。剑走偏锋。
  • 需要监听的事件内这么写。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // 通知监听的事件
    -(void)reachabilityChanged:(NSNotification *)note{
    //设置了缓冲区,在1秒内多次触发这个函数 将会只执行最后一次,妈的,这里有时候一次要调用两下。
    //取消的函数 必须要和 传入的函数 带的值一样
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(updateInterfaceWithReachability) object:nil];
    [self performSelector:@selector(updateInterfaceWithReachability) withObject:nil afterDelay:1];

    }
    //网络连接该干活了
    -(void)updateInterfaceWithReachability{

    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    // 创建请求(requset)
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2];//缓存策略:基础策略,超时设置:10秒
    // 连接服务器
    self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

    }
    //出现错误
    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
    NSLog(@"连接出错,判定为没有网");
    }
    //接收到反馈信息
    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
    NSLog(@"收到百度的回应,判定为有网");
    }
  • 如果Reachability也能办到,我很乐意用他的一句代码去代替,也许是我使用错了,使用的效果并不是太好,后续我准备自己写一个封装的小控件,自己去捕捉网络的变化,这样,我就不用再用Reachability了,虽然我现在知道的线索仅仅是:SCNetworkReachability这个类。期待我后续的填坑吧~。如果知道我为什么没有达到相同的效果,而使用了这个笨办法,请你告诉我。

评论