Deep Link背景知识
Web链接不知道app的存在,当在手机上打开一个Jet.com这样一个网页链接,你会进入到浏览器中打开Jet.com网站,尽管你的手机上已经安装了Jet app。Deep Link解决的问题就点击一个网页链接,能够跳转到对应的app中。
传统的deep link
传统的deep link当你在点击链接的时候,能够跳转到相应的app中,只要你已经安装了app。也就是如果手机上没有安装app,跳转至下载页。在iOS中,可以通过URL Scheme和Universe Link来实现。
deferred deep Link
deferred deep link是指用户打开一个web page的时候并没有安装对应的app,在用户安装app以后打开直接跳转到链接对应的内容。
实现思路:H5需要上报设备的一些信息到服务器端进行保存,用户下载后,第一次启动也上报设备信息,去服务器端查找是否有匹配的H5页点击行为,如果匹配则进行app内部跳转。
应该上报哪些信息更获得比较高的匹配准确率?
Device Info
1> 前端获取尽可能多的信息上报后台进行存储
2> app启动时,同样提供尽可能多的设备信息,向后台查询
3> 后台根据相关设备信息以及前端和app端访问时间进行模糊匹配,匹配成功后向app返回数据
支持设备无限制,无侵入性,理论成功率低,实践成功率较高Paste Board
1> 前端生成唯一标识符identifier,通过js脚本保存在剪贴板
2> 前端将identifier和其他数据上报后台,后台进行存储
3> app启动时读取剪贴板中的identifier,向后台查询数据
支持设备iOS10+,有侵入性,成功率高-
网页和app共用Cookies
Github上的例子[2]
app内SFSafariViewController和系统的safari是同一个,共享同一个沙盒,可以操作同一个cookie。
1> 启动本地服务器,safari访问指定页面设置cookie,对应于为XXXHost
2> 前端将相关数据上报后台,后台解析cookie并与数据进行绑定保存
3> app启动时,先开启SFSafariViewController,访问特定url,并携带设备id
4> 后台解析上述访问url的设备id,并解析访问的cookie,将cookie与设备id绑定
5> app请求api接口,携带设备id,通过后台查询相关信息
app启动时SFSafariViewController设置为透明,用户无法感知这一流程:苹果审核指南:5.1.1
支持设备iOS9,iOS10,无侵入性
流程如下图所示:
整体流程示意图
现有的Deep Link成熟产品Branch links
翻译自How Branch links work
Branch Links是一个成熟的Deep Link产品,查看其官方文档有助于理解Deep Link在前端和后台的多方面应用及在前端和后台的API设计。
1. 创建Links
- Mobile SDK
当你集成了Mobile SDK,在你的app内分享或者邀请另一个用户的时候,利用SDK发出请求,然后SDK返回一个Branch link。 - Web SDK
当你集成了Web SDK,在的网页内一个用户点击分享或者邀请另一个用户的时候,利用SDK发出请求,然后SDK返回一个Branch link。 - API
使用API批量生成Branch Link,比如需要为邮件联系人每一个人发一个唯一的link。 - Dynamic Long Links
不想通过SDK的API来创建links,只是在自己的link后边加上一些查询参数。 - Quick Links
具体定制links的外观等等,通过Dashboard平台订制
2. links中携带数据
通过Dashboard的Quick Link Creator,可以为link添加任一额外的key-value数据。建议添加如下字段:
说明 | 例子 | |
---|---|---|
channel | 分发link的渠道 | Facebook, email, SMS |
feature | link的动作 | share, invite, deal, gift |
campaign | link对应的运营活动 | "Fall Sale"秋季促销, "Launch Event"发布活动 |
tags | link相关的标签 | boots, recipes, paid |
3. 点击links
Branch link实际上是web上的一个网页,当用户点击Branch link时,打开了这个webpage,我们使用matching去检测你的用户设备,操作系统,浏览器,和浏览器相关的cookie,检查用户是否安装了app,然后进行下一步操作。
4.使用数据
deep linking的难点在于,与link相关的数据,比如用户从哪来,要到哪去,都会在app store丢失。一旦你打开app,app就通过Mobile SDK请求Branch,我们使用device fingerprints去将app打开与最初的link点击匹配起来,即使中间被app store下载步骤所分割。
当匹配完成后,将发送与该link相关的数据(步骤2)到你app中,然后,app就可以使用这些数据。可以使用与链接关联的数据进行个性化显示(比如link中配置了一张图片),当然也可以链接到app的具体内容页面。
5. 匹配准确率
见第二节Branch Matching
6. 统计图表
所有的link携带的数据,link的点击,app的使用情况都可以通过图表展示出来。通过图表获得的信息包括:
- 获取最多下载的渠道
- 推荐贡献最多的用户
- 对某一块内容的查阅,点击和安装
如下图所示:
Branch Matching
100%匹配的方法
直接deeplinking
当app已经安装,可以直接通过Branch links的配置得到app的URL scheme(myapp://)或者Universal Links,我们可以直接打开app并传递一个click identifier;click identifier然后被发送到Branch servers去获取与link相关联的数据。
非100%匹配的方法
浏览器到app的fingerprint匹配
Branch搜集了用户在浏览器中点击Branch Link获取的设备信息,和用户在打开app时搜集到的设备信息。这些信息包括IP地址,操作系统,操作系统版本,设备类型以及其他参数。这就是用户的digital fingerprint,能够从浏览器和app中获取到。
但是由于浏览器中获取的digital fingerprint数据比从app中获取的digital fingerprint数据量要少,所以从app中获取到的digital fingerprint是无法100%匹配到从浏览器中获取到的digital fingerprint。当打开app时,发现有多个浏览器digital fingerprint与之匹配,可以选择一个最小时间范围内的digital fingerprint作为匹配,但是这个匹配可能不准确。
Configuring Your iOS App for 100% Match ( > iOS 10 only)
Include SafariServices.framework
First off, you'll need to include the SafariServices.framework into your app to leverage this. Currently, as soon as you add the Framework, Branch will start triggering the Safari-based 100% match technique. To add the framework, simply go to your Xcode project:
- Select the right build target
- Select the General tab
- Scroll down to Linked Frameworks and Libraries
- Click the + button
- Add SafariServices.framework
Set the matching domain to app.link
Because our Safari View Controller matching method works based on comparing the cookie Branch set on a click to the cookie set with the View Controller, the domains must be consistent. iOS assumes that you're on the bnc.lt domain, so if you're using app.link domain as your default (most apps), you must specify this domain in your PLIST file.
Please set the branch_app_domain to app.link in your PLIST as shown below:
Need to disable SafariViewController?
Note that this mechanism can be disabled using the following method, which should be called before initSession.
Objective-C|Swift
[[Branch getInstance] disableCookieBasedMatching];
参考文献
[1] LDLink方案设计. 老周
[2] App自动登录