Spotify在macOS Catalina的自定义协议疑问:无斜杠URI为何被Safari识别?
解决macOS Catalina中无斜杠自定义URI无法被Safari识别的问题
我之前折腾过类似的问题,Spotify那种spotify:track:2nI9BfzCrSWZnCkpF2Nn6O格式的无斜杠URI能被Safari直接识别跳转,确实是个特例——和常规自定义协议的配置细节有不少区别。你已经改了Info.plist但没效果,大概率是漏掉了下面这些关键点:
1. Info.plist里的完整URL Scheme配置
常规配置可能只加了CFBundleURLSchemes,但Spotify的配置里还有几个关键字段需要补上,才能让系统和Safari明确识别:
- 确保
CFBundleURLTypes数组里的字典包含LSHandlerRank并设为Owner,这个字段会让系统优先用你的App处理该Scheme,而不是直接丢去搜索。 - 添加
LSHandlerURLScheme字段,和你的Scheme名称对应。 - 可选但推荐:加上
LSHandlerRoleAll字段,指定你的App的Bundle ID,明确处理角色。
给你一个参考配置(把com.yourcompany.yourapp和yourapp换成你的实际信息):
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>com.yourcompany.yourapp</string> <key>CFBundleURLSchemes</key> <array> <string>yourapp</string> </array> <key>LSHandlerRank</key> <string>Owner</string> <key>LSHandlerURLScheme</key> <string>yourapp</string> <key>LSHandlerRoleAll</key> <string>com.yourcompany.yourapp</string> </dict> </array>
2. 遵循多段式的URI结构
Safari对无斜杠URI的识别有个潜规则:如果只是yourapp:singletext这种单段格式,很容易被当成搜索关键词;但像Spotify那样yourapp:category:identifier的多段结构,会被系统判定为合法的自定义URI。所以测试的时候别用单段的,试试yourapp:type:12345这种格式。
3. 重置LaunchServices的关联缓存
macOS会缓存URL Scheme和App的关联关系,你修改了Info.plist后,旧缓存可能还在生效。打开终端执行下面的命令重置缓存:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
执行完后重启Safari,必要的话重启电脑,确保缓存完全更新。
4. 检查Safari和系统的权限设置
- 第一次用Safari打开你的自定义URI时,会弹出是否允许跳转的弹窗,如果之前误点了拒绝,需要去「系统偏好设置 → 安全性与隐私 → 隐私 → 自动化」里,确认Safari有权限打开你的App。
- 另外检查Safari的「偏好设置 → 安全性」,确保没有勾选阻止自定义协议跳转的选项(不同版本表述可能略有不同)。
最后再测试一次
按照上面的配置改完、清完缓存、检查完权限后,把你的多段式URI(比如yourapp:track:abc123)粘贴到Safari地址栏,应该就能正常跳转了。
内容的提问来源于stack exchange,提问作者Zhenya




