【问题标题】:NSExtensionRequestHandling not handling native messagesNSExtensionRequestHandling 不处理本机消息
【发布时间】:2021-02-03 21:38:47
【问题描述】:

我正在尝试为我的原生应用程序创建一个 Safari Web 扩展。我想要一个带有按钮的弹出窗口,单击该按钮将与我的本机应用程序进行通信。在我进入这部分之前,我在发送本机消息并在符合NSExtensionRequestHandling 协议的类的beginRequest 函数中处理它时遇到问题。我没有做太多,因为我依赖于 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 但我没有找到答案。

【问题讨论】:

  • 我也遇到了同样的问题。你有想过吗?我观看了确切的会议。在我的“权限”数组中有“nativeMessaging”。本机处理程序永远不会被调用。如果你想通了,你介意分享作为答案吗?
  • 如果我没记错的话我没弄明白
  • 对于它的工作原理,我认为你不能从 popup.js 或 content.js 调用sendNativeMessage,我相信你只能从 background.js 调用它。如果您查看您的 safari 开发菜单,检查员您可能还会看到类似 undefined is not a function (sendNativeMessage) 的内容,查看您的控制台 -> 错误和故障(按捆绑 ID 过滤)并查看是否有任何类型的权限问题。

标签: javascript safari-extension safari-web-extension safariservices


【解决方案1】:

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

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

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

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

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

我认为您不能从popup.jscontent.js 致电sendNativeMessage。我相信您只能从background.js 调用它。所以你必须调用 popup.js -> background.js -> sendNativeMessage。

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

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

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

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

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

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

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

Passing Messages Between Safari App Extensions and Injected Scripts

【讨论】:

    【解决方案2】:

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

    如果您的扩展名为 My Test Extension,则调用如下所示:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多