iOS 15下Safari iOS应用扩展的popup.js如何获取活跃标签页URL
iOS 15+ Safari扩展Popup获取当前标签页URL解决方案
问题根因
你之前的两种写法都不适配iOS端Safari Web扩展的运行规则:
safari.application.activeBrowserWindow.activeTab.url是桌面端Safari的旧兼容API,iOS端Safari并未实现该接口,因此返回空值。document.URL读取的是扩展popup页面本身的本地文件路径,popup和浏览器标签页是完全隔离的上下文,无法直接读取标签页属性。
修复步骤
1. 更新manifest.json权限配置
你需要新增tabs权限以及站点访问权限:
如果使用Manifest V3:
"permissions": ["nativeMessaging", "activeTab", "tabs"], "host_permissions": ["<all_urls>"]
如果使用Manifest V2,直接将站点权限加入permissions数组:
"permissions": ["nativeMessaging", "activeTab", "tabs", "<all_urls>"]
如果不需要匹配所有站点,可将
<all_urls>替换为你实际需要支持的URL匹配规则。
2. 替换popup.js实现代码
iOS Safari Web扩展兼容标准的跨浏览器chrome.tabs异步API,使用如下代码获取活跃标签页URL:
document.addEventListener('DOMContentLoaded', async () => { const el = document.getElementById("appresponse"); try { // 查询当前窗口的活跃标签 const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true }); // 优先用textContent避免XSS风险,有HTML渲染需求再换innerHTML el.textContent = activeTab.url; } catch (e) { el.textContent = `获取失败: ${e.message}`; } });
3. 验证系统权限
你现有的Info.plist配置无需改动,只需确认:
- 扩展安装后在Safari设置中已开启「允许访问所有网站」权限,或给对应站点手动开启访问权限
- 首次调用API时弹出的权限申请框点击同意
排查提示
如果仍无法获取,可以通过Safari开发菜单连接iOS设备/模拟器的扩展popup上下文,查看控制台输出的具体报错信息定位问题。
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

