使用 AFNetworking 检查 Internet 连接状态
Posted
技术标签:
【中文标题】使用 AFNetworking 检查 Internet 连接状态【英文标题】:Check Internet connection state using AFNetworking 【发布时间】:2016-10-26 08:42:34 【问题描述】:我想创建一个通用类来检查互联网连接,它也应该在互联网改变状态时通知我。
我正在使用 AFNetworking 来检查互联网状态。
这是我尝试过的代码,但它不起作用请帮助我在哪里犯错??
CheckInternet
是我从NSObject
派生的通用类
CheckInternet.h
#import <Foundation/Foundation.h>
@interface CheckInternet : NSObject
+ (void)startNetworkMonitoring;
+ (BOOL)isInternetConnectionAvailable;
@end
CheckInternet.m
#import "CheckInternet.h"
#import "AFNetworking.h"
@implementation CheckInternet
+ (void)startNetworkMonitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
// Check the reachability status and show an alert if the internet connection is not available
switch (status)
case -1:
// AFNetworkReachabilityStatusUnknown = -1,
NSLog(@"The reachability status is Unknown");
break;
case 0:
// AFNetworkReachabilityStatusNotReachable = 0
NSLog(@"The reachability status is not reachable");
break;
case 1:
NSLog(@"The reachability status is reachable via wan");
[[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:nil];
break;
case 2:
// AFNetworkReachabilityStatusReachableViaWiFi = 2
NSLog(@"The reachability status is reachable via WiFi");
[[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:nil];
break;
default:
break;
];
#pragma mark - Check Internet Network Status
+ (BOOL)isInternetConnectionAvailable
return [AFNetworkReachabilityManager sharedManager].reachable;
@end
在我的ViewController.m
(这里我想查看互联网状态)
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
[CheckInternet startNetworkMonitoring];
if ([CheckInternet isInternetConnectionAvailable])
NSLog(@"---- Internet YES------ ");
else
NSLog(@"----- Internet NO------ ");
//This is not called...
- (void)reachabilityChanged:(NSNotification *)notification
NSLog(@"---- reachabilityChanged ----");
提前致谢!
【问题讨论】:
【参考方案1】:首先,我建议您在AppDelegate
中开始监控您的网络活动。将[CheckInternet startNetworkMonitoring];
移至didFinishLaunchingWithOptions
其次,将以下行添加到case == 0
:
[[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:[NSNumber numberWithInteger:one]];
还要确保在通知中发布连接状态。因为它是一个整数,所以需要将它包装在一个对象中(通常是 NSNumber)。
第三,你需要观察reachabilityChanged
通知。
将此添加到您的viewDidLoad
。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:@"reachabilityChanged"
object:nil];
在您的函数- (void)reachabilityChanged:(NSNotification *)notification
中,您应该能够访问通知的 userInfo 属性并读取那里的状态代码。
另外,一旦你的 viewController 消失了,不要忘记取消观察通知。所以在dealloc
[NSNotificationCenter defaultCenter] removeObserver:self];
【讨论】:
当网络开启/关闭时如何通知? 如果您在 viewController 中观察到reachabilityChanged
,您希望收到通知,那么您的函数应该被调用。
awesome answer dude 完美运行....但是视图控制器的一个问题 dealloc 方法只被调用了
别担心,它是由操作系统调用的,但我们无法真正跟踪它。将代码留在那里,因此当 VC 解除分配时,它也会删除观察。另外,如果它有效,也许将其标记为已接受的答案?以上是关于使用 AFNetworking 检查 Internet 连接状态的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0。如何检查套接字的可达性状态(managerForAddress :)?
如何使用 AFNetworking 2.0 检查 Wordpress 登录信息?
在使用 RESideMenu 显示视图控制器之前,使用 AFNetworking 在 didFinishLaunching 中尽快检查可达性