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