长时间运行的后台上传任务

6
我正在开发一款iPhone应用程序,它可以从车辆中收集大量数据,然后将其上传到远程服务器。该应用程序将位于车辆中,连接到其电池以获取电源,并在其生命周期的大部分时间内不需要太多用户交互即可收集数据。因此,重要的是这些上传操作要在后台进行,并且系统会唤醒应用程序执行上传操作。由于这是一款企业应用程序,因此无需经过苹果的审核。
考虑到这些要求,我认为苹果的新iOS 7后台获取API是解决我的问题的好方法。当然,由于我并没有完全按照预期使用它,因此有些事情可能会对我造成一些问题,我需要一些澄清。
以下是我的问题:
1.我观看了有关新API的WWDC视频,了解到iOS将尝试识别应用程序的使用模式,并在使用前将其唤醒。如果很少打开应用程序,那么最终会导致其停止进行这些后台更新吗?
2.当我使用此API时,我会得到一个完成处理程序块,其中会将UIBackgroundFetchResult作为参数。如果我每次都传递UIBackgroundFetchResultFailed,那么iOS是否会认为我仍然需要新数据并继续唤醒应用程序?
3.最后,由于我明显使用此API的方式与预期不同,是否有人可以推荐更好的方法来满足我的要求?

1
+1:我也觉得WWDC视频在这些方面缺乏。在我看来,除非上传/下载确实失败了,否则我不会通过UIBackgroundFetchResultFailed。如果你正在进行上传,并且它们成功完成,我更喜欢传递UIBackgroundFetchResultNewData。这是我从讲话中推断出来的,但我仍在寻找支持这一点的文档... - JRG-Developer
嗯...说得有道理。我唯一担心的是,系统可能会决定不再唤醒我的应用程序,因为我有新数据...虽然,如果iOS无法掌握应用程序下次何时打开,也许它只会继续唤醒它。我需要进行一些测试来确定。 - Zachary Gay
4个回答

3

根据给定的信息:“应用程序本身将坐在车辆中,连接到其电池以获取电源,并在其大部分生命周期内收集数据而不需要太多用户交互”,以及“此外,这是一个企业级应用程序,因此该应用程序不需要经过苹果的批准。”,为什么还要使用后台获取API呢?

选择一个后台模式,例如VOIP,并在后台模式下运行您的任务。即使屏幕被锁定,您的网络连接也将保持活动状态并执行任何发送/接收操作。


1
即使网络连接保持活动状态并且设备始终连接到电池,使用VOIP(或iOS 7之前的任何其他后台模式)也不是理想的选择,因为这不是它们的预期用途。如果这些模式的行为在未来发生变化怎么办?您正在错误地使用它们,因此您的实现可能会很脆弱并且容易出错。或者,如果最终决定将应用上传到App Store,该怎么办?应用程序需要重新编写或面临被拒绝的风险。出于这些原因,我认为这不是一个好主意。 - JRG-Developer
@JRG-Developer:你点赞另一个答案的原因是“+1:这些链接确实很好,可以更好地理解NSURLSession。但是,这并没有真正回答提问者提出的相关问题。”我猜我可以揭穿你对我的反对理由。但这并不必要。 - user523234
@JRG-Developer在这方面实际上是正确的。 这实际上是我们之前构建的系统的第二个版本,在第一个版本中,我们使用了VOIP后台模式来传输数据。 对我们来说,这并不起作用,因为它只允许我们的应用程序在10秒钟内保持唤醒状态,然后再次挂起应用程序。 鉴于我们正在传输的数据量(而且还是通过蜂窝网络),这10秒钟的时间窗口是不够的。 - Zachary Gay
也许我可以在应用程序打开的这10秒窗口期间启动后台任务或使用新的iOS 7后台传输服务API,直到我告诉它停止为止,应用程序将继续执行。你有什么想法吗? - Zachary Gay
+1 这应该是被接受的答案。但不要使用 VoIP,而是使用后台定位服务,创建一个位置管理器并将其设置为最低 GPS 精度。这将使您的应用程序在后台拥有无限时间,并且由于它是汽车应用程序,因此将被应用商店接受(经过一些争论后)。我已经为几个应用程序执行了此操作(现在在商店中)。 - woens

2

我知道已经有一段时间了,但为了记录一下。

我建议你使用AFNetworking,它具有后台支持。 几乎所有你需要知道的内容都在GitHub页面上。

要在后台运行,请查看这个问题: afnetworking-background-file-upload。 不知道问题中的代码是否有效,但回答可能会有所帮助。


0

我相信你可以使用静默推送通知来唤醒应用程序,从而进行后台上传。


1
请在您的帖子中添加示例和/或参考文献。 - Tim

0

我认为,新的iOS 7 API对于你的应用程序来说不够强大。

  1. 后台传输服务需要WiFi(车上有WiFi吗?)如果您不使用后台传输服务,则只有约30秒上传您的内容。
  2. 后台获取并不经常被调用。从我的测试中,大多数情况下,当用户解锁手机时才会发生获取。

话虽如此,位置服务可能是一个很好的选择。每当您的车辆移动到不同的基站时,您的应用程序可以运行约3分钟。

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html


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