From 09312e0aa1c2b799ffb3d48b8c9d03723c5a4b76 Mon Sep 17 00:00:00 2001 From: leijie Date: Fri, 28 Jul 2023 12:34:17 +0800 Subject: [PATCH] =?UTF-8?q?[fix&update]:[=E8=A7=A3=E5=86=B3CustomWebview?= =?UTF-8?q?=E5=9C=A8demo=E4=B8=8A=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E4=BA=9B=E9=97=AE=E9=A2=98=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=AD=A5BridgeWebview=E5=9C=A8js=E8=B0=83=E7=94=A8java?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E3=80=81=E5=9B=9E=E8=B0=83=E4=B8=8A=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsbridge/example/CustomWebView.java | 23 +++++++++++ .../example/MainJavascriptInterface.java | 8 ++-- .../main/assets/WebViewJavascriptBridge.js | 1 + .../github/lzyzsd/jsbridge/BridgeHelper.java | 41 +++++++++++++++---- .../github/lzyzsd/jsbridge/BridgeWebView.java | 6 ++- .../com/github/lzyzsd/jsbridge/IWebView.java | 6 +++ .../jsbridge/WebViewJavascriptBridge.java | 7 ++++ 7 files changed, 81 insertions(+), 11 deletions(-) diff --git a/example/src/main/java/com/github/lzyzsd/jsbridge/example/CustomWebView.java b/example/src/main/java/com/github/lzyzsd/jsbridge/example/CustomWebView.java index 2b8d372..a321987 100644 --- a/example/src/main/java/com/github/lzyzsd/jsbridge/example/CustomWebView.java +++ b/example/src/main/java/com/github/lzyzsd/jsbridge/example/CustomWebView.java @@ -12,6 +12,9 @@ import com.github.lzyzsd.jsbridge.IWebView; import com.github.lzyzsd.jsbridge.OnBridgeCallback; import com.github.lzyzsd.jsbridge.WebViewJavascriptBridge; +import com.google.gson.Gson; + +import java.util.Map; /** * 采用BridgeHelper集成JsBridge功能示例.定制WebView,可只添加实际需要的JsBridge接口. @@ -24,6 +27,8 @@ public class CustomWebView extends WebView implements WebViewJavascriptBridge, I private BridgeHelper bridgeHelper; + private Gson mGson; + public CustomWebView(Context context, AttributeSet attrs) { super(context, attrs); init(); @@ -115,4 +120,22 @@ public void sendToWeb(String data, OnBridgeCallback responseCallback) { public void sendToWeb(String function, Object... values) { bridgeHelper.sendToWeb(function, values); } + + @Override + public void responseFromWeb(String data, String callbackId) { + bridgeHelper.responseFromWeb(data,callbackId); + } + + public void setGson(Gson gson){ + this.mGson = gson; + } + + public Map getCallbacks() { + return bridgeHelper.getCallbacks(); + } + + @Override + public WebView getWebView() { + return this; + } } diff --git a/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainJavascriptInterface.java b/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainJavascriptInterface.java index 6e963f5..a32c2c3 100644 --- a/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainJavascriptInterface.java +++ b/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainJavascriptInterface.java @@ -5,6 +5,7 @@ import com.github.lzyzsd.jsbridge.BridgeWebView; import com.github.lzyzsd.jsbridge.OnBridgeCallback; +import com.github.lzyzsd.jsbridge.WebViewJavascriptBridge; import java.util.Map; @@ -15,9 +16,10 @@ */ public class MainJavascriptInterface extends BridgeWebView.BaseJavascriptInterface { - private BridgeWebView mWebView; + //WebJSbridge + private WebViewJavascriptBridge mWebView; - public MainJavascriptInterface(Map callbacks, BridgeWebView webView) { + public MainJavascriptInterface(Map callbacks, WebViewJavascriptBridge webView) { super(callbacks); mWebView = webView; } @@ -35,6 +37,6 @@ public String send(String data) { @JavascriptInterface public void submitFromWeb(String data, String callbackId) { Log.d("MainJavascriptInterface", data + ", callbackId: " + callbackId + " " + Thread.currentThread().getName()); - mWebView.sendResponse("submitFromWeb response", callbackId); + mWebView.responseFromWeb("submitFromWeb response", callbackId); } } diff --git a/library/src/main/assets/WebViewJavascriptBridge.js b/library/src/main/assets/WebViewJavascriptBridge.js index 0da82f4..6f93f09 100644 --- a/library/src/main/assets/WebViewJavascriptBridge.js +++ b/library/src/main/assets/WebViewJavascriptBridge.js @@ -181,6 +181,7 @@ WebViewJavascriptBridge.registerHandler = registerHandler; WebViewJavascriptBridge.callHandler = callHandler; WebViewJavascriptBridge._handleMessageFromNative = _handleMessageFromNative; + WebViewJavascriptBridge._fetchQueue = _fetchQueue; var readyEvent = document.createEvent('Events'); var jobs = window.WVJBCallbacks || []; diff --git a/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeHelper.java b/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeHelper.java index 78257f7..4fc7154 100644 --- a/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeHelper.java +++ b/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeHelper.java @@ -5,9 +5,12 @@ import android.text.TextUtils; import android.util.Log; +import com.google.gson.Gson; + +import org.json.JSONObject; + import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -113,12 +116,8 @@ private void queueMessage(Message m) { private void dispatchMessage(Message m) { String messageJson = m.toJson(); //escape special characters for json string 为json字符串转义特殊字符 - messageJson = messageJson.replaceAll("(\\\\)([^utrn])", "\\\\\\\\$1$2"); - messageJson = messageJson.replaceAll("(?<=[^\\\\])(\")", "\\\\\""); - messageJson = messageJson.replaceAll("(?<=[^\\\\])(\')", "\\\\\'"); - messageJson = messageJson.replaceAll("%7B", URLEncoder.encode("%7B")); - messageJson = messageJson.replaceAll("%7D", URLEncoder.encode("%7D")); - messageJson = messageJson.replaceAll("%22", URLEncoder.encode("%22")); + //系统原生API做Json转义替换手动转义,解决js解析数据格式报错 + messageJson = JSONObject.quote(messageJson); String javascriptCommand = String.format(BridgeUtil.JS_HANDLE_MESSAGE_FROM_JAVA, messageJson); // 必须要找主线程才会将数据传递出去 --- 划重点 if (Thread.currentThread() == Looper.getMainLooper().getThread()) { @@ -294,4 +293,32 @@ public void sendToWeb(String function, Object... values) { loadUrl(jsCommand); } } + + public void sendResponse(Object data, String callbackId) { + if (!TextUtils.isEmpty(callbackId)) { + final Message response = new Message(); + response.responseId = callbackId; + response.responseData = data instanceof String ? (String) data : new Gson().toJson(data); + if (Thread.currentThread() == Looper.getMainLooper().getThread()){ + dispatchMessage(response); + }else { + webView.getWebView().post(new Runnable() { + @Override + public void run() { + dispatchMessage(response); + } + }); + } + } + } + + @Override + public void responseFromWeb(String data, String callbackId) { + sendResponse(data,callbackId); + } + + public Map getCallbacks() { + return responseCallbacks; + } + } diff --git a/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java b/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java index f478516..cfbdfee 100644 --- a/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java +++ b/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java @@ -140,6 +140,11 @@ public void sendToWeb(String function, Object... values) { } } + @Override + public void responseFromWeb(String data, String callbackId) { + sendResponse(data,callbackId); + } + /** * 保存message到消息队列 * @@ -222,7 +227,6 @@ public void run() { } }); } - } } diff --git a/library/src/main/java/com/github/lzyzsd/jsbridge/IWebView.java b/library/src/main/java/com/github/lzyzsd/jsbridge/IWebView.java index 8de9867..d0fff48 100644 --- a/library/src/main/java/com/github/lzyzsd/jsbridge/IWebView.java +++ b/library/src/main/java/com/github/lzyzsd/jsbridge/IWebView.java @@ -1,6 +1,7 @@ package com.github.lzyzsd.jsbridge; import android.content.Context; +import android.webkit.WebView; /** * WebView功能接口. @@ -13,4 +14,9 @@ public interface IWebView { Context getContext(); void loadUrl(String url); + + /** + * 获取当前Webview + */ + WebView getWebView(); } diff --git a/library/src/main/java/com/github/lzyzsd/jsbridge/WebViewJavascriptBridge.java b/library/src/main/java/com/github/lzyzsd/jsbridge/WebViewJavascriptBridge.java index cd690ec..1e15370 100644 --- a/library/src/main/java/com/github/lzyzsd/jsbridge/WebViewJavascriptBridge.java +++ b/library/src/main/java/com/github/lzyzsd/jsbridge/WebViewJavascriptBridge.java @@ -9,4 +9,11 @@ public interface WebViewJavascriptBridge { void sendToWeb(String function, Object... values); + /** + * 处理从js返回的数据 + * @param data 数据 + * @param callbackId jsCallbackId + */ + void responseFromWeb(String data,String callbackId); + }