首页 > 解决方案 > 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 会议,但没有找到答案。

标签: javascriptsafari-extensionsafari-web-extensionsafariservices

解决方案


因为这可能是由几件事造成的,所以我会尝试以下方法来帮助调试问题。

  • 确保你已经在你的能力中设置了一个应用组,并将扩展和应用设置为同一个应用组。

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

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

 "permissions": [ "nativeMessaging", "<all_urls>" ] 

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

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

Safari 扩展原生消息流

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

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

为了使用调试器,SafariWebExtensionHandler您必须将调试器附加到 Safari 扩展进程以命中断点。

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

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

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

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


推荐阅读