2015-06-26 14:41:05 Axing1991 阅读数 4166

最近做一个项目,里面要用到网络监听,感觉好难,早上查了一早上的资料,网上的帖子大都差不多。

看了看,最后整理合并了一下,感觉这个用起来最实在,也最简单。

检测网络状态

让用户了解自己的网络状态,防止一些错误操作

根据用户的网络状态进行智能处理,节省用户流量,提高用户体验

WIFI/3G网络:自动下载高清图片

低俗网络:只下载缩略图

没有网络:只显示离线的缓存数据

添加框架:SystemConfiguration.framework

在网络应用中,需要对用户设备的网络状态进行实时监控,

苹果官方提供了一个叫Reachability的实例程序,便于开发者检测网络状态

Reachablibity的使用步骤

1:导入头文件

#import "Reachability.h"


2:注册网络监听

// 监听网络状态发生改变的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

    // 获得Reachability对象
    self.reachability = [Reachability reachabilityForInternetConnection];
    // 开始监控网络
    [self.reachability startNotifier];

******网络监听 就那么几行代码,

添加到:AppDelegate.h 中的 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}
3:实在通知中的代理方法:networkStateChange
-(void)networkStateChange{
    NSLog(@"网络状态改变了");
    if ([AppDelegate isEnableWIFI]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil) message:NSLocalizedString(@"wifiMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"queding", nil) otherButtonTitles:nil, nil];
        [alert show];
    } else if ([AppDelegate isEnable3G]) {
        if ([[[NSUserDefaults standardUserDefaults]objectForKey:@"wifiSwitch"]isEqualToString:@"on"]) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil)  message:NSLocalizedString(@"3GMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"fou", nil) otherButtonTitles:NSLocalizedString(@"shi", nil), nil];
            alert.tag = 1;
            [alert show];
        }
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil) message:NSLocalizedString(@"noWifiMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"queding", nil) otherButtonTitles:nil, nil];
        [alert show];
    }
    
}
********这个里面,其实就三种状态:3g,没网,wifi,我在这里是各自给了一个弹框;

4:实现有返回值的方法:

// 是否WIFI
+ (BOOL)isEnableWIFI {
    return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}

// 是否3G
+ (BOOL)isEnable3G {
    return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}

********到这里,基本网络监听已经能够实现;不过美中不足的是,只能监听三种状态:3g,没网,wifi。

其实,现在网络状态远远不止3g一种,有人用2G、有人用3G,还有人用4G、5G也快出来了吧。所以只返回一个3G值显然并不满足我们程序的需要;

因为   #import "Reachability.h"  中并没有提供那么多得返回值供我们使用,我在网上查了一下,针对这个问题,好多大牛们已然有了解决方法。


5:修改 Reachability 检测的2G/3G/4G/5G网络 

在networkStatusForFlags:方法里面找到以下的地方,替换就OK;

