基本上,iOS 中不存在服务类型的应用程序或功能。
即使是“后台”应用程序(UIBackgroundMode)也不能完全免费运行,并且不受其他操作系统上的服务或守护程序等限制。
这是关于后台执行以及通知和计时器等的情况。
1) 应用无法在后台执行,除非:
a) 它要求操作系统提供额外的时间来执行此操作。这是使用 beginBackgroundTaskWithExpirationHandler 完成的。 Apple 没有(有意)指定这个额外的时间有多长,但实际上它大约是 10 分钟。
b) 应用程序具有后台模式,这些模式是 VoIP、音频、位置、报摊。即使它具有这些类型之一,应用程序也无法不受限制地执行。本讨论的其余部分假设应用程序没有后台模式。如果您尝试使用其中一种后台模式来使您的应用能够在后台运行,但您的应用没有合法使用特定功能,那么您的应用将在应用商店提交时被拒绝(即拥有 UIBackgroundMode它必须是:VoIP 应用程序,需要持续更新位置,在后台连续播放音频的能力是一项基本功能,或者是报亭应用程序)。
2) 当一个应用程序被暂停时,它不能做任何事情来直接唤醒自己。它以前不能安排一个 NSTimer,它不能使用像 performSelector:afterDelay 这样的东西。等等
应用再次激活的唯一方法是用户采取措施使其激活。用户可以通过以下方式做到这一点:
a) 直接从应用程序图标启动应用程序
b) 启动应用以响应应用先前在其处于活动状态时安排的本地通知。
c) 启动应用程序以响应服务器发送的远程通知。
d) 其他一些:例如,如果应用程序注册为处理通过 URL 启动,则 URL 启动;或者如果它被注册为能够处理某种类型的内容。
如果本地/远程通知触发时应用程序处于前台,则应用程序会直接接收它。
如果触发本地/远程通知时应用当前不在前台,则应用不会收到它。通知触发时没有执行任何代码!
只有当用户选择通知时,应用才会激活并执行。
请注意,用户可以为整个设备或仅针对特定应用程序禁用通知,在这种情况下,用户将永远看不到它们。如果在通知即将触发时关闭设备,则会丢失。
IOS 7 更新
1) 有一些新的后台模式,例如后台获取(但是,您仍然不能被操作系统以确定性的方式唤醒)
2) 现在有后台推送通知
3) beginBackgroundTaskWithExpirationHandler 时间从 10 分钟减少到 3 分钟左右。