如何在不使用内容脚本与无障碍权限的前提下,通过Option+Tab快捷键触发Safari应用扩展打开标签页面板?
我完全懂你的烦恼——这个“读取敏感数据”的提示真的太劝退用户了,明明你的应用根本没碰密码这类信息,却被贴上这样的标签,换谁都会犹豫要不要安装。而且要求用户开启无障碍权限也容易引起疑心,毕竟大家对隐私权限的敏感度越来越高了。
结合你提到的TabBack Lite的实现思路,以及Safari扩展的规则,这里有几个可行的解决方案,既能避开权限提示,又能实现你的需求:
1. 彻底弃用内容脚本,消除敏感权限提示
首先第一步,把Safari App Extension的Info.plist里的SFSafariContentScript键完全删掉——这是那个讨厌的权限提示的根源。别担心标签数据的问题,你完全不需要通过内容脚本获取标签信息,用Safari的原生API就能搞定:
在你的原生macOS应用代码里,用SFSafariApplication的API就能获取所有打开的Safari窗口和标签:
import SafariServices func getRecentTabs() -> [SFSafariTab] { var tabs = [SFSafariTab]() let semaphore = DispatchSemaphore(value: 0) SFSafariApplication.shared.getActiveWindow { activeWindow in activeWindow?.getAllTabs { allTabs in tabs = allTabs semaphore.signal() } } semaphore.wait() return tabs }
这个API是Safari官方提供的,完全不需要读取网页内容,自然不会触发敏感权限提示。
2. 用后台脚本+原生应用通信替代内容脚本
移除内容脚本后,你可以在Safari Web Extension的后台脚本里,通过safari.extension.dispatchMessage和原生应用的SFSafariWebExtensionHandler建立通信,同步标签的打开/关闭状态,这样你的原生应用随时都能拿到最新的标签列表,不需要依赖内容脚本监听键盘事件。
3. 实现Option+Tab快捷键的两种合规方式
这里的核心是避开全局快捷键(需要无障碍权限)和内容脚本,下面两种方式都符合要求:
方式A:引导用户配置系统级应用快捷键
macOS自带“应用快捷键”功能,你可以在应用第一次启动时,弹出友好的引导界面,教用户在「系统偏好设置 → 键盘 → 快捷键 → 应用快捷键」里,为Safari添加一个自定义快捷键(Option+Tab),触发你的应用的“显示标签面板”功能。
这种方式完全不需要任何特殊权限,只是需要用户几步简单的操作,比要求开启无障碍权限容易接受得多。
方式B:模仿TabBack Lite的无权限实现
TabBack Lite之所以不需要任何敏感权限,大概率是这么做的:
- 完全依赖Safari Web Extension的后台脚本同步标签数据到原生应用,不用内容脚本。
- 默认通过扩展的工具栏图标唤起标签面板,同时支持用户通过系统的“应用快捷键”自定义触发快捷键(包括Option+Tab)。
- 没有全局快捷键监听,完全借助系统原生功能实现快捷键触发,自然不需要无障碍权限。
额外小技巧
如果你想尽量减少用户的手动操作,可以用AppleScript自动帮用户配置应用快捷键——只需要用户授权一次脚本访问系统设置,这比要求开启无障碍权限的接受度高很多。
备注:内容来源于stack exchange,提问作者Oleh Kopyl




