safari app extensions:从swift后台进程向所有选项卡广播消息

问题描述 投票:0回答:1

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

新的safari app扩展程序是否有任何等效功能?

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

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

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

swift safari safari-app-extension
1个回答
1
投票

方法应该是下一个:在injected.js中,您将消息发送到您的app-ext,例如

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

在app-ext中使用smth处理它:

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
        }
    }

}

那么,你可以在运行时通过smth将消息发送到所有打开的页面,如下所示:

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

它看起来很hacky但可行。请享用 :)

© www.soinside.com 2019 - 2024. All rights reserved.