本文首发于图拉鼎的博客I'M TUALATRIX,少数派经授权转载,仅对排版和内容略作调整。
最近,iOS 13.2 频频「杀」后台 App 的工作可以说是让全球的 iPhone 用户都很抓狂,咱们纷繁在吐槽「bugOS」的一同,也在想是不是单个 App 不遵守规则,导致后台 App 频频被退出。
我在前几天做过一个开始调查,说微信被退出的几率适当高,有些 App 则不太被退出。经朋友提示,我发现 iOS 日志里有许多关于微信的 Wakeup 记载。那么,什么是 Wakeup?微信被退出后台会是过多 Wake 引起的吗?本文就针对这个问题进行一番探求。
开始调查
我就这样得出了开始定论,想着等微信更新应该会处理这个问题。
进一步调查
往后几天,我特别注意调查了一下,发现不仅是微信,其它的 App 也会频频被「杀」掉,仅仅程度不一样算了。或者说,之前用着不太会被退出后台的 App,程度也相应增加了,可见 iOS 13.2 的确存在问题。关于这个现象,名为 Michael Tsai 的用户还整理了一份他关于交际网络上关于 iOS 13.2 「杀后台」现象的言辞汇总。
这些现象告诉我,Wakeup 不是我幻想中的 Wakeup,被退出后台的原因没那么简略,所以决议深化研究一下。
什么是 Wakeup?
那么 iOS 日志记载里的 Wakeup 是什么?莫非不是字面意思上的「唤醒」吗?的确不是。
iOS 日志里记载的 Wakeup,不是 App 运用意义上的「唤醒」,而是线程等级的「唤醒」。这要怎么去了解?对此我依据自己的了解进行了弥补解说:
App 运用意义上的唤醒
一个放入后台的 App,当它想要更新地理位置或改写音讯时,它需求被唤醒才干做这些工作,所以它在被放入后台前,会和体系进行一些约好,比方「我是打车 App,我需求不断更新地理位置,所以你要常常唤醒我。」然后体系就会去唤醒它了。
一般 iOS App 被放入后台后,只能在有限的条件下被体系唤醒,而不能随意地自主唤醒进行操作。当咱们不想要 App 被后台唤醒后,自动「杀」掉它基本上就可以到达意图了。
App 线程唤醒
一个 App,不论在前台或是后台,在进行详细的使命时,大多都需求用到多线程的形式,比方:为了不堵塞 UI,用一个线程下载内容,下载完成后切换到主线程去更新 UI。这个进程,便是一次 Wakeup。
关于「线程唤醒」的详细解说,可以看Technical Note TN2151的 这篇文章,我将相关解说的原文内容引证在这里:
The exception subtype WAKEUPS indicates that threads in the process are being woken up too many times per second, which forces the CPU to wake up very often and consumes battery life.
Typically, this is caused by thread-to-thread communication (generally using peformSelector:onThread: or dispatch_async) that is unwittingly happening far more often than it should be. Because the sort of communication that triggers this exception is happening so frequently, there will usually be multiple background threads with very similar Backtraces - indicating where the communication is originating.
从原文中可以清晰得知,Wakeup 便是线程与线程的通讯,当发作异常情况,不论是 App 代码或体系层面,频频地进行线程唤醒会占用 CPU 资源以及耗费电量。
使用频频被「杀」的原因猜想
了解到什么是 Wakeup 后,咱们基本上可以得出一个定论:微信等其它 App,频频被退出,的确不能简略地归结于这些 App 在后台测验唤醒自己太频频而被体系杀掉。究竟体系日志里也写明晰 Acton taken 为 none。
也便是说,iOS 体系尽管记载了线程等级的 Wakeup 操作比较频频,可是也没有因而就直接采纳「杀」掉 App 的动作,App 在后台被退出是后续发作的工作。
根本原因仍是 iOS 13.2 有体系级的 Bug,本来一些合法地让 App 进入后台后坚持一段时间活泼状况的这个机制出了 Bug,导致了但凡用到这个机制的 App,都存在不同程度的被频频退出的或许。
当然也不能因而就否定有些 App 会选用除体系合法机制之外的让自己坚持活泼状况的各种 Trick。众所周知,iOS 13 在隐私和权限方面进一步严厉了起来,或许 iOS 13 在处理这些 Trick 的时分,没能处理完美,导致了使用频频被退出后台的现象发作。
定论
Wakeup 调用不是微信等 App 被退出的自动原因,而是一个触发了 iOS 13.2 中存在的问题或 Bug 后的现象。更深层和详细的原因,或许只要开发商和 Apple 一同去 Debug,才干找到了。期望处理问题后的 iOS 13.3 可以提前到来。
最终,有不少人反应微信现已通过热更新处理了在后台频频被退出的问题,我在测验之后也的确感受到微信能在后台待得更久了。
可是 iOS 13.2「杀后台」的现象并没有到此就处理了,还有许多其它的 App 存在这个问题。究竟这是体系级的问题,连 Safari 都会被 iOS 13.2 频频退出。仍是等待 Apple 可以提前彻底处理这个问题吧。