很多情况下,我们的项目需要检测用户的网络,是否是WiFi, 是否是移动窝蜂网
那么下面的代码就是用于网络检测
第一种, 苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态
我们可以使用苹果的这个代码来实现检测的功能
一: 首先点击这里下载苹果官方的示例程序
二: 添加框架SystemConfiguration.framework , 这里其实也可以直接将你下载下来的示例程序中的Reachability的.h 和.m 文件直接拖到你的工程中
三: 具体使用
-
- 在需要的文件, 导入 #import "Reachability.h" 并声明一个属性
@property (nonatomic, strong) Reachability *r1; /**< <#属性名#> */
- 2.在这里首先感谢@RiversMa同学提醒, 之前我并没有仔细注意到苹果官方的Reachability最新版的文件
reachabilityForLocalWiFi
方法已经删除,我一直都保留的是2014年3.5的版本, 而这个方法在最新版本里是完全删除了,但是方法的使用并不影响, 但是苹果官方的这个方法并不常用, 所以我就仍然用以前的最简便的方法,你如果想使用苹果官方的方法的话,建议你参考下载的文件中APLViewController
这个类有使用的示例
你可以在你的Reachability文件中手动再加上这个方法:
+ (instancetype)reachabilityForLocalWiFi
{
struct sockaddr_in localWifiAddress;
bzero(&localWifiAddress, sizeof(localWifiAddress));
localWifiAddress.sin_len = sizeof(localWifiAddress);
localWifiAddress.sin_family = AF_INET;
// IN_LINKLOCALNETNUM is defined in as 169.254.0.0.
localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM);
Reachability* returnValue = [self reachabilityWithAddress: &localWifiAddress];
if (returnValue != NULL)
{
returnValue->_alwaysReturnLocalWiFiStatus = YES;
}
return returnValue;
}
并且在Reachability.m文件的类中声明私有属性时,将原来的
{
SCNetworkReachabilityRef _reachabilityRef;
}
中添加一个私有属性, 变为
{
BOOL _alwaysReturnLocalWiFiStatus; //default is NO
SCNetworkReachabilityRef _reachabilityRef;
}
- 3 初始化
- (void)viewDidLoad {
[super viewDidLoad];
// 1.创建Reachability对象
self.r1 = [Reachability reachabilityForLocalWiFi];
// 2.给Reachability对象注册通知 调用getNetworkStatus方法
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNetworkStatus) name:kReachabilityChangedNotification object:nil];
// 3.让Reachability对象发送网络改变的通知
[self.r1 startNotifier];
}
- 4 getNetworkStatus中实现的方法
- (void)getNetworkStatus
{
if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable) {
NSLog(@"当前是局域网");
}else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable)
{
NSLog(@"当前是蜂窝网");
}else
{
NSLog(@"没有网络");
}
}
- 5 移除通知
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
第二种, AFNetworking框架也自带判断网络的功能, 如果你用这个第三方框架的话, 也可以直接选择这个方式
- 导入#import "AFNetworking.h"
- 下面的代码是这种方式用来判断网络类型的
- (void)afnReachability
{
// 1.创建网络监听管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 2.设置网络变化的回调
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// 只要用户的网络发生改变, 就会调用这个block
/*
AFNetworkReachabilityStatusUnknown = 不能识别,
AFNetworkReachabilityStatusNotReachable = 没有网络,
AFNetworkReachabilityStatusReachableViaWWAN = 蜂窝网,
AFNetworkReachabilityStatusReachableViaWiFi = 局域网,
*/
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窝网");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"局域网");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
break;
default:
NSLog(@"不能识别");
break;
}
}];
// 3.开始监听
[manager startMonitoring];
}
- 然后我们可以在合适的地方调用这个方法, 或者第一种方式的那个方法也可以
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// [self afnReachability];
[self getNetworkStatus];
}