如果我正确理解您的问题,您需要在页面的 javascript 和 Safari 应用程序扩展的本机主机应用程序之间进行通信。主机应用程序只能使用 API safari.extension.dispatchMessage进行联系,该 API只能从注入的script.js脚本访问,而不能从页面的 JS 访问。
您可以通过从页面发送请求事件并注册响应事件来解决此问题。您的 HTML 页面将包含脚本:
function sendEventToInjected() {
var storeEvent = new CustomEvent('myCustomEvent', {"detail": "testData"});
document.dispatchEvent(storeEvent);
var responseEventID = 'myResponseEvent';
document.addEventListener(responseEventID, function respListener(event)
{
console.log("Got data from injected script: " + event.detail);
document.removeEventListener(responseEventID, respListener);
});
}
您的script.js将通过注册事件侦听器来捕获此事件,然后可以将数据传递到扩展程序的本机主机应用程序。获得本地主机的响应后,可以将响应事件分派回页面。
document.addEventListener("myCustomEvent", function(event) {
console.log("myCustomEvent:" + event.detail);
safari.extension.dispatchMessage(event.detail);
});
// Listens for messages sent from the app extension's Swift code.
safari.self.addEventListener("message", messageHandler);
function messageHandler(event)
{
var resp = {detail: "respData"};
var respEvent = new CustomEvent('myResponseEvent', resp);
document.dispatchEvent(respEvent);
}