<p class="p1"><span class="s1">if</span><span class="s2"> (flags & kSCNetworkReachabilityFlagsIsWWAN) {</span></p><p class="p1"><span class="s2">    </span><span class="s1">if</span><span class="s2"> ([[[UIDevice currentDevice] systemVersion] floatValue] >= </span><span class="s3">7.0</span><span class="s2">) {</span></p><p class="p1"><span class="s2">        CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];</span></p><p class="p1"><span class="s2">        NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;</span></p><p class="p1"><span class="s2">        </span><span class="s1">if</span><span class="s2"> (currentRadioAccessTechnology) {</span></p><p class="p1"><span class="s2">            </span><span class="s1">if</span><span class="s2"> ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {</span></p><p class="p1"><span class="s2">                </span><span class="s1">return</span><span class="s2"> kReachableVia4G;</span></p><p class="p1"><span class="s2">            } </span><span class="s1">else</span><span class="s2"> </span><span class="s1">if</span><span class="s2"> ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {</span></p><p class="p1"><span class="s2">                </span><span class="s1">return</span><span class="s2"> kReachableVia2G;</span></p><p class="p1"><span class="s2">            } </span><span class="s1">else</span><span class="s2"> {</span></p><p class="p1"><span class="s2">                </span><span class="s1">return</span><span class="s2"> kReachableVia3G;</span></p><p class="p1"><span class="s2">            }</span></p><p class="p1"><span class="s2">        }</span></p><p class="p1"><span class="s2">    }</span></p><p class="p2"><span class="s2">    </span></p><p class="p1"><span class="s2">    </span><span class="s1">if</span><span class="s2"> ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {</span></p><p class="p1"><span class="s2">        </span><span class="s1">if</span><span class="s2">((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {</span></p><p class="p1"><span class="s2">            </span><span class="s1">return</span><span class="s2"> kReachableVia2G;</span></p><p class="p1"><span class="s2">        }</span></p><p class="p1"><span class="s2">        </span><span class="s1">return</span><span class="s2"> kReachableVia3G;</span></p><p class="p1"><span class="s2">    }</span></p><p class="p1"><span class="s2">    </span><span class="s1">return</span><span class="s2"> kReachableViaWWAN;</span></p><p class="p1"><span class="s2">}</span></p>

好了,到了这里就完全OK了,辛苦了一早上,顺手整理出来!(本人也是IOS小菜鸟一枚:qq:476987239  欢迎一起探讨学习IOS中的技术点)QQ讨论群:1107415488

2015-05-08 15:31:36 wangzi11322 阅读数 9345

检测网络状态

在网络应用中,需要对用户设备的网络状态进行实时监控,目的是
让用户了解自己的网络状态,防止一些误会(比如怪应用无能)
根据用户的网络状态进行智能处理,节省用户流量,提高用户体验
WIFI\3G网络:自动下载高清图片
低速网络:只下载缩略图
没有网络:只显示离线的缓存数据

苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态
https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

Reachability的使用步骤
添加框架SystemConfiguration.framework
这里写图片描述
添加源代码
这里写图片描述
包含头文件

#import "Reachability.h"

抽取工具类

常见用法
// 是否WIFI
+ (BOOL) IsEnableWIFI {
    return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}

// 是否3G
+ (BOOL) IsEnable3G {
    return ([[Reachability reachabilityForInternetConnectionen] currentReachabilityStatus] != NotReachable);
}

网络监控

[[NSNotificationCenter defaultCenter] addObserver:self
 selector:@selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
self.netReachability = [Reachability reachabilityForInternetConnection];
[self.netReachability startNotifier];

- (void)dealloc
{
    [self.netReachability stopNotifier];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}

检测网络状态实例

NetWorkTool工具类

#import <Foundation/Foundation.h>

@interface NetworkTool : NSObject
/**
 *  是否WIFI
 */
+ (BOOL)isEnableWIFI;

/**
 *  是否3G
 */
+ (BOOL)isEnable3G;
@end
#import "NetWorkTool.h"
#import "Reachability.h"

@implementation NetworkTool
// 是否WIFI
+ (BOOL)isEnableWIFI {
    return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}

// 是否3G
+ (BOOL)isEnable3G {
    return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}
@end

实现类

#import "ViewController.h"
#import "Reachability.h"
#import "NetworkTool.h"

@interface ViewController ()
@property (nonatomic, strong) Reachability *reachability;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 监听网络状态发生改变的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

    // 获得Reachability对象
    self.reachability = [Reachability reachabilityForInternetConnection];
    // 开始监控网络
    [self.reachability startNotifier];

}

- (void)dealloc
{
    [self.reachability stopNotifier];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)networkStateChange
{
    NSLog(@"网络状态改变了");
    [self checkNetworkState];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self checkNetworkState];
}
#pragma mark - App应用程序网络类型改变就会调用
- (void)networkStateChange
{
    if ([NetWorkTool isEnableWIFI]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示您" message:@"您现在网络环境为wifi!开始畅享吧!" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alert show];
    } else if ([NetWorkTool isEnable3G]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示您"  message:@"您现在网络环境为3G/4G网络!" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alert show];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示您" message:@"您当前没有可连的网络或已经掉线!" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alert show];
    }
}
2017-10-30 18:21:04 littlelittlepeng 阅读数 4413

在iOS 开发过程中,无论是什么应用,基本上都会涉及到移动设备的网络连接状态判断,以便于在手机等移动端没有网络或者是切换网络后,在应用内给用户以必要的提示,进而提高用户体验。

而iOS 开发中经常用到的Reachability,只能判断手机连接的网络类型(如2g,3g,4g, WiFi或者是无网络连接的情况),并没有实现对所连接网络的可用性(是否可以访问Internet)进行判断。如果手机连接的WiFi并没有接入互联网,那么这台手机虽然连上了WiFi,但是根本就不能上网(例如将路由器的Wan 口网线拔掉)。

下边直接上代码,自己封装的判断网络可用性的方法,根据返回的BOOL 值来判断网络是否可用(可以写到专门的工具类里边,方便在工程中的任何地方调用)。

#define kAppleUrlToCheckNetStatus @"http://captive.apple.com/"

- (BOOL)checkNetCanUse {

    __block BOOL canUse = NO;

    NSString *urlString = kAppleUrlToCheckNetStatus;

    **// 使用信号量实现NSURLSession同步请求**
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSString* result = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        //解析html页面
        NSString *htmlString = [self filterHTML:result];
        //除掉换行符
        NSString *resultString = [htmlString stringByReplacingOccurrencesOfString:@"\n" withString:@""];

        if ([resultString isEqualToString:@"SuccessSuccess"]) {
            canUse = YES;
           NSLog(@"手机所连接的网络是可以访问互联网的: %d",canUse);

        }else {
            canUse = NO;
            NSLog(@"手机无法访问互联网: %d",canUse);
        }
        dispatch_semaphore_signal(semaphore);
    }] resume];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    return canUse;
}

//过滤后台返回字符串中的标签

