Universal link 和 scheme 的关系

前言

前阵子在实现应用间链接跳转时碰到了个问题,ios 下实现用户未安装小黑盒跳转 apple store,安装了则跳小黑盒 app,起初使用 scheme 实现,实现的方案是延时 检测 用户页面是否 visible,这种方案在用户切屏速度过快时就会失效,如下

js 复制代码
tryOpenChatApp() {
  const chatProtocolUrl = `heyboxchat://***`;
  window.location.href = chatProtocolUrl;

  setTimeout(() => {
    if (document.visibilityState === 'visible') {
      this.redirectToChatDownload();
    }
  }, 2000);
},

后面把协议换成了 Universal Link 就不需要延时检测,Universal link 能够天生支持未安装应用直接跳商店,本期文章就来了解下 Universal link 与 URL Scheme 的关系

URL Scheme

URL Scheme 是一种自定义的 URL 协议,允许应用注册特定的协议头来响应特定格式的链接。当用户点击包含该 scheme 的链接时,系统会尝试打开注册了该 scheme 的应用。

一个典型的 URL Scheme 链接结构如下:

ini 复制代码
scheme://host/path?query=value

比如 小黑盒 的 scheme 就是 heyboxchat://

URL Scheme 的工作原理如下:

  1. 应用在 Info.plist(iOS)或 AndroidManifest.xml(Android)中注册自定义 scheme
  2. 当用户点击包含该 scheme 的链接时,操作系统查找注册了该 scheme 的应用
  3. 如果找到对应应用,系统启动该应用并传递链接参数
  4. 如果应用未安装,通常会显示错误提示或无响应

URL Scheme 的优势

  1. 实现简单:只需要在应用配置文件中注册 scheme 即可
  2. 跨平台支持:iOS 和 Android 都支持这种方式
  3. 历史悠久:是最早的应用间跳转解决方案
  4. 灵活性高:可以传递复杂的参数和路径信息

URL Scheme 的局限性

  1. 安全性问题:任何应用都可以注册相同的 scheme,存在被恶意应用劫持的风险
  2. 用户体验差:如果目标应用未安装,用户会看到错误提示
  3. 无法验证应用身份:系统无法确保打开的是预期的应用
  4. 协议冲突:多个应用可能注册相同的 scheme,导致不确定性

下面看 Universal Link

Universal Link 是苹果在 iOS 9 中引入的新技术,旨在解决 URL Scheme 存在的安全性和用户体验问题。它通过将应用与特定的网站域名关联,提供了更安全、更可靠的深度链接解决方案。

Universal Link 的工作原理

  1. 开发者在应用中配置 Associated Domains,指定关联的域名
  2. 在对应的网站服务器上放置 apple-app-site-association 文件
  3. 用户安装应用时,iOS 系统验证应用与域名的关联关系
  4. 当用户点击该域名下的链接时,系统优先打开关联的应用
  5. 如果应用未安装,链接会在浏览器中正常打开网页

现在看下 apple-app-site-association 文件

这是一个 JSON 格式的配置文件,必须放置在网站根目录或 .well-known 目录下:

json 复制代码
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAMID.com.example.app",
        "paths": [
          "/product/*",
          "/user/*",
          "NOT /admin/*"
        ]
      }
    ]
  }
}

Universal Link 的优势

  1. 安全性高:通过域名验证确保应用身份的唯一性
  2. 用户体验好:应用未安装时自动跳转到网页,无错误提示
  3. 无需用户确认:系统直接打开应用,无需用户选择
  4. SEO 友好:链接本身就是有效的网页 URL
  5. 支持延迟深度链接:可以在应用安装后跳转到指定页面

Universal Link 同样也有限制

  1. 仅支持 iOS:Android 有类似的 App Links 技术,但实现方式不同
  2. 需要 HTTPS:必须使用安全的 HTTPS 协议
  3. 域名要求:需要拥有并控制一个域名
  4. 配置复杂:需要同时配置应用和服务器端
  5. 调试困难:问题排查相对复杂

