跳到主要内容

Deep Link 与 URL Scheme

问题

iOS 中 Deep Link 的实现方式有哪些?

答案

URL Scheme

Info.plist
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
// 处理打开
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else { return }
// myapp://user/profile?id=123
handleDeepLink(url)
}

Universal Links(推荐)

apple-app-site-association(服务端域名根目录)
{
"applinks": {
"apps": [],
"details": [{
"appID": "TEAMID.com.example.app",
"paths": ["/user/*", "/product/*"]
}]
}
}
// App 不需要注册 URL Scheme,系统自动识别
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else { return }
// https://example.com/user/123
handleDeepLink(url)
}

对比

URL SchemeUniversal Links
格式myapp://pathhttps://domain/path
需要安装 App无法回退可回退到网页
弹出确认框❌ 无❌ 无
安全性低(任何 App 可注册)高(域名验证)

常见面试问题

答案

  1. 检查 apple-app-site-association 文件是否可访问(无重定向,HTTPS)
  2. 检查 Entitlements 中 Associated Domains 格式 applinks:example.com
  3. 重新安装 App(首次安装时下载 AASA 文件)
  4. 长按链接不要选"在 Safari 中打开"(会触发屏蔽)

相关链接