gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 14:03:10 28 4
gpt4 key购买 nike

在旧版扩展中,可以迭代 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com