1.場(chǎng)景說(shuō)明:進(jìn)行芝麻認(rèn)證:通過(guò)webview打開(kāi)支付寶提供的H5远舅,傳入姓名和身份證號(hào)碼進(jìn)行認(rèn)證仅偎,認(rèn)證成功后,在回調(diào)中我們打開(kāi)了一個(gè)顯示“認(rèn)證成功”的界面榔组,并包含一個(gè)確定按鈕,點(diǎn)擊這個(gè)按鈕之后關(guān)閉整個(gè)activity
2.神坑過(guò)程:點(diǎn)擊按鈕關(guān)閉activity這個(gè)操作联逻,一般都是用android與js的交互搓扯,這個(gè)我就不多說(shuō)了。但ios那邊不知什么原因包归,提出的方案是要通過(guò)彈出alert的方式锨推,說(shuō)只能用這樣的方式(感到不解),沒(méi)辦法只能用這種方式公壤,在alert的觸發(fā)回調(diào)中處理换可,代碼如下:
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
System.out.println("onJsAlert");
//alert 回調(diào) :跳轉(zhuǎn),關(guān)閉webviewActivity
Intent intent = new Intent(WebViewActivity.this, MainContentActivity.class);
intent.putExtra("index","webview");
startActivity(intent);
finish();
return true;
}
}
3.出現(xiàn)bug:按照上面的寫(xiě)了之后出現(xiàn)了這樣的問(wèn)題厦幅,完成認(rèn)證之后沾鳄,跳轉(zhuǎn)到其它的界面后,再次進(jìn)入webview之后确憨,webview加載不出內(nèi)容了译荞,白屏一片。OK休弃,沒(méi)問(wèn)題吞歼,加載不出來(lái)無(wú)所謂啦,大不了重進(jìn)塔猾,忽悠產(chǎn)品說(shuō)篙骡,偶爾出現(xiàn)而已啦。然而啊丈甸,你重進(jìn)頁(yè)面沒(méi)有用糯俗,你會(huì)發(fā)現(xiàn)整個(gè)應(yīng)用任何用webview的地方都加載不出東西來(lái),好了睦擂,玩不下去了叶骨。
跟下去,發(fā)現(xiàn)底層有一條叫webcore(印象中是這個(gè)名字)的線程一直處于wait的狀態(tài)祈匙,再也恢復(fù)不了了,唯一拯救就是殺進(jìn)程天揖。
4.解決:首先找到了觸發(fā)原因夺欲,只要點(diǎn)擊“確認(rèn)按鈕”就出現(xiàn)了這樣的bug。
然后研究了一下onJsAlert 發(fā)現(xiàn)今膊,在回調(diào)中必須處理result才行些阅,添加之后,解決問(wèn)題斑唬。
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
result.cancel();//必須處理市埋,否則會(huì)出現(xiàn)問(wèn)題黎泣。
Intent intent = new Intent(WebViewActivity.this, MainContentActivity.class);
intent.putExtra("index","webview");
startActivity(intent);
finish();
return true;
}
}