IT虾米网

iOS检测是否有网络连接详解

shasha 2018年06月24日 手机开发 342 0
如果你的工程里面是用的AFNetworking请求网络数据的话,那么可以直接使用 AFNetworkReachabilityManager.h来判断网络状态!如果是用的ASI的话,里面自带的有Reachability.m和 Reachability.h这两个类,下面会分开介绍这两个的使用方法。

使用AF请求网络:

在AppDelegate.h里面添加类方法:

+ (void)netWorkStatus;//获取网络状态

在.m里面

#import "AppDelegate.h" 
 
#import "ViewController.h" 
 
#import "AFNetworkReachabilityManager.h"//af里面监听网络状态的类 
 
#import "FileManager.h"//单利模型,用来记录当前的网络状态 
 
@interface AppDelegate () 
 
@end 
 
@implementation AppDelegate 
 
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
 
    ViewController *view = [[ViewController alloc] init]; 
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:view]; 
    self.window.rootViewController = nav; 
     
    //调用网络状态 
    [AppDelegate netWorkStatus]; 
     
    return YES; 
} 
 
+ (void)netWorkStatus 
{ 
    /** 
     AFNetworkReachabilityStatusUnknown          = -1,  // 未知 
     AFNetworkReachabilityStatusNotReachable     = 0,   // 无连接 
     AFNetworkReachabilityStatusReachableViaWWAN = 1,   // 3G 花钱 
     AFNetworkReachabilityStatusReachableViaWiFi = 2,   // WiFi 
     */ 
     
    // 如果要检测网络状态的变化,必须用检测管理器的单例的startMonitoring 
    [[AFNetworkReachabilityManager sharedManager] startMonitoring]; 
     
    // 检测网络连接的单例,网络变化时的回调方法 
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
         
        //这是单利+模型,用来记录网络状态 
        FileManager *maa = [FileManager shareFileManager]; 
        maa.netState = status; 
        //        NSLog(@"-----网络状态----%ld---%d", status,maa.netState); 
    }]; 
}

创建一个.h文件命名为Singleton

// 
//  Singleton.h 
//  SingletonModel 
// 
//  Created by 琳小兮 on 15/5/21. 
//  Copyright (c) 2015年 琳小兮. All rights reserved. 
// 
 
//因为方法名 shared"ClassName"是连在一起的,为了让宏能够正确替换掉签名中的“ClassName”需要在前面加上 ## 
//当宏的定义超过一行时,在末尾加上“\”表示下一行也在宏定义范围内。注意最后一行不需要加"\”。 
 
//使用方法:(单利配合模型使用很方便) 
//在.h里面(//公开的访问单利对象的方法singleton_interface(MyModel)) 
//在.m里面(singleton_implementation(MyModel)) 
 
#define singleton_Interface(class)  + (class *)share##class; 
 
#define singleton_implemetntion(class)\ 
static class * instance = nil;\ 
+ (class *)share##class\ 
{\ 
if (!instance) {\ 
instance = [[class alloc]init];\ 
}\ 
return instance;\ 
}\ 
+ (class *)allocWithZone:(struct _NSZone *)zone\ 
{\ 
static dispatch_once_t onece;\ 
dispatch_once(&onece, ^{\ 
instance = [super allocWithZone:zone];\ 
});\ 
return instance;\ 
}

然后创建模型,命名为FileManager  

在FileManager.h里面

#import <Foundation/Foundation.h> 
 
#import "Singleton.h" 
 
@interface FileManager :NSObject 
 
singleton_Interface(FileManager) 
 
@property (nonatomic,assign) int netState; 
 
@end

在FileManager.m里面

#import "FileManager.h" 
 
@implementation FileManager 
 
singleton_implemetntion(FileManager) 
 
@end


如果是用的ASI的话:

在AppDelegate.h里面导入头文件:

#import "Reachability.h"

添加类方法:

+(BOOL) isConnectionAvailable;//判断是否有网络

在.m里面

+(BOOL) isConnectionAvailable{ 
     
    BOOL isExistenceNetwork = YES; 
     
    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"]; 
     
    NSParameterAssert([reach isKindOfClass:[Reachability class]]); 
     
    NetworkStatus stats = [reach currentReachabilityStatus]; 
 
    if (stats == NotReachable) 
        //没有网络 
        isExistenceNetwork = NO; 
    else if (stats == ReachableVia3G) 
        isExistenceNetwork = YES; 
    else if (stats == ReachableVia2G) 
        isExistenceNetwork = YES; 
    else if (stats == ReachableViaWiFi) 
        isExistenceNetwork = YES; 
     
    if (!isExistenceNetwork) { 
         
        return NO; 
    } 
     
    return isExistenceNetwork; 
}

也可以用上面那种方式,利用单利+模型,来记录当前网络的具体状态!

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

iOS图片处理,截图,缩放,存储详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。