- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
谷歌的 security guidelines对于 Android 应用程序开发人员具有以下内容:
WebViews do not use
addJavaScriptInterface()
with untrusted content.On Android M and above, HTML message channels can be used instead.
据我所知,“HTML 消息 channel ”指的是类似 createWebMessageChannel()
的内容, WebMessagePort
, WebMessage
, 和亲属。
但是,他们没有提供任何示例。他们所做的只是链接到 WhatWG specification ,这个比较不清楚。而且,根据对 createWebMessageChannel
的 Google 搜索,这似乎还没有被广泛使用——我的 blog post describing changes in the Android 6.0 SDK进入前 10 名的搜索结果,我只是顺便提一下。
addJavascriptInterface()
用于允许 WebView
中的 JavaScript 调用使用 WebView
的应用程序提供的 Java 代码。我们如何使用“HTML 消息 channel ”来替代它?
最佳答案
好的,我有这个工作,虽然它有点糟糕。
第 1 步:使用 loadDataWithBaseURL()
填充您的 WebView
。 loadUrl()
将不起作用,因为 bugs .您需要为 loadDataWithBaseURL()
的第一个参数使用 http
或 https
URL(或者至少不是 file
,因为错误)。稍后您将需要该 URL,因此请保留它(例如,private static final String
值)。
第 2 步:决定何时初始化从 JavaScript 到 Java 的通信。使用 addJavascriptInterface()
,这立即可用。然而,使用 WebMessagePort
并不是那么好。特别是,您不能在页面加载之前尝试初始化通信(例如,WebViewClient
上的 onPageFinished()
)。
第 3 步:在您想要初始化这些通信时,调用 WebView
上的 createWebMessageChannel()
,以创建一个 WebMessagePort[]
。该数组中的第 0 个元素是通信管道的末端,您可以对其调用 setWebMessageCallback()
以响应从 JavaScript 发送给您的消息。
第 4 步:通过将 WebMessagePort[]
中的第一个元素包装在 WebMessage
中并调用 postWebMessage()
将其传递给 JavaScript > 在 WebView
上。 postWebMessage()
将 Uri
作为第二个参数,并且此 Uri
必须派生自您在步骤 #1 中使用的相同 URL loadDataWithBaseURL()
的基本 URL。
@TargetApi(Build.VERSION_CODES.M)
private void initPort() {
final WebMessagePort[] channel=wv.createWebMessageChannel();
port=channel[0];
port.setWebMessageCallback(new WebMessagePort.WebMessageCallback() {
@Override
public void onMessage(WebMessagePort port, WebMessage message) {
postLux();
}
});
wv.postWebMessage(new WebMessage("", new WebMessagePort[]{channel[1]}),
Uri.parse(THIS_IS_STUPID));
}
(其中 wv
是 WebView
,THIS_IS_STUPID
是与 loadDataWithBaseURL()
一起使用的 URL)
第 5 步:您的 JavaScript 可以为全局 onmessage
事件分配一个函数,该函数将在调用 postWebMessage()
时调用。您在事件中获得的 ports
数组的第 0 个元素将是通信管道的 JavaScript 端,您可以将其填充到某处的变量中。如果需要,如果 Java 代码将使用 WebMessagePort
发送 future 数据,您可以为该端口分配一个函数给 onmessage
。
第 6 步:当您想从 JavaScript 向 Java 发送消息时,在第 5 步的端口上调用 postMessage()
,该消息将被传送到您注册的回调在步骤 #3 中使用 setWebMessageCallback()
。
var port;
function pull() {
port.postMessage("ping");
}
onmessage = function (e) {
port = e.ports[0];
port.onmessage = function (f) {
parse(f.data);
}
}
This sample app演示了该技术。它有一个 WebView
,可显示基于环境光传感器的当前光照水平。该传感器数据以推送方式(当传感器发生变化)或以拉取方式(用户点击网页上的“Light Level”标签)输入到 WebView
中。此应用在 Android 6.0+ 设备上为这些应用使用 WebMessagePort
,但推送选项已被注释掉,因此您可以确认拉取方法正在通过端口工作。我将在即将出版的 my book 中更详细地介绍示例应用程序.
关于android - 如何使用 WebMessagePort 作为 addJavascriptInterface() 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41753104/
是否可以将js中的任意函数对象传递给java端,让java调用那个js对象? (回调) 例如,(access是已经注册调用Java函数的函数) access(function(blabla){
我知道要从 Javascript 与 Java 交互,您必须使用 webview 中的 addjavascriptInterface 方法注入(inject) Java 对象。 这是我面临的问题。 我
我正在尝试向当前加载的 html 添加一些新内容(在 webview 中),这不是问题所在,我可以通过 javascript 向主体添加新标签,假设这样: loadUrl("javascript:(f
我在我的应用程序中使用 addJavascriptInterface 从 Javascript 弹出一个共享窗口。 问题是:当我在开发环境中使用我的手机时,我可以看到弹出窗口。但同样在发布到谷歌和下载
我需要从 Web 响应中调用我的 java 函数: 这是我的代码,请指出我哪里出错了 Activity : @InjectView(R.id.loadCardWebView) android.
AndroidStudio 开始向我显示警告“不应调用 WebView.addJavascriptInterface”。但是这种方法存在并且没有被弃用。它出什么问题了?可能是我遗漏了什么,现在有更好的
我试图跟踪代码以查看 WebView 上的 addJavascriptInterface() 是如何实现的,但它深入到 native 代码中,这基本上削弱了我理解正在发生的事情的能力。 具体来说,我正
当在 html 页面中单击表格行时,我试图从我的 Web View 中获得回调。我的 Activity 如下: public class LocalizationTestActivity exten
我使用以下代码在 Android 中的 JavaScript 文件中提取字符串变量: 这是我的 JavaScript 文件: //EDIT: clsVariable = "vikrant"; fun
我想使用 phonegap cordova 在 android 中构建 native 应用程序。我找到了 2 种方法让我的 html 文件可以与我的 java 文件通信。我可以使用 appView.a
我们已经构建了 PhoneGap 插件来从我们的 Javascript 代码返回到我们的 Java 代码。我知道 Android 也有一个 addJavascriptInterface 函数。此处的文
我正在尝试将 javascript 接口(interface)添加到我找到的 WebView。我遵循了所有标准教程,但仍然在为这项任务而苦苦挣扎。添加 javascript 接口(interface)
addJavascriptInterface让我们将 java 对象注入(inject)到 Android web View 的 javascript 中。关于每个 javascript 类型可以在该
我正在使用 jQuery Mobile 和 PhoneGap 开发 Android 应用程序。这是我的 Activity : public class xxx extends DroidGap {
谷歌的 security guidelines对于 Android 应用程序开发人员具有以下内容: WebViews do not use addJavaScriptInterface() with
您可能知道,Android 的 WebView 有一个名为 addJavascriptInterface() 的方法,它可以将 Android JAVA 对象导入 Javascript 上下文。 问题
我可以从我的 phonegap java 脚本函数和 android 2.2 中使用 java 函数但相同的代码未在 API 17 上运行。我应该怎么做才能从 API 17 中的 java 脚本调用
我正在使用 MonoDroid,并希望可以从我的 WebView 调用 C# 代码。 我正在这样做(C#): protected override void OnCreate(Bundle bundl
我可以通过 WebView.addJavascriptInterface 接口(interface)接收一个 Object 吗?像这样的东西: public class JavaScriptInter
单击 HTML 按钮时,我无法在 Cordova webview 中打开链接。它显示“CordovaWebView 类型未定义方法 addJavascriptInterface(WebViewActi
我是一名优秀的程序员,十分优秀!