我最近使用 safari web 扩展转换器将我的 chrome 扩展移植到 safari:https://developer.apple.com/documentation/safariservices/safari_web_extensions/converting_a_web_extension_for_safari。
但是,我发现我的 setInterval 调用仅在后台页面中执行了设定次数。当我打开网络扩展的背景页面时,我尝试运行一个简单的间隔来查看结果:
Safari Web 扩展后台页面在运行设定次数后出现间隔卡住
当我对 chrome Web 扩展尝试同样的操作时,间隔无限期地运行:
如果我尝试在 Safari 中打开任何随机网页的开发控制台后运行间隔,则间隔工作正常:
同样,递归 setTimeout 函数在 Web 扩展的后台页面中失败:
我的后台页面中递归setTimeout函数 我的后台页面递归设置超时函数的结果(之后停止)
我不确定为什么计时器在 Safari 的后台页面中可能会失败。我的扩展在 chrome/brave/firefox 中运行得非常好。谢谢!
当扩展程序未处于活动状态时,Safari 浏览器会停止该特定扩展程序的后台进程。
替代方法:您可以在内容脚本中创建超时,并定期从内容脚本的消息后台检查您的要求。
我也看到了同样的问题。无论时间间隔如何,
setInterval()
在 6 次迭代后都会受到限制。有人打过电话,但很零散,一开始是一分钟一次,后来间隔就更远了。
我通过切换到 alarms API 而不是
setInterval()
解决了这个问题。看起来效果不错。
Safari 16.3、macOS 12.6 蒙特利。
从 MV3 开始,service Worker 中的 setTimeout() 或 setInterval() 可能会失败,因为只要 Service Worker 终止,定时器就会被取消。
您应该将计时器转换为闹钟。与其他侦听器一样,警报侦听器应在脚本的顶层注册。