每當到618、雙11這樣大促的時候,搜索作為整個App的核心功能,不僅擔當著流量入口,還承載著用戶感知到這個產品在導購場景中的服務與體驗,所以保障搜索以便更好的助力618大賣。 ...
前言:
每當到618、雙11這樣大促的時候,搜索作為整個App的核心功能,不僅擔當著流量入口,還承載著用戶感知到這個產品在導購場景中的服務與體驗,所以保障搜索以便更好的助力618大賣。
現象:
搜狗輸入框雙擊調起鍵盤crash
監控平臺:
監控平臺檢測到大量的crash,現象都為在極短的時間間隔內鍵盤響應問題
心路歷程:
- 通過觀察現象,猜測應該是用戶通過微信或別的軟體中複製關鍵詞,然後來到京東萬商進行粘貼搜索功能。可能由於一些原因(未彈出複製許可權提示彈窗)導致搜索框沒有出現粘貼功能,此時用戶瘋狂雙擊輸入框導致的。於是開始測試市面上的App,以京東App為例,復現步驟如下:
- 測試結果如下表:
App | 是否崩潰 | 頻率 |
---|---|---|
京東 | 是 | 高 |
京東萬商 | 是 | 高 |
七鮮 | 是 | 高 |
淘寶 | 否 | |
支付寶 | 是 | 中 |
百度 | 是 | 中 |
百度地圖 | 否 | |
美團 | 否 | |
盒馬 | 否 | |
1688 | 否 | |
嗶哩嗶哩 | 否 | |
抖音 | 是 | 低 |
- 通過手機隱私拿到的崩潰日誌,分別為京me、京東、百度,表現與SGM平臺表象一樣
源碼調試:
- 通過Xcode斷點調試結果如下圖:
- UICompatibilityInputViewController過度release
- crash在
_wantsForwardingFromResponder:toNextResponder:withEvent
解決方案:
- 通過runtime對給crash方法一個預設的實現
static BOOL (*originalImpl)(id, SEL, UIResponder*, UIResponder*, UIEvent* ) = nil;
- (BOOL)_wantsForwardingFromResponder:(UIResponder *)arg1 toNextResponder:(UIResponder *)arg2 withEvent:(UIEvent *)arg3 {
NSString* responderClassName = NSStringFromClass([arg2 class]);
if ([responderClassName isEqualToString:@"_UIRemoteInputViewController"]) {
bool isDeallocating = false;
// isDeallocating = _objc_rootIsDeallocating(arg2);
// Use 'performSelector' when u are develop a App-Store App.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
SEL sel = NSSelectorFromString(@"_isDeallocating");
isDeallocating = [arg2 respondsToSelector:sel] && [arg2 performSelector:sel];
#pragma clang diagnostic pop
if (isDeallocating) {
NSLog(@"BingGo a deallocating object ...");
return true;
}
}
BOOL retVal = FALSE;
if (originalImpl == nil) {
IMP impl = [ObjcSeeker seekInstanceNextOirignalImpl:self selector:_cmd];
originalImpl = (BOOL (*)(id, SEL, UIResponder*, UIResponder*, UIEvent* ))impl;
}
if (originalImpl != nil) {
retVal = originalImpl(self, _cmd, arg1, arg2, arg3);
}
return retVal;
}
參考鏈接:
https://github.com/SnowGirls/Objc-Deallocating
作者:京東零售 塗世展
來源:京東雲開發者社區