Universal Link & Deep Link【基础类】

什么是Deep Link

“Deep Link”从字面上理解是“深度链接”,因为移动端的媒体内容页面都是在APP中打开的,最早推出“Deep Link”的主要意图是,为了能让搜索引擎能检索APP中的内文页内容,并在用户检索到内容时,可通过简单点击一个“链接”直接打开该APP的内文页。简单讲就是,可以通过一个简单的“链接”,打开APP并直接进入该APP中的内文页,前提是该APP在该手机上已安装,且该APP需要编程支持该Deep Link的“schema”语法定义。例如:大家可复制如下的淘宝商品及淘宝店铺页的Deep Link链接,在手机浏览器中打开,便可直接进入淘宝APP中的商品页及店铺页:

taobao://item.taobao.com/item.ht

taobao://shop.m.taobao.com/shop/

可见在移动端广告投放中采用Deep Link技术,省去了用户打开APP、再搜索商品页的中间环节,让用户只需便捷地点击广告,一键就能到达商品购买页面。省去中间多次跳转的环节,减少用户流失,有效提升转化。(当然该APP需要开发改造,编程支持Deep Link。)

APP没安装怎么办?

当然大家会问,若当时手机上没有安装这个APP会发生什么情况呢?在移动端广告投放中,可以采用加一个Mobile Web中间页的方式。在该中间页上安置JS代码来判断(通过Deep Link尝试调用手机APP),若手机上APP没有安装,则跳转到APP下载页面引导用户安装。若APP已安装则打开APP进入内容页。这样通过Deep Link也能有效地唤醒沉睡用户(那些已安装APP但还未持续产生转化的用户。)。

现在也有很多APP服务提供方,不论用户是否已安装APP,为了让用户能更容易的通过各种方式(Mobile Web、APP)触达到产品服务,会对应APP做一套简化版的Mobile Web的服务。由于URL使用的是普通的网站URL,相比Deep Link更容易传播,及被各种网站内容中引用,及被搜索引擎收录。例如,大家可复制如下的淘宝商品页的普通URL,在手机浏览器中打开,便可直接进入淘宝中的商品页(该页面中也有一些JS代码,会判断手机上是否已安装APP,若已安装,会提示用户是否打开淘宝APP):item.taobao.com/item.ht


Universal Link

上面已讲到:很多APP服务提供方已经在提供普通网站URL方式作为中间也载体,便于传播和使用。这也就引出了一个新的规范:Universal Link(通用链接)。在iOS9以前,我们从外部启动App都是通过(Deep Link)一个特殊的URL Scheme实现跳转的。这种方式弊端很明显:我们只能通过scheme://example这种格式的链接来实现跳转,而且现在苹果还对这种方式的跳转加了一个提示框:“是否打开XXX”。对于Web和原生App交互的场景需求量很大的产品来说,这样的跳转方式显然是步骤繁杂的,用户体验并不好。

当然需要强调一下为了保证用户网络安全,该“通用链接”必须是HTTPS协议的。

在APP中添加这个功能很简单,相关参考文档可参考官方文档(点击文末“阅读原文”可直接打开):

developer.apple.com/lib

大体的步骤是:

1) 在苹果开发者网站中,打开需要使用Universal Link功能的App中的Associated Domains

  • 首先,我们要在苹果开发者网站中开启App的Associated Domains功能:在Account -> Certificates, Identifiers & Profiles -> App IDs -> YourApp -> Edit中把Associated Domains设置为Enable

  • 然后需要配置一下工程文件,找到Capabilities -> Associated Domains

  • 打开此功能并把“通用链接”的domain加进去,格式为applinks:http://www.example.com/

2) 将 “apple-app-site-association”(一个json文件)上传到服务器中根目录下(因为是HTTPS,所以服务器必须支持SSL;文件名“apple-app-site-association”不可添加任何后缀。),如:https://www.example.com/apple-app-association ,json内容示例如下:

{

"applinks": {

"apps": [],

"details": [

{

"appID": "TeamID.com.domain.App",

"paths":[ "*" ]

}

]

}

}


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


3) 在AppDelegate中实现相应的方法,

示例代码如下:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{

if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {

return YES;

}

//读取url地址

NSURL *webUrl = userActivity.webpageURL;

if (![webUrl.path isEqualToString:@"/show"]) {

//path错误,直接从safari打开

[[UIApplication sharedApplication] openURL:webUrl];

return YES;

}

//跳转并显示内容

[[NSNotificationCenter defaultCenter] postNotificationName:@"notify" object:@"hello world"];

return YES;

}


(转载请注明出处:微信订阅号:ad_automation)


文字表现力有限,欢迎参加《3.25线下大课堂》面对面为您答疑解惑讲透您关心的问题。

编辑于 2017-11-08

文章被以下专栏收录

    分享程序化广告实战系列基础知识及经验,让更多入门同学更熟练运用程序化,推动程序化行业更加繁荣。让大家尽量少走弯路、少踩坑