在 iOS 应用中检查网络连接的位置
Posted
技术标签:
【中文标题】在 iOS 应用中检查网络连接的位置【英文标题】:Where to check for network connection in iOS app 【发布时间】:2014-07-01 07:08:24 【问题描述】:我正在开发一个处理 Web 服务的 ios 应用程序。我正在使用this code 来检测我是否有网络连接。如果我没有互联网连接,我将显示没有互联网连接的视图(类似于 iOS 应用商店的做法)。我的问题是我不确定将这段代码放在哪种方法中。
我希望每次用户打开应用程序和/或从使用另一个应用程序切换到应用程序(即我的应用程序在后台打开并且用户切换到它)时,它都会检查网络状态。我认为把它放在我的应用程序委托中会起作用,但它没有。我还考虑将它放在我的每个视图控制器 viewWillAppear
方法中,但没有奏效。
知道把这段代码放在哪里吗?
【问题讨论】:
【参考方案1】:如果你打算使用网络连接,你应该看看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
【讨论】:
"If you plan to use networks connections for any reasons, you should take a look at AFNetworking"
有点大胆的声明。为什么我们应该使用AFNetworking
而不是任何其他第三方库或苹果自己的NSURLConnection
?为什么不改用ASIHTTPRequest
? (请注意,我确切地知道原因,我的意思是您需要支持您的陈述。在您的回答中,请不要只发表评论)
感谢@Popeye 的反馈。我希望这会更好。
那好多了+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 !
这个观察者应该在你的应用委托中。
【讨论】:
【参考方案3】:我为我的案例所做的是,我在 didFinishLaunchingWithOptions 中将 sn-p 放在下面
// 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 服务,那么您可以做的是(或者我所做的是)将委托应用程序WillEnterForeground 中的 sn-p 放在下面
[self performSelector:@selector(callWebserviceToRefreshData) withObject:nil afterDelay:0.5f];
并在安全检查互联网连接后添加此方法以调用网络服务
-(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;
【讨论】:
以上是关于在 iOS 应用中检查网络连接的位置的主要内容,如果未能解决你的问题,请参考以下文章
Cordova IOS 8.1如何在打开应用程序时检查网络连接[关闭]
Objective C: iOS 14 如何做网络隐私权限检查