美文网首页iOS开发中填坑工具iOS开发技术集合推送
iOS开发-一句代码调用实现网络的监测功能(基于AFNetwor

iOS开发-一句代码调用实现网络的监测功能(基于AFNetwor

作者: iOS_凯 | 来源:发表于2016-05-17 11:19 被阅读4245次

我们开发app的时候经常需要用到网络监测的功能,来判断网络的状态,根据不同的状态处理不同的事件,比如WIFI 连接的时候下载高清图片,4G流量连接的时候只下载缩略图,没有网络的时候显示缓存数据。

苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态,大家可以自行下载查看。
https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

但是笔者更喜欢利用利用第三方AFNetWorking中的AFNetworkReachabilityManager这个类来,实现网络的监测,因此将这个类再次封装了一下,封装成SZKNetWorkUtils,实现了一句代码调用就可以判断网络的状态,简单易用,分享给大家。(前提是已经将AFNetworking这个第三方导入到项目中, AFNetWorking链接:https://github.com/AFNetworking/AFNetworking)

在ViewController.m导入

#import "SZKNetWorkUtils.h"

一句代码调用,将netState用block返回,1表示手机流量上网,2表示WIFI上网,0或-1表示没网,并且对netState进行了监听,netState改变时将会自动执行相应的方法。

   
    [SZKNetWorkUtils netWorkState:^(NSInteger netState) {
        switch (netState) {
            case 1:{
                NSLog(@"手机流量上网");
            }
                break;
            case 2:{
                NSLog(@"WIFI上网");
            }
                break;
            default:{
                NSLog(@"没网");
            }
                break;
        }
    }];


实现方法:
SZKNetWorkUtils.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

typedef void(^netStateBlock)(NSInteger netState);


@interface SZKNetWorkUtils : NSObject

/**
 *  网络监测
 *
 *  @param block 判断结果回调
 *
 *  @return 网络监测
 */
+(void)netWorkState:(netStateBlock)block;

@end

SZKNetWorkUtils.m中导入

#import "AFNetworkReachabilityManager.h"


#pragma mark----网络检测
+(void)netWorkState:(netStateBlock)block;
{
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    // 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
    [manager startMonitoring];
    //检测的结果
    __block typeof(self) bself = self;
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        if (status==0||status==-1) {
            //弹出提示框
            [bself showWarningView];
            //将netState值传入block中
            block(status);
        }else{
            //将netState值传入block中
            block(status);
        }
    }];
}
#pragma mark---网络断开时弹出提示框
+(void)showWarningView
{
    UIAlertView *alter=[[UIAlertView alloc]initWithTitle:@"提示" message:@"网络断开,请检查网络设置" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去设置", nil];
    [alter show];
}
#pragma mark---alertView点击事件
+(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex==0) {
        NSLog(@"取消");
    }else{
        [[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    }
}

代码相对简单,各位可以直接复制粘贴使用,也可以下载完整的demo,如果喜欢可以star下。
SZKNetWorkUtils链接:https://github.com/18811314750/SZKNetWorkUtils

笔者的其他文章:
iOS在线音乐播放SZKAVPlayer(基于AVPlayer的封装)
http://www.jianshu.com/p/4e0ac2898de0

iOS开发-快速调用照相机和相册,并实现沙盒中照片的保存与读取
http://www.jianshu.com/p/7ffc8844e956

iOS开发-利用命令行实现将本地代码上传到GitHub
http://www.jianshu.com/p/79b94add9057

iOS开发-一句代码调用实现清理缓存功能
http://www.jianshu.com/p/5ebe4f21c486

如果有不足或者错误的地方还望各位读者批评指正,可以评论留言,笔者收到后第一时间回复。
QQ/微信:790057066 。
简书号:iOS_凯:http://www.jianshu.com/users/86b0ddc92021/latest_articles
GitHub个人主页:https://github.com/18811314750
欢迎各位前来查看,star,感谢各位的阅读。

相关文章

网友评论

  • 7696d2968875:请问一下,监听代码写在appdelegate里面,网络状态变化也没反应,有遇到过吗?
    iOS_凯:真机测试没问题,不知道是不是你那网的原因,或者换台测试机试试
  • healthbird:楼主,AFNetworkReachabilityManager是已经封装好的,而且是单例,直接在AppDelegate中调用:[[AFNetworkReachabilityManager sharedManager] startMonitoring];开始监控网络状态即可,AFNetworkReachabilityStatus networkStatus = [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus;
    if (networkStatus <= 0) {
    NSLog(@" --- not network --- ");
    } else if (networkStatus == 1) {
    NSLog(@" --- 流量 --- ");
    } else {
    NSLog(@" --- wifi --- ");
    }
    直接这样不是就拿到网络状态了吗
    iOS_凯:这样是可以的,但是如果想要在某个页面监测网络,不也得把后面那一长串放到某个页面中去呀,我感觉差不多呀,如果只要整体监测,都放到AppDelegate.m中就行了
  • 輕描淡寫沵給過旳傷:楼主,我自己写了一个,在模拟器上面跑起来,永远都是状态为wifi,不管我关闭不关闭模拟器的wifi开关,都是状态打印为wifi,然后今天跑了你的程序,结果也是一模一样,不知道是我这边模拟器的问题还是这个AFNetworkReachabilityManager出了问题,楼主知道的话,给个答复
    iOS_凯:@輕描淡寫沵給過旳傷 抱歉最近太忙,刚看到,如果你还有没有解决的话,是因为那个模拟器的状态是根据你Mac的Wi-Fi来的,并不是模拟器里面的Wi-Fi,所以说,只要Mac连着Wi-Fi打印出来的就是Wi-Fi,你把Mac断网,就会打印出来没网了。用真机测试一下就看出来了。
    darktm:模拟器你本来就是连接的 wifi 啊。
  • 雪_晟:avplayer播放过程中怎么实时监测网络是否良好的状态呢
    iOS_凯:@雪_晟 这个好像跟模拟器里面的Wi-Fi没有关系,跟你电脑上面的Wi-Fi有关系,你把Mac断网了,马上就可以出来效果啦
    iOS_凯:@miss李manman avplayer应该有自带的监测状态的,你可以看一下
  • KennyHito:为什么我跳转不到手机的设置界面?需要xcode设置什么吗?求解?
    iOS_凯:@YuHaitao 我感觉跟那个没关系,如果不行放到viewController中试试
    KennyHito:@iOS_凯 是不是我写在APPDelegate中不能跳转
    iOS_凯:@YuHaitao 应该不需要设置,你可以把跳转那句代码,单独放到一个工程中试试,
  • 思念那年慕云:你好,请问超时是怎么检测的?
    iOS_凯:@思念那年慕云 好的,没试过,改天看看
    思念那年慕云: @iOS_凯 请求数据的时候网速不好的情况,有时候会一直转圈,貌似有个方法,记不太清了,文中好像没提到
    iOS_凯:@思念那年慕云 你说的是检测具体时间吗?不同状态就会调用不同方法呀
  • 尚大大o_O:太棒了你
    iOS_凯:@吃薯条不添手指 :smile:多谢啦,会继续分享的啦
  • 北川正我:不错哦,多谢分享
    iOS_凯:@北川正我 :smile:受宠若惊,会继续努力的

本文标题:iOS开发-一句代码调用实现网络的监测功能(基于AFNetwor

本文链接:https://www.haomeiwen.com/subject/slhprttx.html