iOS14.2中當點擊新創(chuàng)建的Window時KeyWindow改變問題探究

問題描述:

現(xiàn)在的App里一共有2個UIWindow,一個是加載Tabbar的Window,一個是懸浮播放器的Window咽瓷。 像Loading這種視圖默認是加載在 UIApplication.shared.keyWindow上的。

但在升級到iOS14.x后出現(xiàn)了一個問題绑蔫。
當點擊懸浮播放器的Window時柄驻,App的KeyWindow會自動變成懸浮播放器的Window胁出。
這個時候再去添加Loading到KeyWindow上就會出現(xiàn)視圖錯亂的Bug。

明明在iOS14以前都是好的忆家,為什么在iOS14.5的系統(tǒng)就會出現(xiàn)這個問題犹菇。

探究過程:

方案一:

首先想到的就是通過runtime Hook的方式去監(jiān)聽 UIApplication.shared.keyWindow的Set方法,來確定改變時機芽卿。
但KeyWindow屬性在UIKit中標記為{ get }. 故方案不可取揭芍。?

image.png

方案二:

通過Symbolic BreakPoint [符號斷點]來查看其方法調(diào)用堆棧。

image.png

那就讓我們開始吧~

首先通過斷點工具查看 UIApplication.shared.keyWindow的具體實現(xiàn)卸例。

image.png

其實是調(diào)用了UIWindow 的 KeyWindow 方法称杨。
然后 通過反編譯來獲取 UIWindow的KeyWindow方法具體實現(xiàn)流酬,發(fā)現(xiàn)無法獲取方法的具體實現(xiàn)。

這個時候就通過classdump獲取UIWindow類的所有方法列另,逐個查閱, 找出可能有關系的方法芽腾。
再通過斷點找出對應堆棧。

具體UIKit的class dump網(wǎng)上已經(jīng)有很多人做了页衙,這里提供一個現(xiàn)成的UIWindow.h的頭文件內(nèi)容摊滔。

在全局搜索了所有關于Keywindow的方法后,


image.png
- (void)_makeKeyWindowIgnoringOldKeyWindow:(BOOL)arg1;

這個方法的可能性最強店乐。

在Xcode中繼續(xù)打一個symbolic 斷點艰躺。用來監(jiān)聽[UIWindow _makeKeyWindowIgnoringOldKeyWindow:]的調(diào)用。

image.png

在iOS14.5的手機上當點擊新的窗口時,會觸發(fā)斷點眨八。
而在iOS13.6的系統(tǒng)上腺兴。斷點不會觸發(fā)。

這也證實了筆者的猜測廉侧。

image.png

那么是為什么在點擊新的Window上時會觸發(fā)Window改變呢页响?
通過查看方法調(diào)用順序,發(fā)現(xiàn)是[_UIRemoteKeyboards peekApplicationEvent:]觸發(fā)了KeyWindow的改變段誊。

image.png

我們再看看[_UIRemoteKeyboards peekApplicationEvent:] 做了些什么闰蚕, 原來在其方法內(nèi)部調(diào)用了更新KeyWindow的方法。

image.png

結論:

在iOS14.x后點擊新創(chuàng)建的Window KeyWindow會切換连舍,主要是蘋果在iOS14.x后修改了UIKit的底層實現(xiàn)没陡。 在iOS14.x版本后點擊Window觸發(fā)的[_UIRemoteKeyboards peekApplicationEvent:]會調(diào)用[UIWindow _makeKeyWindowIgnoringOldKeyWindow:]來更新KeyWindow.

而在iOS14.x之前也會觸發(fā)[_UIRemoteKeyboards peekApplicationEvent:]方法,但不會調(diào)用[UIWindow _makeKeyWindowIgnoringOldKeyWindow:]來更新KeyWindow索赏。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盼玄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子潜腻,更是在濱河造成了極大的恐慌埃儿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砾赔,死亡現(xiàn)場離奇詭異蝌箍,居然都是意外死亡,警方通過查閱死者的電腦和手機暴心,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門妓盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人专普,你說我怎么就攤上這事悯衬。” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵筋粗,是天一觀的道長策橘。 經(jīng)常有香客問我,道長娜亿,這世上最難降的妖魔是什么丽已? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮买决,結果婚禮上沛婴,老公的妹妹穿的比我還像新娘。我一直安慰自己督赤,他們只是感情好嘁灯,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躲舌,像睡著了一般丑婿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上没卸,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天羹奉,我揣著相機與錄音,去河邊找鬼办悟。 笑死尘奏,一個胖子當著我的面吹牛滩褥,可吹牛的內(nèi)容都是我干的病蛉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瑰煎,長吁一口氣:“原來是場噩夢啊……” “哼铺然!你這毒婦竟也來了?” 一聲冷哼從身側響起酒甸,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤魄健,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后插勤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沽瘦,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年农尖,在試婚紗的時候發(fā)現(xiàn)自己被綠了析恋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盛卡,死狀恐怖助隧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滑沧,我是刑警寧澤并村,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布巍实,位于F島的核電站,受9級特大地震影響哩牍,放射性物質發(fā)生泄漏棚潦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一膝昆、第九天 我趴在偏房一處隱蔽的房頂上張望瓦盛。 院中可真熱鬧,春花似錦外潜、人聲如沸原环。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘱吗。三九已至,卻和暖如春滔驾,著一層夾襖步出監(jiān)牢的瞬間谒麦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工哆致, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绕德,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓摊阀,卻偏偏與公主長得像耻蛇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胞此,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容