iOS定时后台处理

时间:2011-06-05 20:49:27

标签: ios background push-notification

我希望我的应用程序能够 - 比如每12个小时 - 即使应用程序没有正常运行或在后台运行,向服务器发送HTTP请求,获取带有版本的小文件数字,如果服务器上的版本高于客户端上的版本,则将更多文件下载到磁盘,以便下次应用程序启动时,它将在磁盘上找到新内容。

哪些设计模式最适合ios中的此类任务?

我想到了一些,但我没那么有经验。

  1. 也许推送通知,当有新版本可用时,服务器需要将消息推送到所有客户端。
  2. 或者,是否有与Android Service类似的内容可以提供帮助?
  3. 或者,也许每次应用程序启动(或前往前台)时,只需ping服务器并查看是否有新内容。
  4. 或者,每次应用程序开始ping服务器,并在接下来的12小时内添加一个计时器,以防此应用程序仍在前台。
  5. 或者,每次应用程序启动时,检查首选项值,如果上次服务器被ping的时间超过12小时,则立即ping它。然后保存此ping时间。
  6. 选项1在服务器上可能更重,实现起来可能更复杂(考虑使用ios newbe),但可能是实际后台更新的唯一选择。但即便如此,我仍然不希望用户必须对某些低级数据更新b / wa客户端和服务器做出反应(就是这样),所以除非推送通知可以直接进入应用程序并执行在没有用户干预的情况下,此选项不会飞 选项3-5都是可能的,并且听起来不太难,但它们只能在应用程序位于前台时才能工作。

    据我所知,后台应用程序只能播放音乐,获取位置更新或voip更新。甚至有this hack的声音试图逃避这种限制。 (并未获准进入商店)。

    可能存在的限制是有充分理由的,因此我如何遵守规则并能够实现定期服务器ping(或更一般地,解决定期同步黑白客户端和服务器的问题,即使在应用程序中也是如此)在bg)?

    由于

4 个答案:

答案 0 :(得分:5)

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

要记住的一件事是,应用程序不应该使用手机的任何数据计划配额,而不要让用户知道它正在下载内容。一些应用程序都是关于下载诸如Twitter客户端之类的东西,因此应用程序的性质告诉用户应用程序正在使用数据计划。其他应用程序(如绘图程序)几乎不需要下载,因此应通知用户需要下载。

由于Apple不允许开发人员选择在后台下载,因此使用iOS的用户需要等待其应用下载更新数据。在等待下载时改善用户体验的典型方法是至少显示一个微调器,让用户知道应用程序正在运行。要进一步改进界面,请将下载发送到另一个线程,并允许人们继续使用该应用程序的其余部分。他们可以与旧数据交互,或使用不需要更新的应用程序部分。

Apple并没有为程序员提供在大多数应用类型的后台下载新内容的机制。根据Apple的公告,iOS 5的报亭功能将允许订阅在后台更新。也许将来我们的开发人员会有更多的后台下载选项。

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

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

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

我有一个应用程序,每次启动应用程序时都会检查RSS提要以获取新闻(方法3)。此应用程序主要执行其他操作,但会在起始视图中显示Feed。由于应用程序是一个简单的实用程序,可以帮助人们找到特定的解决方案,因此RSS提要是辅助的。

我喜欢方法4中的计时器概念。如果您想让该人有机会批准下载,计时器可能会弹出警报视图,然后等待。这样,如果设备刚刚与您的应用程序保持在前台,那么应用程序实际上并不会下载内容。

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

答案 1 :(得分:3)

  

也许现有的限制是有道理的,所以我该怎么玩   通过规则并能够实现定期服务器ping(或更多   通常,解决定期同步黑客客户端和服务器的问题   即使应用程序在bg)?

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

iOS应用程序通常甚至不需要创建视图才能节省资源,因此打开无线电并下载用户可能永远看不到的数据绝对没有意义。

如果用户拥有最新数据以便使用您的应用程序至关重要(如果您每天仅更新两次似乎不太可能),那么您应该以这样的方式设计您的应用程序:不会看到旧数据,也不知道数据正在更新。所以,说你的应用程序是一个抵押贷款计算器,需要知道当前可用的利率是多少。你可以:

  • 获取用户的输入,但在确认数据是最新的(或下载的新数据)之前不会显示结果。

  • 获取用户输入并使用您拥有的数据显示结果,但以明确结果可能会发生变化的方式显示结果。这可能意味着在可能改变的数字附近显示一个微调器,或者可能以不同的颜色显示可疑数字。

  • 在附近的某处显示“上次更新的数据:...”消息。

用户通常不介意等待几秒钟让移动应用程序做其事情,特别是在以下情况下:a)他们理解延迟发生的原因,以及b)他们的设备在其他方面工作得很好,例如电池寿命明显长于其他设备。例如,我经常惊讶于iPad在需要充电之前需要运行多长时间;如果需要权衡,我必须等待一段时间让应用程序进入网络,我对此感到满意。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

我会在Info.plist文件中添加 voip 后台模式字符串。然后,您可以调用setKeepAliveTimeout:handler:,它允许您定期运行计划任务。请记住,它会使用更多电池。

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