iOS 应用在调用 Web 服务最佳实践之前确保互联网可用

iOS app ensure internet available before call web services best practices

我目前正在 iOS 开发一个应用程序,它完全依赖网络服务通过 HTTP 从服务器获取数据并显示在应用程序上。因此,应用程序的互联网访问是保持应用程序 运行 流畅的主要关注点。另外,如果没有网络访问,当应用程序重新访问网络时,部分内容需要通过调用网络服务来刷新。

此外,我公司使用普通服务器,它没有 Google 强大,所以有时它可能没有响应或连接错误返回到应用程序。我的主管建议在调用每个 Web 服务之前,应用程序应该 ping 我们的服务器,以检查我们的服务器是否可以调用 Web 服务。

根据我的研究,iOS 没有任何内置方法来确保设备可以访问互联网,因此我使用了 Tony Million 的 Reachability 检查是否可以访问 google.com 以确保有互联网连接,然后我创建一个 NSMutableURLRequest 超时 5 秒尝试连接到我们的服务器,如果有是响应然后只启动 web 服务请求。

这是我的逻辑的伪代码:

IF google.com is reachable
   IF ourserver.com is reachable
       Call the web service
   ELSE
       Prompt to user 'Server is busy, please try again later'
ELSE
   Prompt to user 'No internet accessed, please try again.'

这种方法在应用程序中调用每个网络服务之前使用,但是,它使操作看起来延迟或响应缓慢,我想这是我们的服务器响应慢造成的。

为了解决应用程序重新获得互联网访问权限时刷新内容的问题,我找到了另一个名为 AFNetworking 的库,它为应用程序提供了丰富的网络相关功能。我可以使用 [[AFNetworkReachabilityManager sharedManager] startMonitoring];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNetworkChangeNotification:) name:AFNetworkingReachabilityDidChangeNotification object:nil]; 来了解设备的网络状态发生变化。但是,这种方法只能知道设备是否连接到网络,而不能检测网络是否可以访问互联网。因此,我计划使用我之前提到的 Reachability 进行互联网访问检查,以重新调用网络服务。下面是伪代码

Network Changed Called
    IF [AFNetworkReachabilityManager sharedManager].reachable]
        IF google.com is reachable
           IF ourserver.com is reachable
               Call the web service
           ELSE
               Prompt to user 'Server is busy, please try again later'
        ELSE
           Prompt to user 'No internet accessed, please try again.'
    ELSE
        Prompt to user 'No internet accessed, please turn on Wifi or 3G.'

但是,这种方法似乎不切实际,因为它需要进行多次检查,而且似乎影响了应用程序的性能。另外我在想,我们对服务器进行超时检查是一个好方法,因为有些用户使用 3G 连接,用户连接到我们的服务器可能需要一些时间,所以这似乎不是一个好方法。有人建议 AFNetworking 可达性足以检查是否已访问互联网,他们假设连接到网络的设备 == 已访问互联网。因此,如果用户确实没有上网但他们已连接到网络,应用程序仍应继续调用网络服务并让它落在异常上并相应地提示消息。

这里的任何人都可以给我一些建议或指导,说明从移动设备调用 Web 服务来处理我遇到的问题的最佳做法吗?提前致谢并感谢。

你问了很多好问题,但不写一篇完整的文章就在这里回答并不简单。这里有一个很棒的视频:https://realm.io/news/tmi-active-internet-connection-ios/ and a few good Whosebug articles here you should check out: Easiest way to detect Internet connection on iOS?, How to check for an active Internet connection on iOS or OSX?.

请记住,在中国大陆 ping google 只会超时。也许可以从 Apple 等更广泛使用的服务器上执行 ping 操作。此外,在您等待 google/baidu 数据包返回时,您不妨也尝试向您的服务器发送一些内容。在处理时,一旦来自您的服务器,您就可以丢弃来自 google 等

的那个

最后,您可以在免费的高可用性云系统(如 google 或亚马逊 AWS)上设置一项服务,该服务会定期监控您的网站是否已启动,然后 ping 一下。这样一来,您就不必费心执行这些额外的步骤,而只需在免费云服务上使用少量数据即可。你甚至可以让基于云的系统缓存一点数据