Universal LinkURL Scheme 并不是完全对立的技术,而是互补的关系:

  1. Universal Link 主要解决从网页到应用的跳转
  2. URL Scheme 更适合应用间的直接跳转
  3. 在实际项目中,两者经常同时使用

技术层面的区别

特性 Universal Link URL Scheme
安全性 高(域名验证) 低(可被劫持)
用户体验 好(无错误提示) 差(应用未安装时报错)
实现复杂度
平台支持 iOS(Android 有 App Links) 跨平台
网络要求 需要 HTTPS
域名要求 必须 不需要

使用场景对比

  1. 从网页跳转到应用:优先使用 Universal Link
  2. 应用间直接跳转:使用 URL Scheme
  3. 分享功能:Universal Link 更适合
  4. 第三方应用集成:通常使用 URL Scheme
  5. 营销推广:Universal Link 提供更好的用户体验

在实际开发中,建议采用混合使用策略:

  1. 对外分享和营销推广使用 Universal Link
  2. 应用间跳转使用 URL Scheme
  3. 提供降级方案:Universal Link 失败时回退到 URL Scheme

实现示例

iOS 应用中同时支持两种方式:

swift 复制代码
// Universal Link 处理
func application(_ application: UIApplication,
                continue userActivity: NSUserActivity,
                restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        if let url = userActivity.webpageURL {
            // 处理 Universal Link
            handleUniversalLink(url)
            return true
        }
    }
    return false
}

// URL Scheme 处理
func application(_ app: UIApplication,
                open url: URL,
                options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    // 处理 URL Scheme
    handleURLScheme(url)
    return true
}

调试和测试

  1. Universal Link 调试:

    • 使用苹果的验证工具检查配置
    • 通过 Safari 测试链接跳转
    • 检查 apple-app-site-association 文件的可访问性
  2. URL Scheme 调试:

    • 在 Safari 地址栏直接输入 scheme 链接测试
    • 使用模拟器和真机分别测试
    • 检查应用是否正确注册了 scheme

Android 平台有类似 Universal Link 的技术叫做 App Links

  1. 同样需要域名验证
  2. 使用 Digital Asset Links 文件进行验证
  3. 提供类似的安全性和用户体验

Intent Filter

Android 的 Intent Filter 类似于 iOS 的 URL Scheme

  1. AndroidManifest.xml 中配置
  2. 支持自定义协议和标准 HTTP/HTTPS 链接
  3. 可以处理多种类型的链接

最后

Universal LinkURL Scheme 都是移动应用生态系统中重要的深度链接技术,它们各有优势和适用场景:

  1. URL Scheme 作为传统方案,实现简单但存在安全性和用户体验问题,比如文中开头提到的问题
  2. Universal Link 作为 ios 的链接技术,提供了更好的安全性和用户体验,但实现相对复杂
  3. 在实际应用中,两者往往结合使用
相关推荐
Kiyra11 分钟前
限流不是加个计数器就行:用 Lua 脚本实现多维度原子限流
开发语言·人工智能·网络协议·职场和发展·架构·lua·ai-native
原则猫25 分钟前
await 到底在等待什么
前端
MonkeyKing33 分钟前
iOS 循环引用深度解析:delegate/block/NSTimer/嵌套闭包
ios
泉木33 分钟前
KVO 详解 —— iOS/ObjC 完整学习指南
ios·objective-c
西洼工作室35 分钟前
fetch+ReadableStream实现SSE推送实时踢人下线
前端·python·全栈
MonkeyKing37 分钟前
iOS AutoreleasePool 深度解析:原理、Page结构与释放时机
ios
农夫山泉不太甜40 分钟前
Nuxt 4 完全指南:从入门到精通
前端
Momo__42 分钟前
Vue 3.4+ 被低估的 3 个 API,让你的代码更优雅
前端·vue.js
dishugj1 小时前
HANA数据库常用命令总结
java·前端·数据库
clove1 小时前
JavaScript 提升(Hoisting)与声明优先级:一篇文章说透
前端