最近在混合開發(fā)中遇到一個問題,這里將問題及解決方案記錄如下:
問題:
????? ?現(xiàn)在有這么個需求,webview中加載了一個H5界面(第三方應用提供的界面,如嵌入一個淘寶商品界面),在界面中有個按鈕,點擊時需要跳轉(zhuǎn)到第三方APP中的相關界面,假如本地未安裝則跳轉(zhuǎn)去下載(可以自行設計下載方式,如直接跳轉(zhuǎn)瀏覽器,或者自定義下載界面)。因為是第三方提供的H5界面鏈接,所以我們未知其實現(xiàn)邏輯,在接入的過程中發(fā)現(xiàn)點擊按鈕沒有任何反應,既不會跳轉(zhuǎn)去下載,也不會喚起對應的第三方APP應用。。。
解決方案:
????? ?經(jīng)一番sou sou 搜,發(fā)現(xiàn)Android的WebView自身是支持網(wǎng)頁喚起第三方App的,但是如果為WebView設置了自定義的WebViewClient,這個功能就失效了,另外我們沒有做特別處理的話,webview不會直接下載對應的apk,所以需要我們對這種場景做處理。
???????(1)首先我們在WebViewClient的shouldOverrideUrlLoading(WebView view, String url) 方法中搞事情。

???????上面代碼也很簡單,就是對自定義的scheme做攔截直接跳轉(zhuǎn)喚起第三方APP,假如本地沒有安裝則會拋如下異常
System.err: android.content.ActivityNotFoundException:?
??????????????????No Activity found to handle Intent { act=android.intent.action.VIEW ....},我們try-catch就可以了,這是標識字段isDownload仍然是初始值true,這樣就可以繼續(xù)搞事情了。
???????(2)然后我們又可以通過webview的setDownloadListener(DownloadListener listener)方法搞事情。

????? ?以上代碼通過判斷isDownload字段是否為true來跳轉(zhuǎn)瀏覽器進行下載操作。
???????那可能有人會問為什么要設置isDownload字段呢?為什么在shouldOverrideUrlLoading做設置,在setDownloadListener中做判斷管用呢?這個問題看一下如下的日志就知道了。

圖中:1 后面對應的鏈接為待喚起APP對應的url;? 2? 處是調(diào)用webview的setDownloadListener方法。
由圖我們可以看出來setDownloadListener方法在最后才會執(zhí)行,所以這就是上面問題中為什么在shouldOverrideUrlLoading做設置,在setDownloadListener中做判斷管用的原因。至于isDownload字段的作用是為了防止本地已經(jīng)安裝了待喚起的第三方APP,程序在執(zhí)行時仍會走setDownloadListener監(jiān)聽,又一次跳轉(zhuǎn)瀏覽器提醒用戶下載,通過這么控制提升用戶體驗。
總結(jié)一下,開篇說到的問題解決方案我們可以歸結(jié)兩點:
(1)在WebViewClient的shouldOverrideUrlLoading中攔截url喚起第三方APP,假如本地未安裝時try-catch異常,
(2)同時通過webview的setDownloadListener設置下載監(jiān)聽,并設置下載標識,只有鏈接是下載鏈接時才會走回調(diào),我們可以在回調(diào)中進行下載操作。