Deep Link & URL Scheme & Universal Link

本文深入探讨了DeepLink、URLScheme及UniversalLink三种深链技术,分析了它们在移动应用中的作用与实现方式,对比了各自的优势与局限,特别强调了UniversalLink的安全性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Deep Link & URL Scheme & Universal Link

Deep Link

在移动前端,deepLink一般指app内部的逻辑处理,可以根据这个deeplink直接跳转到对应的页面或者触发特定的逻辑,deeplink的目的是通过deep link打开app,并且跳转带app内某个页面,前提是该APP在该手机上已安装,且该APP需要编程支持该Deep Link的“schema”语法定义。

URL Scheme(Deep Link第一代实现方式)

URL Schemes其实就是实现deep linking的第一代解决方案。利用它就可以在移动开发中实现从web页面或者别的app中唤起自己的app的功能,然而开发者们很快就发现,这样也还有很多限制:

  • Custom URL scheme 是自定义的协议,所以在没有安装 app 的情况下是无法直接打开的。

    在app内开启其他app的scheme之前,通过canOpenURL判断是否安装app,来决定是否可以跳转,但是需要先检查这个scheme是否注册了,即在info.plist文件的LSApplication

    QueriesScheme中记录要询问的scheme,否则通过canOpenURL得到的结果是false。

  • 因为这个scheme是自己定义的,容易冲突。

    例如,自己的名为A的app定义的url scheme为a://,但如果用户手机没有装名为A的app,而装了名为B的app,但是B也定义了a://,那么通过a://打开的app就是B,而不是A,也就是冲突了

因此为了解决以上问题,苹果推出了Universal Link方案,但是,iOS在很长的一段时间内用来实现deep linking以及app间通信的方法就是上面提到的,被叫做custom URL scheme。处理的方法就是:

  1. 注册一个URL type,注册的方法就是在app的info.plist文件里添加 CFBundleURLTypes 键,它包含了一个由多个字典组成的数组,每一个字典定义了这个app支持的一个URL scheme,其他app即可通过这个URL scheme打开自己的app。

  2. application:willFinishLaunchingWithOptions:方法或者application:didFinishLaunchingWithOptions:方法中获取URL的相关信息,并决定是否要打开它,一般客户端会根据自己的业务需求建立白名单,不再白名单内的链接不允许打开。

  3. 如果在白名单内,实现app delegate方法:application:openURL:sourceApplication:annotation:(ios 9之前)或者application:openURL:options:(ios9之后) ,获取需要的信息,处理url链接,打开相应页面)。

Universal Link(Deep Link第二代实现方式)

一、概述

Universal Link可以让网站或者web view中的内容在用户点击跳转或安装了app之后仍然能够直接在这个app中被找到。比如,用户在官网上点击了“在app中浏览该商品”的链接,这个时候就可以通过Universal Link去唤起这个app,同时直接定位到该商品页面。

二、使用

  • 在支持HTTPS的服务器根目录下上传apple-app-site-association文件。

  • 在xcode的工程内Capabilities栏中找到Associated Domains,在里面添加以applinks:为前缀的域

  • 实现delegate方法application:continueUserActivity:restorationHandler:处理universal link的链接,通过该方法可以获取NSUserActivity对象,从该对象获取NSUserActivityTypeBrowsingWeb的activityType,这个对象的webpageURL属性中的URL就是用户正在访问的URL地址

    注意:当APP在设备上第一次运行时,若已开启Associated Domains功能,那么iOS会自动去获取Domain下的apple-app-site-association文件,iOS会先请求https://domain.com/.well-known/apple-app-site-association 。若此文件请求不到,再去请求https://domain.com/apple-app-site-association 。所以若想要避免服务器接收过多GET请求,可直接把apple-app-site-association放在./well-known/目录下。服务器上apple-app-site-association的更新不会让iOS本地的apple-app-site-association同步更新,即iOS只会在APP第一次启动时请求一次,以后除非APP更新或重新安装否则不会在每次打开时请求apple-app-site-association。

三、优缺点

(1)优点

1、Universal Links本身也就是一个能够指向一个web页面或者app中的内容页的标准的web link(形如https://example.com) ,当已经安装了这个app的时候,不需要加载任何web页面,app就会立即启动;当这个app没有安装的时候,就会默认地从当前浏览器中重定向到App Store中引导用户去下载安装这个app。而且,Universal links支持从其他app中的UIWebView中跳转到目标app

2、Universal links是从服务器上查询是哪个app需要被打开,因此不存在Custom URL scheme那样名字被抢占、冲突的情况。

3、安全性,用universl link去打开的时候,只有你(开发这个app的人)可以通过创建和上传一个允许这个网页去通过这个URL去打开你的app的文件。

4、隐私性,提供Universal link给别的app进行app间的交流,然而对方并不能够用这个方法去检测你的app是否被安装。(之前的custom scheme URL的canOpenURL方法可以)

(2)缺点

如果用户手机上没有安裝 APP,那么使用ULink只能打开网页,而不能引导用户前往 App Store 下载。所以有些网页处理方案是在载入的時候,會运行一段 javascript ,然后通过timer 计时,如果在特定时间內无法开启 App,就前往 App Store 下载。

deferred Deep Linking

deferred deep linking 是指用户打开一个 web page 的时候并没有安装对应的 app,希望用户在安装 app 以后可以 deep link 到对应内容

https://juejin.im/post/59e2cdbef265da43200245a0

### 关于闲鱼 Deeplink 的实现与用法 #### 一、Deeplink 技术概述 Deeplink 是一种能够直接链接到移动应用程序内部特定页面的技术。通过 Deeplink,用户可以从外部(如网页、短信或其他应用)直接进入目标应用内的指定位置,而无需经过首页导航。对于像闲鱼这样的电商类平台来说,这一功能极大地提升了用户体验和操作效率。 #### 二、闲鱼 Deeplink 实现原理 为了支持更复杂的场景需求以及提高兼容性和稳定性,在实际开发过程中通常会采用增强版的 Deep Link 方案——App Links 或 Universal Links[^1]。这类方案不仅限定了协议头(http:// 或 https://),还允许开发者自定义路径结构来指向不同的业务逻辑模块;同时配合 Chrome API 进行已安装检测,确保即使是在弱网环境下也能顺利完成跳转流程。 #### 三、具体实施步骤 当涉及到具体的编码实践时,可以参照如下方法: - **注册 URL Scheme** 首先要在 AndroidManifest.xml 文件中声明相应的 `<intent-filter>` 来匹配预期接收的 URI 模式。 ```xml <activity android:name=".MainActivity"> ... <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <!-- 定义scheme --> <data android:scheme="xf" /> </intent-filter> </activity> ``` - **解析 Intent 数据并响应** 接下来就是在 Activity 中重写 `onNewIntent()` 方法获取传递过来的信息,并据此执行相应动作,比如定位商品详情页等。 ```java @Override protected void onNewIntent(Intent intent){ super.onNewIntent(intent); Uri data = intent.getData(); if (data != null && "xf".equals(data.getScheme())) { String path = data.getPath(); // 获取path部分用于判断具体要展示的内容 switch(path){ case "/item": long itemId = Long.parseLong(data.getQueryParameter("id")); showItemDetail(itemId); // 展示对应的商品详情 break; default: Log.d(TAG, "Unknown deeplink path"); } } } ``` - **优化用户体验** 使用 ARouter 或者其他路由框架可以帮助简化跨组件间的通信过程,使得 Flutter 和 Native 组件之间也可以方便地互相调用[^3]。此外还可以考虑加入缓存机制防止重复加载资源浪费流量等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的修养

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值