1ilI / WebViewJavascriptBridge_harmony

5 stars 1 forks source link

WebViewJavascriptBridgeReady的问题 #2

Open zhangxu0321 opened 4 weeks ago

zhangxu0321 commented 4 weeks ago

用这个库https://bridge_loaded这个请求做伪响应的话是可以建立桥的,还有一种安卓处理的方法,不去请求https://bridge_loaded,而是对WebViewJavascriptBridgeReady做监听,大佬知道如何去在鸿蒙里处理嘛? export function androidSetWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBridge) { console.log('有WebViewJavascriptBridge对象') return callback(WebViewJavascriptBridge) } else { console.log('没有WebViewJavascriptBridge对象,等待WebViewJavascriptBridgeReady事件回调') document.addEventListener( 'WebViewJavascriptBridgeReady' , function(){ console.log('WebViewJavascriptBridgeReady事件回调了') callback(WebViewJavascriptBridge) }, false ); } }

1ilI commented 3 weeks ago

原始的 WebViewJavascriptBridge 库是没有【WebViewJavascriptBridgeReady】这个方法的

可能前端会在JS中写这些方法,可以叫 WebViewJavascriptBridgeReady 也可以叫别的等等,类似于下面这些: function setupWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); } else { document.addEventListener( "WebViewJavascriptBridgeReady", function () { return callback(WebViewJavascriptBridge); }, false ); } if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); } window.WVJBCallbacks = [callback]; var WVJBIframe = document.createElement("iframe"); WVJBIframe.style.display = "none"; WVJBIframe.src = "https://__bridge_loaded__"; document.documentElement.appendChild(WVJBIframe); setTimeout(function () { document.documentElement.removeChild(WVJBIframe); }, 0); }

在客户端这边(iOS/Android/鸿蒙)应该是不需要关心【WebViewJavascriptBridgeReady】这个方法的,不知道你是想说处理什么

zhangxu0321 commented 3 weeks ago

您的这种JS处理办法是没问题的,因为我们的鸿蒙项目接入的h5有很多版本的bridgeJS,有两种在JS端的接入bridge的方式 一种是不论有没有window.WebViewJavascriptBridge, 都会走到下面去做https://bridge_loaded的请求(就是您写的这种) 还有一种是区分了Android和IOS,在android设备的情况下设置去监听WebViewJavascriptBridgeReady,在ios的设备中走https://bridge_loaded的请求 在WebViewJavascriptBridge_JS这个文件里没有发现对WebViewJavascriptBridgeReady处理 我找到安卓的同样注入需要的JS文件里发现最后是对WebViewJavascriptBridgeReady事件进行了处理 企业微信20240823-170303 右侧是我找到在安卓种注入的JS文件对WebViewJavascriptBridgeReady处理的地方 我想了解下如何在对WebViewJavascriptBridgeReady做响应? 感谢大佬

1ilI commented 3 weeks ago

按我个人理解,原 WebViewJavascriptBridge 这个库因为某些原因在 Android 上不太适用,所以另有大佬开发了 JsBridge ,主要是为了方便 JS 的,可以在 Android 和 iOS 之间定义&调用相同的方法名,这两个库都会注入一个同名的【WebViewJavascriptBridge】对象到window 对象中。 安卓的(JsBridge)在注入的 JS文件 中,有个逻辑,创建完成的时候会发送事件 WebViewJavascriptBridgeReady 的 JS 方法,是为了方便 JS 去判断安卓上的这个桥接有没有建立好,建立好之后才去做剩下的事情。 而 iOS 的(WebViewJavascriptBridge)是没有也不需要这个方法的。

本库 WebViewJavascriptBridge_harmony 的处理逻辑和 WebViewJavascriptBridge 相同 ,也是不需要 WebViewJavascriptBridgeReady 方法的。

至于你那边的 JS 只通过 WebViewJavascriptBridgeReady 方法去判断桥接建立,在纯安卓的项目上是好的,但在用了本库的鸿蒙上,可能略有不妥,建议还是 JS 侧去处理一下。 或者再有大佬按照 JsBridge 的思路在鸿蒙上也实现一遍,然后你就可以用那个库了🌚