iOS应用确保在致电网络服务最佳做法之前提供互联网

时间:2015-12-09 01:24:12

标签: ios objective-c web-services mobile afnetworking-2

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

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

正如我的研究,iOS没有任何内置方法来确保设备获得互联网访问,因此我使用{strong> Tony Million 的Reachability库检查是否谷歌.com是可以访问的,以确保有互联网连接,然后我创建一个NSMutableURLRequest,超时5秒尝试连接到我们的服务器,如果有响应然后只启动Web服务请求。< / p>

这是我逻辑的伪代码:

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.'

这种方法在应用程序中调用的每个Web服务之前使用,但是,它会使操作看起来延迟或响应缓慢,我想这是因为我们的服务器响应速度慢。

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

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服务并让它落在异常上并相应地提示消息。

这里的任何人都可以给我一些建议或最佳实践方向,从移动设备上调用Web服务来处理我遇到的问题吗?谢谢你的进步和欣赏。

2 个答案:

答案 0 :(得分:1)

你问了很多好问题,但如果不写完整的文章就不容易回答。这里有一个很棒的视频:https://realm.io/news/tmi-active-internet-connection-ios/和一些好的StackOverflow文章,你应该看看:Easiest way to detect Internet connection on iOS?How to check for an active Internet connection on iOS or OSX?

答案 1 :(得分:0)

请记住,在中国大陆期间ping谷歌只会暂停。也许从Apple等ping服务器可以更广泛地使用。此外,当您等待google / baidu数据包返回时,您也可以尝试向服务器发送内容。处理时,只要来自您的服务器,您就可以从谷歌等处丢弃。

最后,您可以在免费的高可用性云系统(如google或amazon AWS)上设置服务,该系统会定期监控您的网站是否已启动并且只是ping该网站。然后,在免费云服务上仅使用少量数据时,您不必费心这些额外的步骤。你甚至可以让基于云的系统缓存一些数据