NSExtensionRequestHandling 不处理本机消息

mik*_*098 5 javascript safari-extension safariservices safari-web-extension

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

manifest.json我添加了这样nativeMessaging的权限:

"permissions": [ "nativeMessaging" ]
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

Byr*_*ron 5

由于可能有多种原因导致此问题,因此我会尝试以下方法来帮助调试问题。

  • 确保您已在功能中设置了应用程序组,并将扩展程序和应用程序设置为 Xcode 中的同一应用程序组。

  • 检查 Safari 菜单中的“开发人员”->“允许未签名扩展”是否已启用。(如果您没有看到“开发人员”,您需要在“首选项”->“高级”中启用它。

  • 确保您在manifest.json 示例中拥有正确的权限:

 "permissions": [ "nativeMessaging", "<all_urls>" ] 
Run Code Online (Sandbox Code Playgroud)

我认为您不能sendNativeMessagepopup.js或拨打电话content.js。我相信你只能从 调用它background.js。所以你必须调用 popup.js -> background.js -> sendNativeMessage。

如果您查看 Safari 开发菜单、检查器,您可能会看到类似“未定义不是函数 ( sendNativeMessage)”的内容。当未调用background.js或其他权限问题时,会发生这种情况。

Safari 扩展本机消息传递流程

  • 另外,查看您的 Console.app -> 错误和故障(按包 ID 过滤),看看是否存在任何类型的权限问题。

beginRequest您无法通过查看 Xcode 日志或在此函数中设置断点来“查看”是否被调用。当它在自己的进程中运行时,它永远不会遇到断点或打印到 Xcode 日志。您的调试器附加到您的应用程序,而不是扩展进程。

为了在 上使用调试器SafariWebExtensionHandler,您必须将 Xcode 调试器附加到正在运行的 Safari 扩展进程以命中断点。Xcode -> Debug -> attach to process

此外,如果您使用 Xcode 中的默认模板,它会os_log再次调用该模板,并记录到 Console.app 而不是 Xcode(扩展在其自己的进程中运行)。

我强烈建议任何有本机消息传递问题或想要更全面解释的人至少观看本次会议的最后 5 分钟以获取更多信息:WWDC 2020:认识 Safari Web 扩展

Apple 的文档也非常有帮助:Messaging Between the App and JavaScript in a Safari Web Extension

以及在 Safari 应用程序扩展和注入脚本之间传递消息