从自助服务终端 PWA 连接扩展程序

在 Chrome 102 发布后,Chrome 应用将在 Windows、Linux 和 macOS 上被弃用。对于 ChromeOS,我们将至少支持 Chrome 应用到 2025 年 1 月,但我们强烈建议您迁移到 Web 应用,因为 Chrome 应用计划被弃用。以前,Chrome 应用在自助服务终端模式下可使用额外的功能,而这些功能目前仅由 Web 应用支持。您可以通过在信息亭 Web 应用中部署配套扩展程序来继续使用部分此类功能。

扩展程序是如何部署的?

扩展程序通过 Chrome 管理控制台中的自助服务终端配置界面(可通过 Devices > Chrome > Apps & Extensions > Kiosks 找到)进行部署。扩展程序可以自行托管在公开可访问的链接中,也可以托管在 Chrome 应用商店中。如需详细了解如何在企业或教育环境中管理扩展程序,请参阅本文档

如何从 Web 应用中调用扩展 API?

由于您可以随信息亭 Web 应用一起部署配套扩展程序,因此可以通过调用扩展程序 API 来利用扩展程序功能,例如获取有关设备和硬件平台的实用信息或管理 Chrome 辅助功能。

如果您要使用仅限信息亭模式的 API,则需要在清单中启用这些 API。然后,在自助服务终端 Web 应用和配套扩展程序之间实现消息传递,以便它们可以相互通信。

启用仅限自助服务终端的扩展 API

有些扩展程序 API 仅在自助服务终端模式下可用。为了让扩展程序能够调用这些仅限信息亭模式的 API,您需要在清单中添加 "kiosk_enabled" 字段,并将其设置为 true

{
    "manifest_version": 3,
    "version": "1.0",
    ...
    "kiosk_enabled": true
 }

实现消息传递

扩展服务设置

如需接收和响应来自 Web 应用的消息,您需要公开一个后台脚本,该脚本会监听来自客户端(您的 Web 应用)的消息,然后将这些请求代理到相应的 API 调用。在以下示例中,当 Web 应用发送包含 methodNamecallRestart 的自定义消息对象时,系统会代理请求以重启 ChromeOS 设备。

// message handler - extension code
chrome.runtime.onMessageExternal.addListener(function (request, sender, sendResponse) {
  if (request.methodName == 'callRestart') {
    chrome.runtime.restart();
  }
});

扩展程序的清单可以配置为允许通过 externally_connectable 键对扩展程序进行外部函数调用,该键用于指定哪些网站和扩展程序可以调用扩展程序中的方法。如需详细了解 Chrome 扩展程序和清单 v3,请参阅官方文档

{
    "background": {
       "service_worker": "background.js"
    },
    "description": "This restarts your ChromeOS device. Lucky you!",
    "manifest_version": 3,
    "name": "Restart your kiosk app",
    "version": "1.0",
    "kiosk_enabled": true,
    "externally_connectable": {
         "accepts_tls_channel_id": false,
         "matches": [ "://developer.android.com/" ]
      }
 }

Web 应用设置

如需从 Web 应用调用扩展程序,您需要知道其静态扩展程序 ID。此 ID 可在您安装 Chrome 扩展程序时显示的 chrome://extensions 页面上找到,也可在扩展程序上传后从 Chrome 应用商店中找到。这样,您的 Web 应用就可以指定要与之通信的确切扩展程序。之后,调用 chrome.runtime.sendMessage 并传入扩展程序 ID 以及您希望发送给扩展程序的消息。

const STATIC_EXTENSION_ID = 'abcdefghijklmnopqrstuvwxyz'; // found from chrome extensions page of chrome web store.
const callExtensionAPI = function (method) {
  chrome.runtime.sendMessage(STATIC_EXTENSION_ID, {
    methodName: method,
  });
};
callExtensionAPI('callRestart');

如需详细了解如何将网页连接到扩展程序以进行消息传递,请参阅此文档

注意:扩展程序和 Web 应用无法随意相互通信。扩展程序只会尝试监听其清单的 externally_connectable 部分中列出的网域的消息。同样,Web 应用必须知道它希望与之通信的扩展程序的静态 ID。