【问题标题】:Native messaging with web content using GeckoView Android使用 GeckoView Android 与 Web 内容进行本机消息传递
【发布时间】:2020-07-23 07:23:50
【问题描述】:

我正在尝试创建一个仅使用 GeckoView 作为 webview 的混合应用程序。我正在关注this 链接以在本机和 HTML/Javascript 之间建立通信。我正在使用基于连接的消息传递。到目前为止,我能够接收来自本机的消息并将消息从后台脚本发送回本机。但我无法做到以下几点:

  1. 显示来自后台脚本的消息:我试图在后台脚本中显示自定义事件的值,但它不起作用。代码如下:

     function eventHandler(element){
     element.dispatchEvent(event);
     element.addEventListener('build', function (e) {
         console.log("Inside event listener");
         element.innerHTML="change";
         let text = document.getElementById("text").innerText;
         console.log("Main js executed :::::"+ text);
     }, false);
    

    }

  2. 我已尝试从内容脚本发送消息,但它也无法正常工作,因为我正在获取未定义的浏览器。

    browser.runtime.onMessage.addListener(
        function (request, sender){
            console.log("Message received");
        });
    

我尝试使用 chrome 而不是浏览器,但结果相同。 我正在使用 78.0.20200601093812 版本的 GeckoView。我的仅后台脚本清单如下:

{


"manifest_version": 2,
  "name": "messaging",
  "version": "1.0",
  "description": "Example messaging web extension.",
  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';",
  "browser_specific_settings": {
    "gecko": {
      "id": "message@example.com"
    }

  },
"content_scripts": [
    {
      "matches": ["resource://android/assets/www/messaging/main.html"],
      "js": ["messaging.js"]
    }
  ],

  "background": {
    "scripts": ["jquery-3.3.1.min.js","background.js", "main.js"],
    "page": "main.html",
    "persistent": true
  },
  "permissions": [
    "nativeMessaging",
    "geckoViewAddons",
    "nativeMessagingFromContent",
  ]
}

【问题讨论】:

    标签: android browser geckoview


    【解决方案1】:

    如果 HTML 代码是您的扩展程序的一部分,您可以使用 extension pages。扩展页面可以完全访问 WebExtension API。您需要做的就是使用web-extension://[UUID] 路径加载页面,这样应该可以工作

    session.loadUri(extension.metaData.baseUrl + "/main.html");
    

    其中main.html 是扩展文件夹中的HTML 文件,extension 是您从installBuiltIn 返回的扩展对象。

    然后在main.html添加这样的脚本

    <script src=main.js></script>
    

    main.js 中,您可以使用与guide 中相同的代码连接到应用程序:

    // Establish connection with app
    let port = browser.runtime.connectNative("browser");
    port.onMessage.addListener(response => {
        // Let's just echo the message back
        port.postMessage(`Received: ${JSON.stringify(response)}`);
    });
    port.postMessage("Hello from WebExtension!");
    

    【讨论】:

    • 感谢您的回复。我已经编辑了我的清单文件,请检查。我也尝试使用此清单将接收到的数据从后台脚本发送到内容脚本,但未定义浏览器错误。
    • 我知道main.html 是一个包含您想向用户展示的内容的页面吗?在这种情况下,您不需要使用内容脚本(作为main.html 的一部分运行的脚本将可以访问扩展 API)。您想要执行此操作的方式是从moz-extension:// 路径加载页面,您可以使用extension.metaData.baseUrl 在java 端获取基本URI,然后附加/main.html。像 session.loadUri(extension.metaData.baseUrl + "/main.html"); 这样加载页面的东西应该给它完全的扩展权限。
    • 我遵循了您的解决方案,现在我没有收到浏览器错误,但我收到了两个错误。 1. [JavaScript 错误:“内容安全策略:页面设置阻止了内联资源(“script-src”)的加载。”和 2. [JavaScript 错误:“未捕获的异常:未找到本机应用程序或此 WebExtension 没有权限。”]。
    • 你在使用内联 ,然后将您的 javascript 代码放入 script.js 文件中(与 html 位于同一文件夹中)。跨度>
    • 我只关注外部 javascript 文件
    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多