在 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 如何做网络隐私权限检查

:iOS网络应用编程

验证可用的网络连接和启用位置服务以使用应用程序 [重复]

网络连接已关闭,但位置提供者是 NetworkProvider

**已解决** 在 dart、flutter 应用程序中检查或连续收听互联网连接/网络连接