iOS定时后台处理

12
我希望我的应用程序能够每12小时发送一个HTTP请求到服务器,即使应用程序当前未运行或在后台运行,也能获取一个包含版本号的小文件。如果服务器上的版本高于客户端上的版本,则下载一些文件到磁盘,以便下次启动应用程序时会在磁盘上找到新内容。在iOS中,哪些设计模式最适合这样的任务?
我想到了几个,但经验不足:
1. 可能是推送通知,当有新版本可用时,服务器需要向所有客户端推送消息。 2. 或者,是否有类似于Android的Service可以帮助? 3. 或者,每次应用程序启动(或进入前台)都会与服务器进行连接,查看是否有任何新内容。 4. 或者,每次应用程序启动都会与服务器进行连接,并添加一个定时器,以便在应用程序仍处于前台时再次连接服务器。 5. 或者,每次应用程序启动时,检查首选项值,如果上次连接服务器的时间超过12小时,则立即连接服务器。然后保存此连接时间。
Option 1可能会对服务器造成更大的负担,而且实现起来可能更加复杂(考虑到一个iOS新手),但这可能是真正后台更新的唯一选择。但即使如此,我仍然不希望用户必须对客户端和服务器之间的某些低级数据更新做出反应(这就是它的作用),所以除非推送通知可以直接发送到应用程序并在没有用户干预的情况下执行某些操作,否则这个选项不可行。
选项3-5都是可能的,并且听起来并不太困难,但它们只能在应用程序处于前台时工作。
据我所知,后台应用程序只能播放音乐、获取位置更新或VoIP更新。甚至有这个黑客使用静默声音试图逃避这种限制。(并未获得批准进入商店)
也许现有的限制是有好处的,那么我该怎样遵守规则并能够实现定期的服务器ping(或更一般地解决客户端和服务器之间的周期性同步问题,即使应用程序在后台运行)?
谢谢。

我建议使用4或5。 应用程序可以在后台执行任何操作,但仅限于10分钟。 只有在显示消息并用户选择打开它们时,推送通知才能运行代码。 - ughoavgfhw
4个回答

5
我没有确切的答案来回答你的问题,只有一些可能会帮助你决定什么对你的情况最好的评论。很抱歉,这是我能提供的最好的。
需要记住的一件事是,应用程序不应使用手机的数据计划配额而不告知用户正在下载某些内容。一些应用程序完全是关于下载东西的,例如Twitter客户端,因此应用程序的性质告诉用户应用程序正在使用数据计划。其他应用程序,如绘图程序,没有明确的下载需求,因此应通知用户需要下载。
由于苹果不允许开发人员在后台下载,使用iOS的人们已经习惯等待应用程序下载更新的数据。在等待下载时改善用户体验的典型方法是至少显示一个旋转器,让用户知道应用程序正在工作。为了进一步改善界面,将下载发送到另一个线程,并允许人们继续使用其余部分的应用程序。他们可以与旧数据交互,或者使用不需要更新的应用程序部分。
对于大多数应用程序类型,苹果不给程序员提供在后台下载新内容的机制。根据苹果的公告,iOS 5的新闻杂志功能将允许订阅在后台更新。也许在未来,我们开发人员将有更多的后台下载选项。
我在应用商店上有一个使用方法5的应用程序,另一个正在制作中的应用程序使用方法3。
如果人们希望尽快知道新数据可用,我会使用推送通知(方法1)。这将取决于主题。
iOS没有像Android的服务那样的东西(方法2)。
我有一个应用程序,每次启动应用程序时都会检查新闻的RSS源(方法3)。该应用程序主要做其他事情,但在起始视图上显示源。由于该应用程序是帮助人们找到特定解决方案的简单实用程序,因此RSS源是附属的。
我喜欢方法4中的计时器想法。如果您想给用户一个批准下载的机会,计时器可以弹出警报视图,然后等待。这样,如果设备只是在前台运行您的应用程序,则应用程序实际上不会下载任何内容。
我目前可用的应用程序中方法5的实现略有不同。它仅为许多视图之一下载数据。每次访问此视图时,它会根据存储的时间进行检查,以查看是否应下载新鲜数据。然后它会请求权限。

3
也许限制是有好处的,那么我该如何遵守规则并实现定期服务器ping(或更一般地解决客户端和服务器之间的周期性同步问题,即使应用程序在后台运行)?
选项3、4或5都是正确的选择。
iOS应用程序通常直到需要时才创建视图以节省资源,因此打开无线电并下载用户可能永远不会看到的数据肯定没有意义。
如果用户必须拥有最新的数据才能使用您的应用程序(如果您每天只更新两次,则似乎不太可能),则应设计您的应用程序,使用户不会看到旧数据,或者知道数据正在更新。因此,假设您的应用程序是一个需要了解当前可用利率的抵押贷款计算器。你可以:
- 接受用户输入,但在确认数据已经更新(或下载了新数据)之前不显示结果。 - 接受用户输入并使用您拥有的数据显示结果,但以某种方式显示结果,以便清楚地表明结果可能会改变。这可能意味着在可能更改的数字附近显示旋转器,或者可能在不同颜色中显示可疑数字。 - 在附近显示“数据上次更新时间:…”消息。
用户通常不介意等待几秒钟让移动应用程序完成其任务,尤其是如果:a)他们理解延迟发生的原因,和b)他们的设备在其他方面非常好用,例如比其他设备具有更长的电池寿命。例如,我经常惊讶于我的iPad在需要充电之前可以运行多长时间;如果权衡是我必须等待一些时刻才能使应用程序连接到网络,那么我可以接受这一点。

2

最方便的消息通知方式是使用推送通知来通知用户更新,并且当您的应用程序启动时,它可以显示一些“正在更新…”屏幕。

iOS中的一个主要设计概念是应用程序执行用户要求的操作。因此,如果您需要安装数据密集型更新,则应使用推送通知和更新对话框。

如果您的更新非常频繁(您提到了12小时检查 ->假设24-48小时更新周期),则可能希望每次应用程序启动时加载新数据。Friendly for iPad就是一个很好的例子 - 它们加载大量的html/javascript/css用作在WebViews中显示Facebook内容的框架,因为Facebook的结构变化很快。


0

7
如果你在应用中使用VoIP背景模式的字符串来做与VoIP无关的其他事情,很有可能会被应用商店拒绝,并且可能导致你的开发者账户关闭。 - Duncan Babbage

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