swift - Safari 应用程序扩展 : broadcast a message to all tabs from swift background process

标签 swift safari safari-app-extension

在旧版扩展中,可以迭代 safari.application.activeBrowserWindow.tabs 以向所有注册了该扩展的标签页发送消息。

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

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

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

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

最佳答案

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

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

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

关于swift - Safari 应用程序扩展 : broadcast a message to all tabs from swift background process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53319964/

相关文章:

ios - 如何在 Swift 框架中导入私有(private)框架头文件?

html - 在 iPhone 上快速下载 Safari 和 Chrome

swift - 如何在工具栏上打开应用程序窗口单击 safari 应用程序扩展?

ios - 无法调用非函数类型的值 'UIScreen'

xcode - 如何检测 UITextField 中的阿拉伯字符?

ios - 在 SpriteKit 中将节点定位在屏幕的顶部中间

css - 为什么输入类型=搜索会导致 Webkit(Safari)上的额外填充

Safari 上的 Css 列数错误

xcode - 如何在没有 macOS 应用程序的情况下开发 Safari 应用程序扩展?

macos - Mac 应用程序扩展在 Unix 套接字上调用 connect 获取 EPERM(沙盒?)