那么 iOS 日志记录里的 Wakeup 是什么?确实不是不是字面意思上的「唤醒」。iOS 日志里记录的 Wakeup,不是 App 使用意义上的「唤醒」,而是线程级别的「唤醒」。这要如何去理解?
一个放入后台的 App,当它想要更新地理位置或刷新消息时,它需要被唤醒才能做这些事情,于是它在被放入后台前,会和系统进行一些约定,比如「我是打车 App,我需要不断更新地理位置,所以你要常常唤醒我。」然后系统就会去唤醒它了。通常 iOS App 被放入后台后,只能在有限的条件下被系统唤醒,而不能随意地自主唤醒进行操作。当我们不想要 App 被后台唤醒后,主动「杀」掉它基本上就可以达到目的了。
一个 App,不管在前台或是后台,在进行具体的任务时,大多都需要用到多线程的模式,比如:为了不阻塞 UI,用一个线程下载内容,下载完成后切换到主线程去更新 UI。这个过程,就是一次 Wakeup。Wakeup 就是线程与线程的通讯,当发生异常情况,不管是 App 代码或系统层面,频繁地进行线程唤醒会占用 CPU 资源以及消耗电量。
而造成这一情况的根本原因仍然是 iOS 13 有系统级的 Bug,原本一些合法地让 App 进入后台后保持一段时间活跃状态的这个机制出了 Bug,导致了凡是用到这个机制的 App,都存在不同程度的被频繁退出的可能。
当然也不能因此就否认有些 App 会采用除系统合法机制之外的让自己保持活跃状态的各种 Trick。众所周知,iOS 13 在隐私和权限方面进一步严格了起来,也许 iOS 13 在处理这些 Trick 的时候,没能处理完美,导致了应用频繁被退出后台的现象发生。