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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
}

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

以上是关于safari app extensions:从swift后台进程向所有选项卡广播消息的主要内容,如果未能解决你的问题,请参考以下文章

来自 Share Extension 的 Safari 截图

App Extension Swift:从没有 javascript 的任何应用程序中获取 url

Safari Extension Companion 始终为空

如何阻止safari从网页直接跳转至app

如何从 safari 扩展中调用 python 函数

从app中的Safari链接打开safari