我們剛剛討論了 macOS 平台第三方輸入法的生命週期到底是怎樣的?,現在趁熱再來聊聊 iOS 平台的第三方鍵盤生命週期。
在蘋果官網,也就只有個這:
這看起來似乎很容易理解,鍵盤的生命週期是系統管理的,每次用戶呼出鍵盤,就它就啟動,用戶收起鍵盤,過一會它就被消滅了。
但有了前文對 macOS 輸入法框架的生命週期的經驗,我們再來看 iOS,真的是這樣嗎?在蘋果開發者文檔相關頁面的最末尾:
- 請記住,關閉鍵盤不一定會終止鍵盤擴展過程. 不要假設系統會在您的鍵盤不再顯示在屏幕上時釋放它正在使用的內存.
這段不知道什麼時候加上去的說明表示:收起鍵盤並不一定就會結束鍵盤的進程……所以擴展+後台這兩個屬性導致你的鍵盤進程極其容易被系統當作垃圾幹掉,顯然這樣會觸發一個莫名其妙的崩潰記錄……
總之,有了 macOS 輸入法生命週期的經驗,我們可以知道 iOS版 的處理沒差多少——系統會在第一次彈出鍵盤時啟動第三方鍵盤的進程,然後這個進程就全程在後台運行了(別想的太美,反正鍵盤沒彈出,絕大多數API是無效的就是了),當用戶焦點在輸入框時,就會彈出鍵盤,即初始化一個 Controller,與 macOS 不同的是,這裡沒有 輸入會話 了,每次彈出鍵盤,都會初始化一個新的 Controller,與具體在哪個 App 中並無關係。
——如果鍵盤崩潰了呢?這一點和 macOS 一樣,立即重啟,如果連續崩潰,則退回到一個系統自帶的備用鍵盤,保證用戶體驗。
長久以來,我同樣以為只有一個 Controller,運用了大量全局變量,顯然,我們不可能同時顯示兩個鍵盤並給不同的輸入框同時輸入,這就造成了在一些極端情況下 Controller 找錯了等奇怪的 Bug。並一直以為是 Xcode Debug 的 Bug 導致真機編譯時不會自動結束鍵盤進程。
總之,了解這個生命週期後,就可以更好的安排內存,並在後台做一些內存方面的處理,確保長時間不用的鍵盤進程不會被系統當作垃圾幹掉了。
本文由 落格博客 原創撰寫:落格博客 » iOS 平台第三方輸入法的生命週期到底是怎樣的?
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3569.html