0

在旧版扩展中,可以迭代safari.application.activeBrowserWindow.tabs以将消息发送到使用扩展注册的所有选项卡。

新的 Safari 应用程序扩展是否有任何等效功能?

我一直在阅读文档,但没有找到任何关于如何实现这个非常基本的东西的提示。

一个可怕的解决方法是让所有选项卡都 ping Swift 背景,但实际上这是一个如此基本的事情,它不可用或被文档覆盖似乎很荒谬,我错过了什么吗?

我还尝试保留“messageReceived”处理程序看到的所有“页面”实例的弱映射,希望SFSafariPage引用将一直保留到选项卡关闭但它们几乎立即丢失,这表明它们比实际的消息通道更多Safari 页面。

4

1 回答 1

2

下一步应该是这样:在injected.js您将消息发送到您的应用程序扩展中,例如

document.addEventListener("DOMContentLoaded", function (event) {
    safari.extension.dispatchMessage('REGISTER_PAGE')
})

并在 app-ext 中像这样处理它:

var pages: [SFSafariPage] = []

class SafariExtensionHandler: SFSafariExtensionHandler {

    override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
        switch messageName {
        case "REGISTER_PAGE":
            if !pages.contains(page) {
                pages.append(page)
            }
        default:
            return
        }
    }

}

好吧,那么您可以像这样在运行时将消息发送到所有打开的页面:

for p in pages {
    p.dispatchMessageToScript(withName: "message name", userInfo: userInfo)
}

它看起来很老套,但仍然可行。享受 :)

于 2018-11-20T15:40:10.720 回答