iOS 定时后台处理

Posted

技术标签:

【中文标题】iOS 定时后台处理【英文标题】:iOS timed background processing 【发布时间】:2011-06-05 20:49:27 【问题描述】:

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

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

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

    也许是推送通知,当有新版本可用时,服务器需要向所有客户端推送消息。 或者,有没有类似于 android 的 Service 的东西可以提供帮助? 或者,也许每次应用程序启动(或进入前台)时,只需 ping 服务器并查看是否有任何新内容。 或者,每次应用开始对服务器执行 ping 操作,并在接下来的 12 小时内添加一个计时器,以防此应用仍处于前台。 或者,每次应用程序启动时,检查一个首选项值,如果上次 ping 服务器是在 12 小时之前,那么现在就 ping 它。然后保存这个ping时间。

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

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

也许现有的限制是有充分理由的,那么我该如何遵守规则并能够实现周期性的服务器 ping(或者更一般地说,即使在应用程序在bg)?

谢谢

【问题讨论】:

我建议使用 4 或 5。应用程序可以在后台执行任何操作,但只能持续 10 分钟。推送通知只有在显示消息并且用户选择打开它们时才能运行代码。 【参考方案1】:

对于您的问题,我没有明确的答案,只是一组杂乱无章的 cmets 可以帮助您确定最适合您的情况的方法。抱歉,这是我能提供的最好的了。

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

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

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

我在应用商店中有一个使用方法 5 的应用,而另一个正在使用方法 3 的应用。

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

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

接受用户输入并使用您拥有的数据显示结果,但显示结果的方式要清楚地表明结果可能会发生变化。这可能意味着在可能改变的数字附近显示一个微调器,或者以不同的颜色显示有问题的数字。

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

用户通常不介意等待几秒钟让移动应用执行其操作,尤其是在以下情况下:a) 他们了解延迟发生的原因,并且 b) 他们的设备在其他方面运行良好,例如比其他设备明显更长的电池寿命。例如,我经常对我的 iPad 在需要充电之前可以运行多长时间感到惊讶;如果权衡是我必须等待一段时间让应用程序进入网络,我可以接受。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我会在您的 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

【讨论】:

实施 voip 后台模式字符串以执行 voip 以外的其他操作可能不仅会导致您的应用被商店拒绝,还会导致您的开发者帐户被关闭。

以上是关于iOS 定时后台处理的主要内容,如果未能解决你的问题,请参考以下文章

如何让iOS设备上App定时执行后台任务(下)

如何让iOS设备上App定时执行后台任务(下)

ios后台任务定时器

如何让iOS设备上App定时执行后台任务(上)

如何让iOS设备上App定时执行后台任务(上)

iOS开发简单的实现后台任务(诸如后台播放音乐,定时器,后台定位等)