- (NSString *)filterHTML:(NSString *)html {

    NSScanner *theScanner;
    NSString *text = nil;

    theScanner = [NSScanner scannerWithString:html];

    while ([theScanner isAtEnd] == NO) {
        // find start of tag
        [theScanner scanUpToString:@"<" intoString:NULL] ;
        // find end of tag
        [theScanner scanUpToString:@">" intoString:&text] ;
        // replace the found tag with a space
        //(you can filter multi-spaces out later if you wish)
        html = [html stringByReplacingOccurrencesOfString:
            [NSString stringWithFormat:@"%@>", text]
                                           withString:@""];
    }
    return html;
}
2014-02-16 00:23:16 u011545929 阅读数 607
如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote)。那么你会使用到Reachability来实现网络检测。

写本文的目的
  • 了解Reachability都能做什么
  • 检测3中网络环境
    • 2G/3G
    • wifi
    • 无网络
  • 如何使用通知
    • 单个controller
    • 多个controller
  • 简单的功能:
    • 仅在wifi下使用
Reachability简介
Reachablity 是一个iOS下检测,iOS设备网络环境用的库。
  • 监视目标网络是否可用
  • 监视当前网络的连接方式
  • 监测连接方式的变更
苹果官方提供的Doc

Github上的文档

安装
  • 创建 network 工程(network是我创建的demo工程,附件中可以下载到)
  • 使用Cocoaspod安装依赖
  • 在项目中添加 SystemConfiguration.framework 库
由于Reachability非常常用。直接将其加入到Supporting Files/networ-Prefix.pch中:
  1. #import
复制代码
如果你还不知道cocoaspod是什么,看这里:

使用
stackoverflow上有一篇回答,很好的解释了reachability的用法
  • 一般情况一个Reachability实例就ok了。
  • 一个Controller只需要一个Reachability
Block方式使用
  1. - (void)viewDidLoad
  2. {
  3.     [super viewDidLoad];
  4.      DLog(@"开启 [url]www.apple.com[/url] 的网络检测");
  5.      Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
  6.      DLog(@"-- current status: %@", reach.currentReachabilityString);
  7.     
  8.      // start the notifier which will cause the reachability object to retain itself!
  9.     
  10.      [[NSNotificationCenter defaultCenter] addObserver:self
  11.                                                         selector:@selector(reachabilityChanged:)
  12.                                                              name:kReachabilityChangedNotification
  13.                                                           object:nil];
  14.     
  15.      reach.reachableBlock = ^(Reachability * reachability)
  16.     {
  17.         dispatch_async(dispatch_get_main_queue(), ^{
  18.             self.blockLabel.text = @"网络可用";
  19.                self.blockLabel.backgroundColor = [UIColor greenColor];
  20.         });
  21.     };
  22.    
  23.     reach.unreachableBlock = ^(Reachability * reachability)
  24.     {
  25.         dispatch_async(dispatch_get_main_queue(), ^{
  26.             self.blockLabel.text = @"网络不可用";
  27.                self.blockLabel.backgroundColor = [UIColor redColor];
  28.         });
  29.     };
  30.     
  31.      [reach startNotifier];
  32. }
复制代码
使用notification的方式
  1. - (void)viewDidLoad
  2. {
  3.     [super viewDidLoad];
  4.      DLog(@"开启 [url]www.apple.com[/url] 的网络检测");
  5.      Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
  6.      DLog(@"-- current status: %@", reach.currentReachabilityString);
  7.     
  8.      // start the notifier which will cause the reachability object to retain itself!
  9.     
  10.      [[NSNotificationCenter defaultCenter] addObserver:self
  11.                                                         selector:@selector(reachabilityChanged:)
  12.                                                              name:kReachabilityChangedNotification
  13.                                                           object:nil];
  14.      [reach startNotifier];
  15. }

  16. - (void) reachabilityChanged: (NSNotification*)note {
  17.      Reachability * reach = [note object];
  18.    
  19.     if(![reach isReachable])
  20.     {
  21.         self.notificationLabel.text = @"网络不可用";
  22.           self.notificationLabel.backgroundColor = [UIColor redColor];
  23.           self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
  24.           self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
  25.           return;
  26.     }
  27.        
  28.      self.notificationLabel.text = @"网络可用";
  29.      self.notificationLabel.backgroundColor = [UIColor greenColor];
  30.     
  31.      if (reach.isReachableViaWiFi) {
  32.           self.wifiOnlyLabel.backgroundColor = [UIColor greenColor];
  33.           self.wifiOnlyLabel.text = @"当前通过wifi连接";
  34.      } else {
  35.           self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
  36.           self.wifiOnlyLabel.text = @"wifi未开启,不能用";
  37.      }
  38.     
  39.      if (reach.isReachableViaWWAN) {
  40.           self.wwanOnlyLabel.backgroundColor = [UIColor greenColor];
  41.           self.wwanOnlyLabel.text = @"当前通过2g or 3g连接";
  42.      } else {
  43.           self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
  44.           self.wwanOnlyLabel.text = @"2g or 3g网络未使用";
  45.      }
  46. }
复制代码
附件demo说明开启wifi状态

关闭wifi的状态
 

wifi 2g 3g 4g

阅读数 72

没有更多推荐了,返回首页