setInterval 在 safari Web 扩展上无法正常工作

问题描述 投票:0回答:3

我最近使用 safari web 扩展转换器将我的 chrome 扩展移植到 safari:https://developer.apple.com/documentation/safariservices/safari_web_extensions/converting_a_web_extension_for_safari

但是,我发现我的 setInterval 调用仅在后台页面中执行了设定次数。当我打开网络扩展的背景页面时,我尝试运行一个简单的间隔来查看结果:

Safari Web 扩展后台页面在运行设定次数后出现间隔卡住

当我对 chrome Web 扩展尝试同样的操作时,间隔无限期地运行:

Chrome Web 扩展后台页面连续运行间隔

如果我尝试在 Safari 中打开任何随机网页的开发控制台后运行间隔,则间隔工作正常:

间歇性连续运行的 Safari 内容页面

同样,递归 setTimeout 函数在 Web 扩展的后台页面中失败:

我的后台页面中递归setTimeout函数 我的后台页面递归设置超时函数的结果(之后停止)

我不确定为什么计时器在 Safari 的后台页面中可能会失败。我的扩展在 chrome/brave/firefox 中运行得非常好。谢谢!

safari safari-extension browser-extension safari-web-inspector safari-web-extension
3个回答
1
投票

当扩展程序未处于活动状态时,Safari 浏览器会停止该特定扩展程序的后台进程。

替代方法:您可以在内容脚本中创建超时,并定期从内容脚本的消息后台检查您的要求。


1
投票

我也看到了同样的问题。无论时间间隔如何,

setInterval()
在 6 次迭代后都会受到限制。有人打过电话,但很零散,一开始是一分钟一次,后来间隔就更远了。

我通过切换到 alarms API 而不是

setInterval()
解决了这个问题。看起来效果不错。

Safari 16.3、macOS 12.6 蒙特利。


0
投票

从 MV3 开始,service Worker 中的 setTimeout() 或 setInterval() 可能会失败,因为只要 Service Worker 终止,定时器就会被取消。

您应该将计时器转换为闹钟。与其他侦听器一样,警报侦听器应在脚本的顶层注册。

© www.soinside.com 2019 - 2024. All rights reserved.