8

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

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

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

  • 设备已重启
  • 用户已锁定设备并且它就在他的口袋里
  • 应用程序崩溃
  • 用户退出应用
  • 用户开始使用其他应用程序,因此我们的应用程序不再在前台运行
  • 还有其他情况吗?

在上述情况下,是否有办法(最好是省电的方式)确保在 Internet 连接恢复后立即上传本地数据?答案是否因上述哪种情况导致应用程序无法运行而有所不同?

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

如果这些是明显的新手问题,我深表歉意——我不是 iOS 专家。

4

4 回答 4

7

InstapaperNews.me(该技术的先驱)使用了一种有趣的技术,您可以使用区域监控来启动后台下载或上传。Marco (Instapaper) 在博客中谈到了他与 Apple 的沟通(在Build and Analyze 播客的第 80 集中),因此它应该在 App Store 中被允许。


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

这种技术不能保证在网络重新连接时上传数据,但它可以让您的应用程序在 iPod Touch 用户回到他们的 WiFi 网络时自动上传信息。

这应该很可能是每天至少一次,这可能对您来说足够频繁,也可能不够频繁。您可以在尝试初始上传时添加时间戳,并在成功获取服务器上事件(数据条目)的正确顺序后随上传一起发送。

于 2012-09-05T13:43:26.783 回答
3

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

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

可以在后台执行的操作的性质和持续时间都有很好的记录,并且支持多任务处理的任何版本的 iOS 都支持。我建议您查看与App States 和 Background Services相关的文档。

于 2012-09-05T03:19:00.267 回答
1

如果您正在构建一个 RESTful API,那么我建议您使用RestKit,它request queue可以检查设备上的网络状态,并在确保网络访问权限后开始上传。您可以在此处阅读更多相关信息:http: //mobile.tutsplus.com/tutorials/iphone/advanced-restkit-development_iphone-sdk/。阅读有关请求队列和后台下载/上传的部分。需要注意的是,RestKit是一个大图书馆,有它的优点和缺点。我不完全确定这个队列如何与应用程序生命周期一起工作,如果它保存请​​求队列,即使应用程序被终止。您将不得不对此进行调查。RestKit 确实支持后台上传/下载,但如前所述,我认为如果应用程序终止且不处于后台状态,则无法进行任何上传。

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

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

于 2012-09-09T09:32:02.980 回答
1
  • 设备已重启->真的无法恢复,除非您打开应用程序!!!
  • 用户已锁定设备并将其放在口袋里 --> 应用程序应用程序状态为 UIApplicationStateInactive 但它正在后台运行。您仍然可以对通知和加速度计事件做出反应。尝试可达性类并记录更改!
  • 应用程序崩溃 -->没办法,除非打开应用程序
  • 用户退出应用程序-> 应用程序位于后台。在那里,您有最多10 分钟完全使用您的应用程序的限制(就像应用程序“Pastebot”一样)
  • 用户开始使用其他应用程序,因此我们的应用程序不再在前台运行 -->与用户退出应用程序相同

在多任务处理方面,Apple 说:

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

来自开发文档的重要引用:

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

于 2012-09-05T13:12:36.293 回答