Webview 中 Javascript 無法調用 Java 對象

来源:http://www.cnblogs.com/dcchan/archive/2016/06/30/5630383.html
-Advertisement-
Play Games

【問題產生】 Webview 通過 addjavascriptInterface 傳遞對象給前端,一切正常。但是 Android官方已提醒此功能是有安全風險,改用 safe-java-js-webview-bridge 做java和js交互。 官方的用法正常: 但如果我們在body里的<script ...


【問題產生】

Webview 通過 addjavascriptInterface 傳遞對象給前端,一切正常。但是 Android官方已提醒此功能是有安全風險,改用 safe-java-js-webview-bridge 做java和js交互。

官方的用法正常:

<ul class="entry"> 
<li onclick="HostApp.alert('HostApp.alert');">HostApp.alert</li> 
<li onclick="HostApp.toast('HostApp.toast');">HostApp.toast</li> 
</ul> 

但如果我們在body里的<script>標簽這樣寫,就無法獲取HostApp對象:

HostApp.alert('alert'); // 直接調用,無法找到HostApp

window.onload = function(){ 
    HostApp.toast('document ready now'); // onload後調用,依然無法找到HostApp
}; 
$(document).ready(
function(){ HostApp.toast('document ready now'); // ready後調用,依然無法找到HostApp });

 

【原因】

Safe Java-JS WebView Bridge 註入HostApp-JS片段的時機,可能在onload前也可能在其後。

如果document.ready的時候HostApp JS已經註入成功,在onload的時候調用沒有問題。當onload的時候HostApp JS還未開始註入,就無法找到HostApp了。

 

【解決】

官方提供方法:

在js腳本層就需要做出變動,即輪詢狀態,直到端註入成功或者超時(1.5s),再發生回調。具體實現如下(下麵的是以 zepto.js的$.ready()函數改造為例)。

//針對DOM的一些操作 
// Define methods that will be available on all 
// Zepto collections 
$.fn = { 
//DOM Ready 
    ready: function(callback, jumpHostAppInject) { 
        var originCb = callback; 
        var mcounter = 0; 
//嘗試等待(1500ms超時)讓端註入HostApp Js 
        callback = function () { 
if(!window.HostApp && mcounter++ < 150)setTimeout(callback, 10);else originCb($); 
        }; 
//是否跳過等待HostApp的註入 
if (jumpHostAppInject) { 
            callback = originCb; 
        } 
if (readyRE.test(document.readyState)) callback($); else document.addEventListener('DOMContentLoaded', function() { 
                callback($) 
            }, false); 
return this 
    }, 
    ... 
    ... 
}; 

這樣的機制也就解釋了為什麼不把Java層的JS註入放在OnPageFinish了,如果那樣頁面輪詢的次數就會上升,等待的時間就會變長,而且有可能會超時。好了,有了上面的改動,頁面初始載入完備時需要立即觸發HostApp的調用,如下:

$(function () { 
    HostApp.alert("HostApp ready now"); 
}); 

如果懶得去修改,可以到 gitHub 下載此插件提供的 zepto.js

 

由於本人項目沒有用zepto,在初始化init的時候,按官方推薦的方法做了一個輪詢。

var step = 0; // 重試次數

window.onload = function () {
    function isReady() {
        if(step < 150 && !window.HostApp) { // 重試150次
            step ++;
            setTimeout(isReady,10);
        } else {
            init();
        }
    }
    isReady();
};

 

更多使用說明及完整源代碼見:Safe Java-JS Bridge In Android WebView[Github]

 

參考:http://mobile.51cto.com/aprogram-452011.htm


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <style> .trans-fadeout{ -webkit-transition:all 1s linear; -moz-transition:al ...
  • 手機端web網頁項目 1,angluar js 1.4.6 網頁項目開發過程中,使用PC瀏覽器能正常訪問,IOS設備瀏覽器也能正常訪問,但是使用Android部分瀏覽器進行訪問的時候,鏈接偶爾不跳轉,點擊完沒有任何反應(本人使用angluar js route進行單頁面應用跳轉),此時地址欄的路徑已 ...
  • http://www.100sucai.com/tool/css3/#/css3-3D-transform ...
  • 以上內容轉自:網路愛上點擊 ...
  • 今天在學習js中的數組時,遇到的輸出一個數組中最大、最小值以及它們的下表,以下是自己的解決方法! <script type="text/javascript"> var arr = [14, 14, 53, 14, 14, 53, 67, 67]; var max = arr[0],min = ar ...
  • 一、理解web標準含義--為什麼採用web標準*****將內容與樣式分離1、web標準是一系列標準,就是一系列技術標準在使用時,是組合應用【1】、結構化內容 xhtml【2】、表現化內容 css【3】、行為化內容 JavaScript2、網頁開發的小工具--火狐瀏覽器中的firebug工具--附加組 ...
  • 說到JavaScript中的分支結構,我們就不得不提到流程式控制制這個詞,我們所有的程式都是由數據和演算法組成的。程式=數據+演算法通常我們所說的演算法都可以通過"順序","分支","迴圈"三種結構來組合完成。 在ECMA中規定了一些語句(也稱為流程式控制制語句,分支結構語句),從本質上來說,這些語句定義了ECM ...
  • 在一些網站進行上傳時,當單擊了“瀏覽”按鈕之後會彈出【選擇文件】的對話框。想要實現這一功能,用input的file控制項來實現就好啦~ 效果圖是醬嬸的: 註意!別以為這個是由一個text和一個button組合成的,其實它就是一個file控制項哦 今天工作中遇到要求:不顯示“未選擇任何文件”,搗鼓夠一個小 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...