浅析移动应用深度链接 (Deeplinking)
1. 深度链接介绍
App Deeplinking深度链接(Deeplinking)是通过链接启动原生应用的方法。更详细地说是通过映射预定义行为到唯一的链接上,让用户无缝跳转到相关内容页面。
对于支持深度链接功能的移动应用,开发者可以通过调用深度链接打开应用,也可跳转到应用内指定页面,如首页,产品详细页面,购物车页面等,体验效果类似与传统网站。
例如,在网站中跳转到某个详细产品页面需要的链接:
http://www.mobiledeeplinking.org/product/123
在移动应用中在跳转到产品页面需要的链接:
mobiledeeplinking://product/123
深度链接在市场促销的时候特别有效,因为其可以让你或第三方应用通过可以点击的链接打开应用,甚至跳转到指定的产品页面,而不是跳转到网站 或 App Store 和 Google Play。
深度链接2. 链接结构
深度链接类似于传统网页中的超链接,其由又有一些不同的元素组合而成,也就是我们说的统一资源标识符(URI), 链接中应包含调用时跳转到特定页面的所有信息。
在设计深度链接结构时,最佳做法是通过独特的方案名(Scheme) 加 路由参数(路径和查询参数),来代表应用支持的自定义操作, 除非有特殊需求,否则建议使用类如下简单的链接结构:
mobiledeeplinkingdemo://path?query_string
其中 mobiledeeplinking是方案名称(Scheme) ,** path **和 query_string 是路由参数。
关于方案名称:
- 选择方案名称的时候,本质上是针对主应用选择一个独一无二的名称,从而避免和其他应用的冲突。
- 目前还没有权威中心来统一管理方案名称,冲突有时候是不能避免的。
- 最佳策略是方案名称包含应用标记,如mobiletaobao。还有个关于方案选名的建议是颠倒域名后缀,如com.taobao, 不过这种模式不常见。
关于路由参数 (路径和查询参数):
- 路由参数属于可选类型,但强烈推荐使用。 通过路由参数可以跳转到指定页面,也可以传递参数。
- 查询参数也是可选类型,但当需要传递参数的时候是必须的,如产品ID。
- 第三方应用在调用深度连接的可能会传递元数据,要确保应用能够处理这些数据。
- 如果移动应用有对应的网站,建议路由参数的语法和网站的URL结构一致。
3. 链接例子
下面是一些iOS上著名应用的深度链接样例:
twitter://timeline 打开推特应用并跳转到用户时间轴
fb://profile 打开脸书应用并跳转到应用资料页
yelp:// 打开Yelp应用
下面是垂直行业深度链接的例子:
travelbrand:// 打开应用
travelbrand://registration 打开应用并跳转到注册页面
travelbrand://hotel/123 打开应用并跳转到某个酒店ID为123的页面
4. 深度链接的实现
终于到了如何在项目中实现深度链接,其实已经有一些这方面的开源项目,如MobileDeepLinking, DeepLinkKit 和 DeepLinkDispatch . 但我们先来讲讲如何在不使用第三方类库的情况下实现深度链接。
无论是否使用第三方库,都要预先完成以下两点:
- 确定唯一的方案名称,并在项目的配置文件里声明。
- 确定深度链接支持的操作集合,如何定义请参见链接结构部分。
当完成上述两者后,就可以开始思考如何去支持链接中的路由部分(路径和查询参数)。
iOS平台
iOS应用是独立的主体,每个应用只有一个入口: AppDelegate,当要通过深度链接调用当前应用时,都会调用AppDelegate内的方法,同时传递深度链接需要的参数。
由于深度链接事件可能在应用任何时候,任何状态下触发,开发者需要让应用一直保持在稳定的状态。
例如: 用户在应用中任何时候和页面都应能回到首页,这就需要在维护视图层级的前提下,把相应的视图展示给用户。
在应用打开的状态下,需要维系已有的视图状态,并且根据深度链接的路由信息跳转到相应页面。
AppDelegate 的文档参看 这里.
Android 平台
Android 应用由一组活动(Activity)视图组成,每一个活动视图都可以配置成被其他应用调用,这样根据应用和深度链接的结构,可以选择一个或多个中心入口。
和iOS平台一样,Android平台处理深度链接时也需要让应用保持在一直状态,活动视图启动时会放在当前堆栈最上面,开发者需要维护已有视图层次,并为活动视图初始化如加载用户信息提供相应数据 。
关于Android 深度链接相应文档参看这里.
MobileDeepLinking5. MobileDeepLinking 的集成
上述提到了三个关于深度链接的类库MobileDeepLinking, DeepLinkKit 和 DeepLinkDispatch,这里着重介绍下MobileDeepLinking ,该项目支持iOS 和 Android两个平台。
集成MobileDeepLinking大致分三个步骤:
- 创建深度链接的方案名 (如. mobiledeeplinkingproject://)
- 根据应用需要更新MobileDeepLinking库相关的JSON配置文件。
- 更新项目代码,当应用通过深度链接启动时,调用MobileDeepLinking库。
JSON配置文件
Android 和 iOS库的配置文件都是JSON格式, 全名是MobileDeepLinkingConfig.json
.
在配置文件里可以把链接映射到应用内的指定页面,甚至支持自定义方法回调,日志 和校验。
<code>
注意: Android平台上的惯用配置文件是XML格式,iOS平台上的格式是 Plist格式,考虑到跨平台的问题,MobileDeepLinking项目选用JSON作为配置文件格式。这样开发者在跨平台上使用相同格式的配置文件。
</code>
下面是两份JSON配置文件:
**Android JSON 配置文件样例 **
{
"defaultRoute": {
"class": "com.myorg.myapp.DefaultActivity"
},
"routes": {
"reservations": {
"class": "com.myorg.myapp.ReservationFeedActivity"
},
"reservations/:reservationId": {
"class": "com.myorg.myapp.ReservationDetailsActivity"
},
"account/:userId": {
"class": "com.myorg.myapp.AccountActivity"
}
}
}
在上面的例子中,深度链接mobiledeeplinkingproject://reservations/1234会跳转到ReservationDetailsActivity页面,并传递参数reservationId=1234到对于类中。
**iOS JSON 配置文件样例 **
{
"logging": "true", /* 字符串类型 */
"storyboard": {
"iPhone": "MainStoryboard_iPhone",
"iPad": "MainStoryboard_iPad"
},
"defaultRoute": {
"class": "DefaultViewController",
"identifier": "defaultViewController"
},
"routes": {
"sales/:saleId": {
"storyboard": {
"iPhone": "SaleStoryboard_iPhone",
"iPad": "SaleStoryboard_iPad"
},
"class": "SaleViewController",
"identifier": "saleViewController",
"handlers": [
"logAnalytics"
],
"routeParameters": {
"saleId": {
"required": "true",
"regex": "[0-9]"
},
"utmSource": {
}
}
},
"addToCart/:productId": {
"handlers": [
"authenticate",
"logAnalytics",
"addProductToCart"
]
}
}
}
简单分析下上述配置文件的一些参数:
- logging:控制日志是否在控制台打印
- defaultRoute:默认路由,在深度链接匹配不到相应页面将会使用默认路由。
-
routes: 映射路由到指定页面,或指定逻辑模块。
更多参数详细信息和使用文档请移步这里
这里推荐MobileDeepLinking不仅仅在于其具有跨平台属性,更在于其设计思路满足了通过配置文件来灵活适配路由和页面信息,无论添加新的映射关系或者修改已有关系,只需修改JSON配置文件,而不是修改代码,大大降低了不必要的问题发生几率。但是由于其开源代码(iOS 和 Android)在Github上评价较低,且已有三年没有更新,选择务必要慎重。
更多
获取更多内容请关注微信公众号豆志昂扬:
- 直接添加公众号豆志昂扬;
- 微信扫描下图二维码;