javascript - 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 World
和click
消息,但正如我之前提到的 -beginRequest
没有被调用。有什么遗漏吗?我还观看了 WWDC20 的Meet Safari Web Extensions
会议,但没有找到答案。
解决方案
因为这可能是由几件事造成的,所以我会尝试以下方法来帮助调试问题。
确保你已经在你的能力中设置了一个应用组,并将扩展和应用设置为同一个应用组。
检查是否启用了“开发人员”->“允许未签名的扩展”。(如果您没有看到“开发”,则需要在“首选项”->“高级”中启用它
确保您在
manifest.json
示例中具有正确的权限:
"permissions": [ "nativeMessaging", "<all_urls>" ]
我认为您不能sendNativeMessage
从popup.js
or拨打电话content.js
。我相信你只能从background.js
. 所以你必须调用 popup.js -> background.js -> sendNativeMessage。
如果您查看 Safari 开发菜单、检查器,您可能会看到类似“未定义不是函数 ( sendNativeMessage
)”的内容。当未调用background.js
或其他权限问题时会发生这种情况。
- 还要查看您的 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
推荐阅读
- google-app-engine - 通过 App Engine 上的自定义域使用 Google IAP
- swift - 线程 0 崩溃
- javascript - Vue 和 Vuex 在 store 模块中做 Axios 操作
- javascript - 如何正确映射数组以访问其嵌套数组中的属性?
- database - 基于资源的授权数据库模式
- amazon-web-services - 如何处理对 Amazon Lex 的 lambda 响应?
- kubernetes - Kubernetes 微服务之间的通信
- json - 如何从 json 嵌套对象返回布尔值
- javascript - 我想删除 mikkymax 文件
- python - 如何使用 Flask、jinja2 动态更改表状态(已发送、已发送、已取消)