iOS 中的 Deep Link 、 URL Schemes、U
一、Deep Link 、 URL Schemes
1. 什么是 Deep Link?
Deep Link就是一个链接的概念,事实上我们每天都会使用到它去打开一个网站页面,只不过它是比普通的链接更加复杂一些。在web开发领域,深度链接就是说这个链接不是仅仅打开一个网站http://example.com/, 而是直接地打开这个网站中的某个具体内容页面http://example.com/my-awesome-content-page 。 通常来讲,有很多链接就是深度链接,只不过大家都习惯于称之为链接。
在移动开发领域,深度链接的概念就是指app在处理特定的url时能够直接跳转到对应的内容页面或者触发特定的逻辑。这样的好处有:
- 在 Web 页面和 App 的切换过程中保留了上下文
- 在 App之间的切换保留了上下文,实现 App 之间参数的传递
- Web 页可以被搜索引擎索引,可以增加 SEO 的访问量从而提高 App 下载量和开启率
Android、iOS 都推出了相应的概念去实现深链接。于是就有 Universal Link、App Link、URL Schemes。
2. 什么是 URL Schemes?
- 网址相信大家都很了解了,其实
URL Scheme
跟网址差不多。 - Scheme 一般完整格式是
scheme://host:port/path
,而 scheme 表示 URL 的第一个位置。 - 比如微信的 URL Scheme
weixin://dl/business/?t=123
放在浏览器,就能打开微信,跳转相应页面
3. 如何让一个 App 支持 Custom URL Scheme?
- 注册一个
URL Type
,注册方法就是在 app 的 info.plist 文件里面添加CFBundleURLTypes
键,它包含了一个由多个字典组成的数组,每一个字典定义了这个 app 支持的 URL Scheme。
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>com.szy.seebaby</string>
<key>CFBundleURLSchemes</key>
<array>
<string>ztjy.parent.applink</string>
</array>
</dict>
4. 那如果你的 APP 收到一个来自 URL Scheme 的跳转,在哪里处理 URL Scheme 呢?
- 在 app delegate 的
application:openURL:options:
方法回调中处理
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
BOOL handled = NO;
// code to handle the URL
return handled;
}
二、 Universal Link
1. 什么是 Universal Link?
-
Universal Link
是苹果在 iOS9 之后推出的用于代替Custom URL Scheme
的新概念 - 通俗讲,就是用了这个 Universal Link,就可以让网站或者 Web View中的内容在用户点击跳转或安装了 app 之后仍然能直接在这个 app 中被找到。
- 比如,用户在官网上点击了 “在app中浏览该商品” 的链接,这个时候就可以通过 Universal Link 去唤起这个 app,同时直接定位到该商品页面。
2. Universal Link 的好处(至少说两个吧)?
- ① 之前的 Custom URL scheme 是自定义的协议,因此在没有安装该 app 的情况下是无法直接打开的。而 Universal Link 本身就是一个能够指向一个 web 页面或者 app 中的内容页的标准web link(形如 https://example.com )因此能够很好的兼容其他情况。
- 也就是说,当已经安装了这个 app 的时候,不需要加载任何 web 页面,app 就会立即启动;当这个 app 没有安装的时候,就会默认地从当前浏览器中重定向到 App Store 中引导用户去下载安装这个 app。
- ② Universal Links 是从开发者的服务器上查询是哪个 app 需要被打开,因此不存在 Custom URL Scheme 那样名字被占用、冲突的情况。
- ③ Universal Link 支持从其他 app 中的 UIWebView 中跳转到目标 app
- ④ 安全性,用 Universal Link 去打开的时候,只有你(开发这个 APP 的人)可以通过创建和上传允许这个网页去通过这个 URL 打开你的 app 的文件。
- ⑤ 隐私性,提供 Universal Link 给别人的 app 进行 app 之间的交流,然而对方并不能够用这个方法取检测你的 app 是否被安装。(之前的 Custom URL Scheme 的 canOpenURL 方法可以)
3. 如何让 app 支持 Universal Link?
Universal links 的具体实现可以参考官方文档:Support Universal Links。简单来说你需要:
- 添加一个
apple-app-site-association
文件到你的网站来描述 URL 和 app 的关联。 - 添加
com.apple.developer.associated-domains
entitlement 来指定要从哪些域名查询 universal links support。 - 在
app delegate
的application:continueUserActivity:restorationHandler:
方法中 handleuserActivity.webpageURL
。
4. 用 UIApplication
的 openURL:
和 canOpenURL:
有什么使用注意事项吗?
-
canOpenURL 操作 Universal Link:
永远返回YES
。 -
canOpenURL 操作 Custom URL Scheme:
方法的结果受info.plist
中声明的Scheme
的配置限制;如果info.plist
有配置返回YES
;如果info.plist
没配置返回NO
。 -
openURL 操作 Universal Link:
可以直接打开对应 app(不受info.plist
文件影响);如果没有安装对应app,则打开safari浏览器
展示网页。 -
openURL 操作 Custom URL Scheme:
如果有安装对应 app 可以直接打开对应 app(不受info.plist
文件影响);如果没有安装对应app,则没有任何反应,openURL
函数返回NO
。
三、Deferred Deep Link
然而,无论是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中跳到他刚才想看的那个商品的页面。这对于商家来说,也就大大提高了用户的转化率。