我正在处理一个处理Web服务的iOS应用程序。我正在使用this code来检测我是否有网络连接。如果我没有互联网连接,我将展示一个视图,说明没有互联网连接(类似于iOS应用商店的方式)。我的问题是,我不确定将此代码放入哪种方法。
我希望每次用户打开应用程序和/或使用其他应用程序切换到应用程序(即我的应用程序在后台打开并且用户切换到它)时,它会检查网络状态。我认为把它放在我的应用程序委托会工作,但它没有。我还考虑过把它放在我的每个视图控制器viewWillAppear
方法中,但是没有用。
关于在何处放置此代码的任何想法?
答案 0 :(得分:5)
如果您打算使用网络连接,则应该查看AFNetworking
https://github.com/AFNetworking/AFNetworking
最新版本的AFNetworking(2.0)现在建立在NSURLSession之上,因此您可以获得所有提供的强大功能。但是,您还可以获得许多额外的功能 - 例如序列化,可达性支持,UIKit集成(例如在UIImageView中异步加载图像的便捷类别)等等。它也是最广泛使用的开源项目之一,在Github上拥有超过10,000颗星,2,600个分叉和160个贡献者。
它有一个名为AFNetworkReachabilityManager
的功能来处理您的请求。
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
DLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[operationQueue setSuspended:NO];
NSLog(@"WIFI");
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[operationQueue setSuspended:YES];
NSLog(@"oflline");
break;
}
}];
您可以找到此代码here
答案 1 :(得分:2)
理想情况下,您应该在每次网络请求之前检查有效的互联网连接。
但是您发布的链接仅用于检测当时的网络状态。您需要观察通知,这会在网络状态发生变化时通知您。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(networkStateChanged:)
name:kReachabilityChangedNotification object:nil];
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
- (void)networkStateChanged:(NSNotification *)notice {
NetworkStatus currentNetStatus = [reachability currentReachabilityStatus];
if (currentNetStatus == NotReachable) {
// No Internet connection
} else {
// We are back !
}
}
此观察员应该在您的app委托中。
答案 2 :(得分:1)
我为我的案例所做的是,我已将下面的片段放在didFinishLaunchingWithOptions
中// Instantiate Shared Manager
[AFNetworkReachabilityManager sharedManager];
// Start network networking monitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
if ([[AFNetworkReachabilityManager sharedManager] isReachable]) {
NSLog(@"IS REACHABILE");
//Here check if your network connection view is already showing on screen, if positive then remove it
if (_viewNetworkConnectionCheck) {
//[_viewNetworkConnectionCheck removeFromSuperView];
_viewNetworkConnectionCheck = nil;
}
} else {
NSLog(@"NOT REACHABLE");
//You have to add your network connectivity view here, just make sure if has been has not been allowcated
if (!_viewNetworkConnectionCheck) {
//[[UIApplication sharedApplication].keyWindow addSubview:_viewNetworkConnectionCheck];
}
}
}];
此外,如果您每次应用程序从后台状态转到前台状态时都必须调用Web服务,那么您可以做的是(或我已经做了什么)将下面的代码放在委托applicationWillEnterForeground中
[self performSelector:@selector(callWebserviceToRefreshData) withObject:nil afterDelay:0.5f];
并在安全地检查互联网连接后添加此方法来调用Web服务
-(void)callWebserviceToRefreshData {
if ([JeebleyHelper isConnected]) {
NSLog(@"Yes, network available");
//Call your web service here
} else {
NSLog(@"No, network not available");
}
}
请确保在一段时间延迟后调用dataRefresh方法,否则isConnected将始终为您提供以前的状态。
+ (BOOL)isConnected {
return [AFNetworkReachabilityManager sharedManager].reachable;
}