iPhone SDK网络连接检测

39
我正在开发一款针对iPhone的应用程序,该应用程序对一些网络服务进行了调用。我将此应用程序发布到Apple商店,但因没有向用户显示错误消息而被拒绝(这是正确的),如果没有可用的互联网连接,则显然该应用程序无法工作。
所以我想知道如何最好地实现这一点?我猜测需要在viewDidLoad方法中添加某些内容,以弹出一个警告框,显示类似于“您需要互联网连接才能使用此应用程序”的消息。
任何想法都将不胜感激。
3个回答

48

如果您的应用程序必须具备网络访问功能,最简单的方法是将以下设置添加到您的info.plist中作为布尔值。

  • SBUsesNetwork - 确保设备有活动连接(编辑:不适用,似乎这是某个时候某人发现的私有API。它不在苹果的开发者文档中。)
  • UIRequiresPersistentWiFi - 确保设备通过WiFi连接

如果您的选择不是true,则在启动您的应用程序时,用户将看到一个适当的消息。最好的部分是,该消息来自操作系统,因此是本地化的。

如果您的应用程序在运行时不能从网站下载数据(信号丢失、网站关闭),您仍应警告用户,而不仅仅无限制地旋转。


1
你需要为“SBUsesNetwork”分配一个值,还是只需将其添加为键?我在iPhone SDK或Apple Developer Support网站上找不到任何关于它的文档 :-( - Teflon Ted
7
如果我错了,请纠正我,但这些设置似乎有限制。SBUsesNetwork 只会在飞行模式下才会发出警报。UIRequiresPersistentWiFi 只会在 WiFi 已启用但未连接时才会发出警报。如果用户已禁用 WiFi,则两个设置似乎都不会发出警报。 - clint
1
你确定SBUsesNetwork没有被弃用或其他什么吗?我很难相信为了允许一个应用在App Store上架,苹果要求设置一个标志,而他们在任何文档中都没有提到过这一点... - Kuba Suder
1
SBUsesNetwork似乎是一个“民间传说”的设置,实际上并不需要——从技术上讲,它甚至可能是一个私有API密钥。看看这个:http://blogs.oreilly.com/iphone/2008/11/hunting-down-infoplist-prefere.html 有人通过反向工程找到了它。我认为它从那里开始滚雪球成为一个“必需”的设置。苹果对此没有任何意见,所以我认为这是神话的东西。 - occulus
苹果消息将指示该应用程序将使用“缓存数据”。如果这对您的应用程序来说含义不明确,那么您可能不想使用此方法。 - ed_is_my_name
显示剩余6条评论

28

Apple Developer Connection 提供了一个示例应用(Reachability),使用系统配置框架来确定网络状态。它会告诉你是否有WiFi、EDGE/3G或没有网络连接。

你可以在应用程序中使用此代码的部分来确定网络状态,然后提供接口提示,如果没有连接可用,如UIAlertView


2
我在这里记录了关于Reachability的笔记:https://dev59.com/TnVC5IYBdhLWcg3wykej - Chris Lundie
1
这里有一个不错的苹果可达性示例重制版:http://blog.ddg.com/?p=24它被设计成一种类似于原版的替代品。作者对其进行了精心处理(比苹果更多),我已经成功地使用了他的可达性实现,没有任何问题。请注意,如果您使用ASIHTTP库,则上述可达性重写将作为该库的一部分提供。 - occulus
我正在使用Reachability,但它出现问题。因为它会显示多次警告框,真的很让人烦恼。 - Mashhadi

4
注意:谨防SBUsesNetwork。我个人很想知道SBUsesNetwork最初来自哪里,因为我在苹果文档中找不到任何提及它的信息。当我将该键添加到我的应用程序的plist文件中(作为布尔值)并设置为true时,它似乎并不影响我的应用程序的行为 - 无论是完全重新启动应用程序,还是前台运行之前后台运行的应用程序都没有警告关于飞行模式的提示。
我的应用程序已将UIRequiresPersistentWifi设置为true,这似乎也可以完成人们声称SBUsesNetwork所做的工作(以及其他事情!)。
(我在iPhone 4上运行iOS4.2.1,XCode 3.2.5 64位)。

啊,这很有趣:http://blogs.oreilly.com/iphone/2008/11/hunting-down-infoplist-prefere.html -- 这位人通过逆向工程找到了SBUsesNetwork。这个SBUsesNetwork密钥可能实际上是一个不打算公开使用的私有API? - occulus
啊,好的,我想我现在已经搞明白了。UIRequiresPersistentWifi确实可以做到人们声称的SBUsesNetwork所能做的工作——即警告飞行模式——但你必须理解,在一个应用程序的一次飞行模式激活期间,你只会收到一次关于飞行模式的警告——即使你正确地关闭并重新启动应用程序,如果你之前已经收到过有关飞行模式的警告(而仍然处于飞行模式),它也不会再次警告你。因此,总结一下:SBUsesNetwork看起来像是一个误导,忽略它。(如果有人能够为我提供有关SBUsesNetwork的文档,请告诉我。) - occulus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接