即使我的应用未运行,也可确保在网络重新连接后上传内容

时间:2012-09-01 02:04:03

标签: ios multitasking reachability

我正在指定一个iOS应用程序(将在我们公司之外构建),它将用户的数据条目上传到服务器。如果设备未连接到Internet,我们希望在设备上保存数据并在重新连接网络时上传数据。 (该应用程序将主要在大多数时间将断开连接的iPod Touch设备上运行)。

如果用户在重新连接网络后解锁设备并重新打开我们的应用程序,那么上传到服务器应该很容易,因为应用程序正在运行。

但是如果应用程序没有运行,那么“未运行”可能意味着以下一个或多个:

  • 设备已重启电源
  • 用户锁定了设备并将其放在口袋里
  • app崩溃
  • 用户退出应用
  • 用户已开始使用其他应用,因此我们的应用不再在前台运行
  • 还有其他情况吗?

在上述情况中,有没有办法(理想情况下是节省电池的方式)确保在恢复互联网连接后很快上传本地数据?答案是否有所不同取决于上述哪些案例导致应用程序无法运行?

设备是否需要最低iOS版本,以便在应用未运行时仍能上传部分(或全部)上述未运行的案例?

如果这些是明显的新手问题我很抱歉 - 我不是iOS专家。

4 个答案:

答案 0 :(得分:7)

有一种有趣的技术可供其他InstapaperNews.me(此技术的先驱)使用,您可以使用区域监控来启动后台下载或上传。 Marco(Instapaper)在博客上发表了关于他与Apple沟通的博客(episode 80 of the Build and Analyze podcast),因此应该在App Store中被允许。


简而言之技巧是您设置某些区域(地理围栏),如“home”或“work”,并响应locationManager:didEnterRegion:(和类似的)回调。进入预先指定的区域后,您的应用程序将从后台唤醒,您可以查看是否有任何数据要上传。

此技术不会保证在网络重新连接时上传数据,但是当iPod Touch用户回到其WiFi网络时,它将允许您的应用自动上传信息。

这应该最有可能是每天至少一次,可能会或可能不会经常发生。您可以在尝试初始上载时添加时间戳,并在成功获取服务器上正确的事件顺序(数据条目)后沿上载发送。

答案 1 :(得分:3)

无法确保这一点。如果您的应用程序“未运行”(根据您的问题中描述的定义),它将无法响应设备网络状态的更改。应该设置为在下次再次运行应用程序时恢复上载操作。

编辑: 您描述的一些案例确实可能为您的申请提供不同的机会。具体来说,如果用户通过按主页按钮“退出”应用程序或在前台启动另一个应用程序,您的应用程序可能会继续在后台运行,并可能响应网络可访问性的变化。

可以在后台和多长时间内完成的工作的性质已有详细记录,并且支持任务的任何版本的iOS都支持。我建议您查看与App States and Background Services相关的文档。

答案 2 :(得分:1)

  • 设备重新启动 - > 真的没有恢复的方式,除非你打开App !!!
  • 用户已锁定设备并将其放在口袋中 - > apps applicationStatus是UIApplicationStateInactive,但它在后台运行。 您仍然可以对通知和加速计事件做出反应。尝试可达性等级并记录更改!
  • app崩溃了 - > 没有办法,除非打开应用程序
  • 用户已退出应用 - >应用程序坐在后台。使用您的应用程序,完全最多 10分钟限制(就像应用程序“Pastebot”一样)
  • 用户开始使用其他应用,因此我们的应用未运行 前景 - > 与用户退出应用程序相同

在多任务处理Apple上说:

  • 真正的多任务仅适用于某些用途,如音频背景播放,VOIP(如Skype),导航应用
  • 所有其他应用可以在应用关闭后/后台请求特定时间内完成某些任务(如发送电子邮件,短信或上传/下载重要数据)

来自开发文档的重要报价:

  

您的app delegate的 applicationDidEnterBackground:方法有大约5秒的时间来完成任何任务并返回。实际上,这种方法应该尽快返回。如果方法在时间用完之前没有返回,那么您的应用程序将被终止并从内存中清除。如果仍需要更多时间来执行任务,请调用 beginBackgroundTaskWithExpirationHandler:方法来请求后台执行时间,然后在辅助线程中启动任何长时间运行的任务。无论您是否启动任何后台任务,applicationDidEnterBackground:方法仍必须在5秒内退出。

答案 3 :(得分:1)

如果您正在构建一个安静的API,那么我建议使用RestKit,它有一个request queue来检查设备上的网络状态,并在确保网络访问后开始上传。您可以在此处详细了解:http://mobile.tutsplus.com/tutorials/iphone/advanced-restkit-development_iphone-sdk/。阅读有关请求队列和后台下载/上传的部分。应该指出的是RestKit是一个很大的图书馆,它有其优点和缺点。我不完全确定这个que如何与应用程序生命周期一起工作,如果它保存了请求,即使应用程序被终止也是如此。你必须对此进行调查。 RestKit确实支持后台上传/下载,但是如前所述,我认为如果应用程序终止且不处于后台状态,则无法进行任何上传。

如果API不是Rest,我不建议使用RestKit。

您可以在此处下载并试用RestKit:https://github.com/RestKit/RestKit