我们正在为 MacOS 制作 Safari 扩展,它使用 SFSafariApplication.dispatchMessage() 在扩展的本机部分和 javascript 部分之间进行通信。直到最近一切正常,但是更新到 xcode 16 后我开始收到此错误:
'dispatchMessage(withName:toExtensionWithIdentifier:userInfo:completionHandler:)' is unavailable in application extensions for macOS: Not available to extensions
'dispatchMessage(withName:toExtensionWithIdentifier:userInfo:completionHandler:)' has been explicitly marked unavailable here (SafariServices.SFSafariApplication)
我查看了文档,但是没有发现任何关于dispatchMessage()被其他东西取代的提示。根据https://developer.apple.com/documentation/safariservices/messaging- Between-the-app-and-javascript-in-a-safari-web-extension这是应该进行通信的方式。
这是一个错误吗?或者有人可以指导我使用其他沟通方式吗?
看起来
dispatchMessage()
不应该这样使用。扩展的本机部分应该只回复来自 javacript 部分的消息,但不发起通信。响应应该通过扩展处理程序的 NSExtensionContext
方法获取 beginRequest(with context: NSExtensionContext)
来完成。
据我发现,没有必要立即回复收到的消息。您可以存储
NSExtensionContext
,并在稍后响应准备好时将其用于响应。扩展的 Javascript 部分将在 browser.runtime.sendNativeMessage()
中设置的回调中接收响应。这样我就解决了我的问题。