由于可能有多种原因导致此问题,因此我会尝试以下方法来帮助调试问题。
-
确保您已在功能中设置了应用程序组,并将扩展程序和应用程序设置为 Xcode 中的同一应用程序组。
-
检查 Safari 菜单中的“开发人员”->“允许未签名扩展”是否已启用。 (如果您没有看到“开发人员”,您需要在“首选项”->“高级”中启用它。
-
确保您拥有正确的权限manifest.json
例子:
"permissions": [ "nativeMessaging", "<all_urls>" ]
我认为你不能打电话sendNativeMessage
from popup.js
or content.js
。我相信你只能从background.js
。所以你必须调用 popup.js -> background.js -> sendNativeMessage。
如果您查看 Safari 开发菜单、检查器,您可能会看到类似“未定义不是函数(sendNativeMessage
)"。当未从以下位置调用时会发生这种情况background.js
或者其他权限问题。
- 另外,查看您的 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 扩展 https://developer.apple.com/videos/play/wwdc2020/10665/
Apple 的文档也非常有帮助:Safari Web 扩展中应用程序和 JavaScript 之间的消息传递 https://developer.apple.com/documentation/safariservices/safari_web_extensions/messaging_between_the_app_and_javascript_in_a_safari_web_extension
and 在 Safari 应用程序扩展和注入脚本之间传递消息 https://developer.apple.com/documentation/safariservices/safari_app_extensions/passing_messages_between_safari_app_extensions_and_injected_scripts