為什么微信被頻繁「殺后臺」?聽聽iOS開發者怎么說:兩性共同鑄造

時間:2023-12-09 13:30:31 作者:兩性共同鑄造 熱度:兩性共同鑄造
兩性共同鑄造描述::為什么微信被頻繁「殺后臺」?聽聽 iOS 開發者怎么說 本文首發于圖拉鼎的博客 I'M TUALATRIX,少數派經授權轉載,僅對排版和內容略作調整。 最近,iOS 13.2 頻繁「殺」后臺 App 的事情可以說是讓全球的 iPhone 用戶都很抓狂,大家紛紛在吐槽「bugOS」的同時,也在想是不是個別 App 不遵守規則,導致后臺 App 頻繁被退出。 我在前幾天做過一個初步觀察,說微信被退出的幾率相當高,有些 App 則不太被退出。經朋友提醒,我發現 iOS 日志里有很多關于微信的 Wakeup 記錄。那么,什么是 Wakeup?微信被退出后臺會是過多 Wake 引起的嗎?本文就針對這個問題進行一番探究。 初步觀察 10 月 30 日,我在社交網絡上發布了一個 ,提出在我的 iOS 系統上,微信被退出的現象比較頻繁,之后名為 @Er1cT4n9 的用戶提醒了我說是 導致的這一現象。 我在 iOS 系統設置的「隱私 - 分析與改進 - 分析數據」選項中,確實找到了類似的日志。當時我望文生義,以為 Wakeup 指的就是應用在后臺被喚醒,認為是微信頻繁進行后臺喚醒操作,才被 iOS 系統頻繁「殺」掉。 我就這樣得出了初步結論,想著等微信更新應該會解決這個問題。 進一步觀察 往后幾天,我特別注意觀察了一下,發現不僅是微信,其它的 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 版本,做了些 Workaround 繞過了系統的問題,也可能是專門針對 iOS 13.2 做了新的解決方案。 但是 iOS 13.2「殺后臺」的現象并沒有到此就解決了,還有很多其它的 App 存在這個問題。畢竟這是系統級的問題,連 Safari 都會被 iOS 13.2 頻繁退出。還是期待 Apple 能夠早日徹底解決這個問題吧。 > 下載少數派 、關注 ,了解更多 iOS 資訊
站長聲明:以上關於【為什么微信被頻繁「殺后臺」?聽聽iOS開發者怎么說-兩性共同鑄造】的內容是由各互聯網用戶貢獻並自行上傳的,我們新聞網站並不擁有所有權的故也不會承擔相關法律責任。如您發現具有涉嫌版權及其它版權的內容,歡迎發送至:1@qq.com 進行相關的舉報,本站人員會在2~3個工作日內親自聯繫您,一經查實我們將立刻刪除相關的涉嫌侵權內容。