小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

解決android開發(fā)中webview加載https出現(xiàn)空白頁問題的方法

 湖唐 2018-04-14
  由于公司項(xiàng)目換成的https接口,其他數(shù)據(jù)都能加載正常,而webview加載https頁面出現(xiàn)空白頁,查看logcat: 
This request has been blocked; the content must be served over HTTPS

    當(dāng)load有ssl層的https頁面時(shí),如果這個(gè)網(wǎng)站的安全證書在Android無法得到認(rèn)證,WebView就會(huì)變成一個(gè)空白頁,而并不會(huì)像PC瀏覽器中那樣跳出一個(gè)風(fēng)險(xiǎn)提示框。因此,我們必須針對(duì)這種情況進(jìn)行處理。(這個(gè)證書限于2.1版本以上的Android 系統(tǒng)才可以)
解決android開發(fā)中webview加載https出現(xiàn)空白頁問題的方法:
 webView.setWebViewClient(new WebViewClient(){
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
       //注意:super句話一定要?jiǎng)h除,或者注釋掉,否則又走h(yuǎn)andler.cancel()默認(rèn)的不支持https的了。
       //super.onReceivedSslError(view, handler, error);
       //handler.cancel(); // Android默認(rèn)的處理方式
       //handler.handleMessage(Message msg); // 進(jìn)行其他處理
        handler.proceed(); // 接受所有網(wǎng)站的證書
            }
        });
但是在6.0的手機(jī)上依然是顯示空白頁, 很簡單,只需設(shè)置webSettings,允許其加載混合網(wǎng)絡(luò)協(xié)議內(nèi)容即可。
解決辦法:添加如下代碼
/**
 *  Webview在安卓5.0之前默認(rèn)允許其加載混合網(wǎng)絡(luò)協(xié)議內(nèi)容
 *  在安卓5.0之后,默認(rèn)不允許加載http與https混合內(nèi)容,需要設(shè)置webview允許其加載混合網(wǎng)絡(luò)協(xié)議內(nèi)容
 */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {   
                   webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

另外一種說明文檔,轉(zhuǎn)載如下:

1.Android 加載https請(qǐng)求的網(wǎng)頁的時(shí)候 打不開
     當(dāng)load有ssl層的https頁面時(shí),如果這個(gè)網(wǎng)站的安全證書在Android無法得到認(rèn)證,WebView就會(huì)變成一個(gè)空白頁,而并不會(huì)像PC瀏覽器中那樣跳出一個(gè)風(fēng)險(xiǎn)提示框。因此,我們必須針對(duì)這種情況進(jìn)行處理。(這個(gè)證書限于2.1版本以上的Android 系統(tǒng)才可以)
    
wv.setWebViewClient(new WebViewClient(){

@override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){

//handler.cancel(); 默認(rèn)的處理方式,WebView變成空白頁
  handler.process();接受證書

//handleMessage(Message msg); 其他處理
}

// 這行代碼一定加上否則效果不會(huì)出現(xiàn) 
webView.getSettings().setJavaScriptEnabled(true); 

查看Android瀏覽器源碼在TabControl.Java類中SubWindowClient方法中找,如果只是簡單的接受所有證書的話,就直接調(diào)process()方法就行了
寫到這里之后,直接運(yùn)行是頁面是可以打開的。但是打好簽名包之后,依舊打不開?。。?br> 一路追蹤之后,發(fā)現(xiàn)是那個(gè)方法被混淆了
proguard:mapping.txt
xx.xx.xxx
    xx.xx.xxx this$0 -> a
    void onReceivedSslError(android.webkit.WebView,android.webkit.SslErrorHandler,android.net.http.SslError) -> onReceivedSslError

所以還要必要在混淆文件proguard.cfg中,加入以下:
-keep public class android.net.http.SslError

-dontwarn android.webkit.WebView
-dontwarn android.net.http.SslError
-dontwarn Android.webkit.WebViewClient

還有一點(diǎn)要提到的是,如果手機(jī)添加了代理。也是打不開的

但是sslerror是從2.2才開始提供的。之前的版本怎么辦?
可以把a(bǔ)ndroid2.2中onReceivedSslError()的源碼導(dǎo)入到自己的工程中,具體方法如下:
先把a(bǔ)ndroid2.2包中的SslError.java和WebViewClient.java導(dǎo)入到自己的工程中,在導(dǎo)入時(shí)需要建立和android2.2源碼包中一樣的包名。然后在用webview的時(shí)候?qū)О蛯?dǎo)自己工程里的這個(gè)包名就行!
注意一下 webView 要設(shè)置的幾個(gè)地方興許能幫上忙:
1 . 默認(rèn)情況下,不能訪問 https,需要重寫 WebViewClient 的 onReceivedSslError
ps: API Level > 2.1,或者提供 SslError.java 和 WebViewClient.java 文件
重寫部分一般可以不做特殊處理,直接 handler.process(); 接受證書即可

2 . 默認(rèn)情況下,不能彈 js 框,需要重寫 WebChromeClient 的 onJsAlert
重寫部分也不需要特殊處理,直接返回 super.onJsAlert(view, url, message, result);

pps: 要 setWebViewClient 和 setWebChromeClient,webView 才能生效


2.Android 用webview加載網(wǎng)頁 可能會(huì)出現(xiàn)另外一種情況:
     webview加載的網(wǎng)頁是http請(qǐng)求的 ,如果網(wǎng)頁里有一張圖片,并且該圖片的地址是https請(qǐng)求的,這時(shí)候用webview加載網(wǎng)頁,圖片是不顯示的。
    會(huì)報(bào)這種錯(cuò)
     
Mixed Content as loaded over HTTPS, but requested an insecure image
意思是  http請(qǐng)求和https請(qǐng)求混淆了
注意: 用webview加載網(wǎng)頁,一定用同一種請(qǐng)求
   

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多