以后每用Runtime解決一個(gè)問(wèn)題,就會(huì)記錄在這個(gè)文集里。
我將以真實(shí)的使用場(chǎng)景為大家講述Runtime的各種用法,讓Runtime真正的投入到生產(chǎn)中。
合輯demo Github地址
Update!!!
updateInputModeIndicatorOnSingleKeyOnly:preserveIfPossible:
為敏感型私有方法,會(huì)被蘋(píng)果檢測(cè)出來(lái)。需要做一下base64Encoded。
bug描述
當(dāng)某個(gè)頁(yè)面使用了黑色ASCII鍵盤(pán)時(shí),推到后臺(tái),打開(kāi)白色中文鍵盤(pán)(比如瀏覽器),再進(jìn)入app。彈出該鍵盤(pán),會(huì)觸發(fā)中英切換,空格位置會(huì)出現(xiàn)不正常的動(dòng)畫(huà),表現(xiàn)為English(US)背景為白色。

解決方法
就是個(gè)系統(tǒng)的bug,iOS9上面沒(méi)事。沒(méi)找到常規(guī)的解決辦法,只有非常規(guī)的方法。
解決思路就是直接干掉鍵盤(pán)切換輸入語(yǔ)言時(shí)產(chǎn)生的這個(gè)動(dòng)畫(huà)。
代碼如下
void wel_AscII_fake (id self, SEL _cmd, BOOL arg1, BOOL arg2) {
}
__attribute__((constructor)) static void iosFixKeyboardBug(void) {
Method m = class_getInstanceMethod(NSClassFromString(@"UIKeyboardImpl"), @selector(updateInputModeIndicatorOnSingleKeyOnly:preserveIfPossible:));
method_setImplementation(m, (IMP)wel_AscII_fake);
}
把這兩個(gè)函數(shù)拖進(jìn)去就可以,無(wú)需顯式調(diào)用。
解決思路
之前一直對(duì)鍵盤(pán)有一種敬畏之心,后來(lái)看了@霖溦的精彩評(píng)論(全網(wǎng)首發(fā) iOS自定義statusbar上icon的顏色),知道鍵盤(pán)其實(shí)就是個(gè)view,于是思路就有了。
先找到鍵盤(pán)這個(gè)window,我是通過(guò)斷點(diǎn)setWindowLevel:找到的,然后一層一層推測(cè)堆棧,最后就可以發(fā)現(xiàn),一個(gè)UIKeyboardImpl類型的實(shí)例,調(diào)用了updateInputModeIndicatorOnSingleKeyOnly:preserveIfPossible:方法來(lái)做這個(gè)動(dòng)畫(huà),在X86_64下看實(shí)現(xiàn),發(fā)現(xiàn)也確實(shí)只干了這一件事。
最后,我就直接把這個(gè)沒(méi)卵用的動(dòng)畫(huà)給干掉了。