iOS 中的 Deep Link 、 URL Schemes、Universal Link

一、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。

 CFBundleTypeRole
 Editor
 CFBundleURLName
 com.szy.seebaby
 CFBundleURLSchemes
 
     ztjy.parent.applink
 

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 delegateapplication:continueUserActivity:restorationHandler: 方法中 handle userActivity.webpageURL

4. 用 UIApplicationopenURL: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

饿了么测试 UniversalLink:
https://links.ele.me/stage/download.html?url=eleme%3A%2F%2Fweb%3Faction%3Dali.open.nav%26module%3Dh5%26packageName%3Dme.ele.ios.eleme%26bc_fl_src%3Dlocallife_wtdsp_33440ec21531ffb76841220d57181d65_2684284_21625822188530a19b28bfe99f43cc93d2e5e426567b8f_1%26url%3Dhttps%253A%252F%252Ffc.ele.me%252Fa%252FODE0NDg2MWI0YjFjMTFlYjlhM2QwMjQyMGI1OWUxMjQ%253D%253Fo2i_dsp_channel%253D2%2526shop_id%253D6D0BF4828A0FE2C786638025B7843E14%2526one_id%253D80220634652047782%2526business%253D1%2526item_id%253DE57408B08AC5763F6D9BF151C377BF7B4C5CE50DF9EB6878%2526o2i_code%253D33440ec21531ffb76841220d57181d65%2526latitude%253D39.6154%2526o2i_snid%253D21625822188530a19b28bfe99f43cc93d2e5e426567b8f%2526o2i_deviceid%253D1389b999e85a4e0c774440b5f532e4ff%2526isCharge%253D0%2526city_id%253D%2526longitude%253D118.18012%2526o2i_islp%253D1%26source%3Ddsp_2%26o2i_code%3D33440ec21531ffb76841220d57181d65%26o2i_snid%3D21625822188530a19b28bfe99f43cc93d2e5e426567b8f%26fastmode%3D1&fastmode=1

淘宝测试 UniversalLink:
https://ace.tb.cn/t?smburl=tbopen%3A%2F%2Fm.taobao.com%2Ftbopen%2Findex.html%3Fsource%3Dauto%26action%3Dali.open.nav%26module%3Dh5%26bootImage%3D0%26spm%3D2014.ugdhh.2200803434083.226906-443901-32896%26bc_fl_src%3Dgrowth_dhh_2200803434083_226906-443901-32896%26materialid%3D226906%26h5Url%3Dhttps%253A%252F%252Fstar-link.taobao.com%253Fslk_actid%253D100000000323%2526spm%253D2014.ugdhh.2200803434083.226906-443901-32896%2526bc_fl_src%253Dgrowth_dhh_2200803434083_226906-443901-32896%2526activity_id%253D521012716

三、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中跳到他刚才想看的那个商品的页面。这对于商家来说,也就大大提高了用户的转化率。

你可能感兴趣的:(iOS 中的 Deep Link 、 URL Schemes、Universal Link)