如何绕过浏览器自定义协议限制,直接唤起macOS桌面应用?
macOS下绕过自定义协议唤起提示的实现方案
核心原理:利用macOS已验证域名机制
macOS允许开发者将应用签名证书与指定域名绑定,当这些域名发起自定义协议请求时,浏览器会直接信任并唤起应用,跳过「网站想要打开此应用」的权限提示。Slack、VSCode正是通过这一机制实现无提示唤起。
具体实现步骤
1. 为应用注册自定义协议
在应用的Info.plist文件中添加自定义协议配置,以myapp:为例:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>My Custom App</string> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> </array> </dict> </array>
2. 部署已验证域名配置文件
创建名为apple-app-site-association的JSON文件,内容如下(删除注释后部署):
{ "applinks": { "details": [ { "appIDs": [ "你的Apple团队ID.应用BundleID" ], "components": [ { "/": "*" } ] } ] } }
- 将该文件部署到你的官方域名根目录或
.well-known目录下(如https://yourdomain.com/.well-known/apple-app-site-association),必须通过HTTPS访问,不能有重定向,且MIME类型需设置为application/json。
3. 配置Apple开发者后台关联域名
- 登录Apple开发者中心,进入应用ID的配置页面。
- 开启「Associated Domains」功能,添加格式为
applinks:yourdomain.com的关联域名(支持通配符,如applinks:*.yourdomain.com)。
4. 重新签名应用
使用包含「Associated Domains」权限的Provisioning Profile重新签名应用,确保应用能读取关联域名配置。
5. 浏览器端触发优化
在官方网站上通过JavaScript间接触发协议请求,配合信任机制确保无提示唤起:
function openCustomApp() { const targetUrl = 'myapp://path/to/action'; const triggerIframe = document.createElement('iframe'); triggerIframe.style.display = 'none'; triggerIframe.src = targetUrl; document.body.appendChild(triggerIframe); setTimeout(() => { document.body.removeChild(triggerIframe); }, 100); }
关键注意事项
- 必须使用付费Apple开发者账号,个人免费账号无法启用「Associated Domains」功能。
- 浏览器缓存可能影响配置生效,测试时建议使用隐私模式或清空缓存。
- 主流浏览器(Safari、Chrome等)均支持该机制,但需注意不同浏览器的校验细节差异,需多端测试。
内容的提问来源于stack exchange,提问作者Gabriel Donadel Dall'Agnol
相关产品推荐
相关产品推荐

