2011-06-05 91 views
12

我希望我的应用程序能够 - 即每12小时 - 即使应用程序未正常运行或处于后台运行状态,向服务器发送HTTP请求,文件与版本号,如果服务器上的版本高于客户端上的版本,则将更多文件下载到磁盘,以便下次启动应用程序时,它会在磁盘上找到新内容。iOS计时后台处理

什么样的设计模式最适合在ios中执行此类任务?

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

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

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

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

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

感谢

+0

我建议4或5的应用程序可以做任何它想做的背景,但只有10分钟。推送通知只能在显示消息并且用户选择打开它时运行代码。 – ughoavgfhw 2011-06-05 21:02:56

回答

2

最便捷的信息将与通知推送通知,当一个更新您的应用程序启动时,它会表现出一定的“更新..”屏幕的用户。

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

5

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

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

因为Apple不允许开发人员在后台下载选项,所以使用iOS的人员都会接受培训,等待他们的应用程序下载更新的数据。在等待下载时改善用户体验的典型方法是至少展示一个微调器,让用户知道该应用程序正在工作。为了进一步改进界面,请将下载内容发送到另一个线程,并让用户继续使用应用程序的其余部分。他们可以与旧数据交互,或者使用不需要更新的应用程序部分。

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

我有一个使用方法5应用商店一个应用程序,而另一个在作品中使用方法3

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

iOS不具备像Android的任何服务(方法2)

我有每个应用启动时检查RSS提要的新闻应用程序(方法3)。这个应用程序主要做其他事情,但在起始视图中显示Feed。由于该应用程序是一个简单的实用程序,可帮助人们找到特定的解决方案,因此RSS源是辅助的。

我喜欢方法4中的计时器想法。如果您想让该人有机会批准下载,计时器可以弹出警报视图,然后等待。这样,如果该设备刚好与您的应用一起坐在前台,该应用实际上并不会下载任何内容。

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

3

也许在地方的限制是正当理由,让我怎么遵守游戏规则 并能够实现定期服务器的ping(以上 一般,解决周期同步的问题的B/W的客户和服务器 即使应用程序在BG)?

任何选项3,4或5都是正确的选择。

iOS应用程序通常甚至在需要保存资源时才创建视图,因此打开收音机并下载用户可能看不到的数据绝对没有意义。

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

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

  • 接受用户输入并使用您所拥有的数据显示结果,但显示结果的方式很清楚结果可能会改变。这可能意味着在可能改变的数字附近显示微调框,或者可能以不同颜色显示可疑数字。

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

用户通常不介意等待几秒钟的移动应用程序,以做它的事,尤其是:1)他们明白为何迟迟正在发生的事情,和b)其设备的工作原理相当不错,在其他方面,例如比其他设备具有明显更长的电池寿命。例如,我经常惊讶我的iPad在需要充电之前会运行多久;如果权衡是我必须等待一些时间才能让应用程序访问网络,那我就没问题。

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

+7

实施voip后台模式字符串以便做voip以外的其他操作可能不仅会让您的应用被商店拒绝,还会让您的开发者帐户关闭。 – 2011-09-28 12:35:11