在移动前端,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。处理的方法就是:
注册一个URL type,注册的方法就是在app的info.plist文件里添加 CFBundleURLTypes 键,它包含了一个由多个字典组成的数组,每一个字典定义了这个app支持的一个URL scheme,其他app即可通过这个URL scheme打开自己的app。
在application:willFinishLaunchingWithOptions:方法或者application:didFinishLaunchingWithOptions:方法中获取URL的相关信息,并决定是否要打开它,一般客户端会根据自己的业务需求建立白名单,不再白名单内的链接不允许打开。
如果在白名单内,实现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,同时直接定位到该商品页面。
二、使用
1.配置App ID支持Associated Domains:
登录https://developer.apple.com/ 苹果开发者中心,找到对应的App ID,在Application Services列表里有Associated Domains一条,把它变为Enabled就可以了。
####2.配置iOS App工程:
工程配置中相应功能:targets->Signing&Capabilites->Capability->Associated Domains,在其中的Domains中填入你想支持的域名,也必须必须以applinks:为前缀。
具体步骤如下图:
3.配置和上传apple-app-association:
究竟哪些的url会被识别为Universal Link,全看这个apple-app-association文件Apple Document UniversalLinks.html
你的域名必须支持Https
域名 根目录 或者 .well-known 目录下放这个文件apple-app-association,不带任何后缀
文件为json保存为文本即可
json按着官网要求填写即可
apple-app-site-association模板:
1 | { |
说明:
appID:组成方式是 teamId.yourapp’s bundle identifier。如上面的 9JA89QQLNQ就是teamId。登陆开发者中心,在Account -> Membership里面可以找到Team ID。
>**paths:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。星号的写法代表了可识 别域名下所有链接。**
上传指定文件:上传该文件到你的域名所对应的根目录或者.well-known目录下,这是为了苹果能获取到你上传的文件。上传完后,自己先访问一下,看看是否能够获取到,当你在浏览器中输入这个文件链接后,应该是直接下载apple-app-site-association文件。
4.验证 Universal link 生效:
- 可以使用iOS自带的备忘录程序,输入链接,长按链接,如果弹出菜单中有”在‘xxx’中打开”,即表示配置生效。
- 或者将要测试的网址在Safari中打开,在出现的网页上方下滑,可以看到有在”xxx”应用中打开, 出现菜单:
5.在AppDelegate里中实现代理方法:
1 | - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { |
三、优缺点
####(1)优点
Universal Links本身也就是一个能够指向一个web页面或者app中的内容页的标准的web link(形如https://example.com) ,当已经安装了这个app的时候,不需要加载任何web页面,app就会立即启动;当这个app没有安装的时候,就会默认地从当前浏览器中重定向到App Store中引导用户去下载安装这个app。而且,Universal links支持从其他app中的UIWebView中跳转到目标app
Universal links是从服务器上查询是哪个app需要被打开,因此不存在Custom URL scheme那样名字被抢占、冲突的情况。
安全性,用universl link去打开的时候,只有你(开发这个app的人)可以通过创建和上传一个允许这个网页去通过这个URL去打开你的app的文件。
隐私性,提供Universal link给别的app进行app间的交流,然而对方并不能够用这个方法去检测你的app是否被安装。(之前的custom scheme URL的canOpenURL方法可以)
####(2)缺点
- 如果用户手机上没有安裝 APP,那么使用ULink只能打开网页,而不能引导用户前往 App Store 下载。所以有些网页处理方案是在载入的時候,會运行一段 javascript ,然后通过timer 计时,如果在特定时间內无法开启 App,就前往 App Store 下载。
三、 deferred Deep Linking 延迟深度链接
然而,无论是URI Scheme还是Universal Link都没有解决一个问题,就是如果设备上没有安装这个app的时候,保留住此时用户停留的上下文。例如,利用Universal Link,在没有安装app的情况下,iOS能够重定位到app store去引导用户去下载安装这个app,但是在安装之后,app只能打开首页,也就是说丢失了用户在点击跳转进入app之前的那个页面。
因此,有了一个非常重要的另一个概念:Deferred Deep Link。顾名思义,这里的deferred是延迟的意思,可以理解为延迟一下,在安装过程中keep住跳转前的特定页面内容,在app安装之后,再利用这个link在app里进行跳转。举个例子,用户在某个电商网站上看到一个商品,于是他点击了一个按钮“在app中查看该商品”,但他并没有下载这个app,于是iOS就引导他到了App Store安装这个app,当他安装完成之后,打开这个app,就会自动地在app中跳到他刚才想看的那个商品的页面。这对于商家来说,也就大大提高了用户的转化率。
- 本文作者: Grx
- 本文链接: https://ruixiaoguo.github.io/Grx.github.io/Grx.github.io/2022/01/08/深入了解DeepLink/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!