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

黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述safari app extensions:从swift后台进程向所有选项卡广播消息相关的知识,希望能为你提供帮助。
在旧版扩展中,可以迭代safari.application.activeBrowserWindow.tabs以向向扩展注册的所有选项卡发送消息。
新的safari app扩展程序是否有任何等效功能?
我一直在浏览文档,但没有找到任何关于如何实现这个非常基本的东西的提示。
一个可怕的解决方法是让所有选项卡ping Swift背景,但实际上这是一个基本的东西似乎很荒谬,它不是可用的或由文档覆盖,我错过了什么?
我还尝试保留所有“页面”实例的弱映射,如“messageReceived”处理程序所见,希望SFSafariPage引用将被保留,直到选项卡关闭但它们几乎立即丢失,表明它们是比实际更多的消息通道Safari页面。
答案方法应该是下一个:在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) }

【safari app extensions(从swift后台进程向所有选项卡广播消息)】它看起来很hacky但可行。请享用 :)

    推荐阅读