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