NSExtensionRequestHandling 不处理本机消息

问题描述

我正在尝试为我的本机应用程序创建 Safari Web 扩展。我想要一个带有按钮的弹出窗口,单击该按钮将与我的本机应用程序进行通信。在我开始这部分之前,我在发送本机消息并在符合 beginRequest 协议的类的 NSExtensionRequestHandling 函数中处理它时遇到问题。我没有做太多事情,因为我依赖于 Xcode 生成代码

manifest.json 中,我添加nativeMessaging 权限:

"permissions": [ "nativeMessaging" ]

popup.js 包含事件监听器:

console.log("Hello World!",browser);

document.addEventListener('DOMContentLoaded',function() {
    var checkPageButton = document.getElementById('clickIt');
    checkPageButton.addEventListener('click',function() {
        console.log("click")
        browser.runtime.sendNativeMessage({ message: "Hello" });
    },false)
},false)

当我检查弹出元素时,我可以看到 Hello Worldclick 消息,但正如我之前提到的 - beginRequest 没有被调用。有什么遗漏吗? 我还观看了 WWDC20 的 Meet Safari Web Extensions session,但没有找到答案。

解决方法

在清单中,找到您的扩展程序的名称并将其用作 sendNativeMessage 函数的第一个参数。

如果您的分机名为 My Test Extension,调用将如下所示:

browser.runtime.sendNativeMessage('My Test Extension',{ message: "Hello" });

我发现让检查更容易的一件事是将生成的代码中的 os_log 更改为 type: .error 并使用控制台应用程序 Applications > Utilities > Console 查看日志,因为它不会打印到 xcode 控制台。