我正在指定一个iOS应用程序(将在我们公司之外构建),它将用户的数据条目上传到服务器。如果设备未连接到Internet,我们希望在设备上保存数据并在重新连接网络时上传数据。 (该应用程序将主要在大多数时间将断开连接的iPod Touch设备上运行)。
如果用户在重新连接网络后解锁设备并重新打开我们的应用程序,那么上传到服务器应该很容易,因为应用程序正在运行。
但是如果应用程序没有运行,那么“未运行”可能意味着以下一个或多个:
在上述情况中,有没有办法(理想情况下是节省电池的方式)确保在恢复互联网连接后很快上传本地数据?答案是否有所不同取决于上述哪些案例导致应用程序无法运行?
设备是否需要最低iOS版本,以便在应用未运行时仍能上传部分(或全部)上述未运行的案例?
如果这些是明显的新手问题我很抱歉 - 我不是iOS专家。
答案 0 :(得分:7)
有一种有趣的技术可供其他Instapaper和News.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)
在多任务处理Apple上说:
来自开发文档的重要报价:
您的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。