iOS定时后台处理

我希望我的应用程序能够 – 比如说每12个小时 – 即使应用程序没有正常运行或处于后台运行状态,向服务器发送HTTP请求,获取带有版本号的小文件,如果服务器上的版本高于客户端上的版本,然后再下载一些文件到磁盘,以便下次启动时它会在磁盘上find新的内容。

哪些devise模式最适合在ios中执行此类任务?

有一些在我脑海中浮现,但我不是那么有经验。

  1. 也许推送通知,当有新版本可用时,服务器需要向所有客户端发送消息。
  2. 或者,有什么类似的Android的服务 ,可以帮助?
  3. 或者,也许每次应用程序启动(或前往)只是ping服务器,看看有什么新的东西。
  4. 或者,每当应用程序开始ping服务器,并在下一个12小时添加一个计时器,以防这个应用程序仍然在前台。
  5. 或者,每次应用程序启动时,检查首选项值,如果最后一次服务器被ping通的时间超过12小时,则立即进行ping操作。 然后保存这个ping时间。

选项1可能在服务器上更加沉重,实现起来可能更为复杂(考虑一个新版本),但可能是真正的后台更新的唯一select。 但即便如此,我仍然不希望用户不得不对一些低级数据更新b / wa客户端和服务器做出反应(这就是事实),所以除非推送通知可以直接进入应用程序并执行没有用户干预的东西,那么这个选项不会飞。
选项3-5都是可能的,听起来不太难,但只有当应用程序在前台时才能工作。

据我所知,后台应用程序只能播放音乐,获取位置更新或voip更新。 甚至有这样的声音试图逃避这个限制。 (并没有被批准到商店)。

也许现在的局限性是很好的,那么我该如何玩规则并能够实现周期性的服务器ping(或者更一般地说,即使应用程序在bg中也能解决定期同步客户端和服务器的问题)?

谢谢

对于你的问题,我没有一个明确的答案,只是一堆漫无边际的评论,可能会帮助你决定什么最适合你的情况。 对不起,这是我能提供的最好的。

有一点要记住,一个应用程序不应该使用任何手机的数据计划配额,而不让用户知道它正在下载的东西。 一些应用程序都是关于下载诸如Twitter客户端之类的东西,所以应用程序的本质告诉用户应用程序正在使用数据计划。 其他应用程序,如绘图程序,几乎没有明确的下载需求,所以应通知用户需要下载。

由于苹果公司不允许开发者在后台下载,所以使用iOS的用户需要等待他们的应用程序下载更新的数据。 在等待下载期间改善用户体验的典型方式是至less显示微调,让用户知道该应用正在工作。 为了进一步改进界面,请将下载发送到另一个线程,并让用户继续使用应用程序的其余部分。 他们可以与旧数据交互,或使用不需要更新的应用程序部分。

对于大多数应用程序types,Apple不会为程序员提供在后台下载新内容的机制。 根据苹果的公告,iOS 5的Newsstandfunction将允许订阅在后台更新。 也许在将来我们开发者将有更多的后台下载选项。

我在使用方法5的app store中有一个应用程序,而在使用方法3的应用程序中有另一个应用程序。

如果人们希望尽快知道新数据可用,我会使用推送通知(方法1)。 这将取决于这个话题。

iOS没有任何类似Android的服务(方法2)

我有一个应用程序,每次启动应用程序时检查一个RSS新闻(方法3)。 这个应用程序主要是做其他的事情,但在起始视图上显示饲料。 由于该应用程序是一个简单的工具,可以帮助人们find一个特定的解决scheme,RSS源是辅助的。

我喜欢方法4中的计时器想法。如果您想让该人有机会批准下载,计时器可以popup一个警报视图,然后等待。 这种方式应用程序实际上并没有下载的东西,如果设备只是坐在你的应用程序在前台。

我目前可用的应用程序中的方法5的实现有一点变化。 它仅为许多视图中的一个下载数据。 每次访问这个视图时,都会检查存储的时间,看是否应该下载新的数据。 然后它要求许可。

也许现在的局限性是很好的,那么我该如何玩规则并能够实现周期性的服务器ping(或者更一般地说,即使应用程序在bg中也能解决定期同步客户端和服务器的问题)?

选项3,4或5中的任何一个都是正确的select。

iOS应用程序通常甚至在需要保存资源之前不会创build视图,所以打开无线电并下载用户可能永远不会看到的数据绝对没有意义。

如果用户使用您的应用程序拥有最新的数据至关重要(如果您每天仅更新两次,似乎不太可能),您应该devise应用程序,使用户不会查看旧数据,或者知道数据正在更新。 所以,说你的应用程序是一个抵押贷款计算器,需要知道目前可用的利率是什么。 你可以:

  • 获取用户的input,但不显示结果,直到您确认数据是最新的(或下载新数据)。

  • 以用户input的forms显示结果,并使用您所拥有的数据显示结果,但显示结果的方式很明显可能会改变结果。 这可能意味着在可能会改变的数字附近显示一个旋钮,或者可能以不同的颜色显示可疑的数字。

  • 在附近的某个地方显示'上次更新的数据:…'。

用户通常不介意等待几秒钟的移动应用程序来做它的事情,特别是在以下情况下:a)他们理解延迟发生的原因; b)他们的设备在其他方面工作得非常好,比如有相当长的时间电池寿命比其他设备。 例如,我经常惊讶我的iPad需要充电之前运行多久; 如果权衡是我必须等待一会儿的应用程序才能访问networking,那我就没问题。

最方便的消息是用推送通知通知用户更新,当你的应用程序启动时,它可以显示一些“更新..”屏幕。

iOs中的主要devise概念之一是该应用程序做用户要求它做的事情。 所以如果你需要安装数据密集型更新,推送通知和更新对话框是你应该去的方式。 如果你的更新非常频繁(你写了12小时检查 – >假设24-48h更新周期),你可能想每次应用程序启动时加载新的数据。 友好的iPad就是一个很好的例子 – 他们加载了大量的html / javascript / css作为在WebViews中显示facebook内容的框架,因为facebook的结构变化很快。

我会在Info.plist文件中添加voip背景模式string。 然后你可以调用setKeepAliveTimeout:handler:它允许你定期运行一个计划任务。 请记住它会使用更多的电池。

更多信息: http : //developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW15