浅析移动应用深度链接 (Deeplinking)

1. 深度链接介绍

《浅析移动应用深度链接 (Deeplinking)》 App Deeplinking

深度链接(Deeplinking)是通过链接启动原生应用的方法。更详细地说是通过映射预定义行为到唯一的链接上,让用户无缝跳转到相关内容页面。

对于支持深度链接功能的移动应用,开发者可以通过调用深度链接打开应用,也可跳转到应用内指定页面,如首页,产品详细页面,购物车页面等,体验效果类似与传统网站。

例如,在网站中跳转到某个详细产品页面需要的链接:

http://www.mobiledeeplinking.org/product/123

在移动应用中在跳转到产品页面需要的链接:

mobiledeeplinking://product/123

深度链接在市场促销的时候特别有效,因为其可以让你或第三方应用通过可以点击的链接打开应用,甚至跳转到指定的产品页面,而不是跳转到网站 或 App Store 和 Google Play。

《浅析移动应用深度链接 (Deeplinking)》 深度链接

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, DeepLinkKitDeepLinkDispatch . 但我们先来讲讲如何在不使用第三方类库的情况下实现深度链接。

无论是否使用第三方库,都要预先完成以下两点:

  1. 确定唯一的方案名称,并在项目的配置文件里声明。
  2. 确定深度链接支持的操作集合,如何定义请参见链接结构部分。

当完成上述两者后,就可以开始思考如何去支持链接中的路由部分(路径和查询参数)。

iOS平台

iOS应用是独立的主体,每个应用只有一个入口: AppDelegate,当要通过深度链接调用当前应用时,都会调用AppDelegate内的方法,同时传递深度链接需要的参数。

由于深度链接事件可能在应用任何时候,任何状态下触发,开发者需要让应用一直保持在稳定的状态。

例如: 用户在应用中任何时候和页面都应能回到首页,这就需要在维护视图层级的前提下,把相应的视图展示给用户。

在应用打开的状态下,需要维系已有的视图状态,并且根据深度链接的路由信息跳转到相应页面。
AppDelegate 的文档参看 这里.

Android 平台

Android 应用由一组活动(Activity)视图组成,每一个活动视图都可以配置成被其他应用调用,这样根据应用和深度链接的结构,可以选择一个或多个中心入口。

和iOS平台一样,Android平台处理深度链接时也需要让应用保持在一直状态,活动视图启动时会放在当前堆栈最上面,开发者需要维护已有视图层次,并为活动视图初始化如加载用户信息提供相应数据 。

关于Android 深度链接相应文档参看这里.

《浅析移动应用深度链接 (Deeplinking)》 MobileDeepLinking

5. MobileDeepLinking 的集成

上述提到了三个关于深度链接的类库MobileDeepLinking, DeepLinkKitDeepLinkDispatch,这里着重介绍下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配置文件,而不是修改代码,大大降低了不必要的问题发生几率。但是由于其开源代码(iOSAndroid)在Github上评价较低,且已有三年没有更新,选择务必要慎重。

更多

获取更多内容请关注微信公众号豆志昂扬:

  • 直接添加公众号豆志昂扬
  • 微信扫描下图二维码;

《浅析移动应用深度链接 (Deeplinking)》

    原文作者:豆志昂扬
    原文地址: https://www.jianshu.com/p/117a2cd510a6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