• 主页
  • 随笔
  • 技术笔记
  • 全部文章
标签 友链 关于我

  • 主页
  • 随笔
  • 技术笔记
  • 全部文章

深入了解DeepLink

阅读数:次 2022-01-08
字数统计: 2k字   |   阅读时长≈ 7分

在移动前端,deepLink一般指app内部的逻辑处理,可以根据这个deeplink直接跳转到对应的页面或者触发特定的逻辑,deeplink的目的是通过deep link打开app,并且跳转带app内某个页面,前提是该APP在该手机上已安装,且该APP需要编程支持该Deep Link的“schema”语法定义。

一、URL Scheme:Deep Link第一代实现方式

URL Schemes其实就是实现deep linking的第一代解决方案。利用它就可以在移动开发中实现从web页面或者别的app中唤起自己的app的功能,然而开发者们很快就发现,这样也还有很多限制:

Custom URL scheme 是自定义的协议,所以在没有安装 app 的情况下是无法直接打开的。

在app内开启其他app的scheme之前,通过canOpenURL判断是否安装app,来决定是否可以跳转,但是需要先检查这个scheme是否注册了,即在info.plist文件的LSApplication
QueriesScheme中记录要询问的scheme,否则通过canOpenURL得到的结果是false。

因为这个scheme是自己定义的,容易冲突。

例如,自己的名为A的app定义的url scheme为a://,但如果用户手机没有装名为A的app,而装了名为B的app,但是B也定义了a://,那么通过a://打开的app就是B,而不是A,也就是冲突了

因此为了解决以上问题,苹果推出了Universal Link方案,但是,iOS在很长的一段时间内用来实现deep linking以及app间通信的方法就是上面提到的,被叫做custom URL scheme。处理的方法就是:

  • 注册一个URL type,注册的方法就是在app的info.plist文件里添加 CFBundleURLTypes 键,它包含了一个由多个字典组成的数组,每一个字典定义了这个app支持的一个URL scheme,其他app即可通过这个URL scheme打开自己的app。

  • 在application:willFinishLaunchingWithOptions:方法或者application:didFinishLaunchingWithOptions:方法中获取URL的相关信息,并决定是否要打开它,一般客户端会根据自己的业务需求建立白名单,不再白名单内的链接不允许打开。

  • 如果在白名单内,实现app delegate方法:application:openURL:sourceApplication:annotation:(ios 9之前)或者application:openURL:options:(ios9之后) ,获取需要的信息,处理url链接,打开相应页面)。

二、Universal Link(Deep Link第二代实现方式)

一、概述

Universal Link可以让网站或者web view中的内容在用户点击跳转或安装了app之后仍然能够直接在这个app中被找到。比如,用户在官网上点击了“在app中浏览该商品”的链接,这个时候就可以通过Universal Link去唤起这个app,同时直接定位到该商品页面。

二、使用

1.配置App ID支持Associated Domains:

登录https://developer.apple.com/ 苹果开发者中心,找到对应的App ID,在Application Services列表里有Associated Domains一条,把它变为Enabled就可以了。

####2.配置iOS App工程:

工程配置中相应功能:targets->Signing&Capabilites->Capability->Associated Domains,在其中的Domains中填入你想支持的域名,也必须必须以applinks:为前缀。

具体步骤如下图:

3.配置和上传apple-app-association:

究竟哪些的url会被识别为Universal Link,全看这个apple-app-association文件Apple Document UniversalLinks.html

  • 你的域名必须支持Https

  • 域名 根目录 或者 .well-known 目录下放这个文件apple-app-association,不带任何后缀

  • 文件为json保存为文本即可

  • json按着官网要求填写即可

apple-app-site-association模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}

说明:

appID:组成方式是 teamId.yourapp’s bundle identifier。如上面的 9JA89QQLNQ就是teamId。登陆开发者中心,在Account -> Membership里面可以找到Team ID。


>**paths:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。星号的写法代表了可识 别域名下所有链接。**

上传指定文件:上传该文件到你的域名所对应的根目录或者.well-known目录下,这是为了苹果能获取到你上传的文件。上传完后,自己先访问一下,看看是否能够获取到,当你在浏览器中输入这个文件链接后,应该是直接下载apple-app-site-association文件。

4.验证 Universal link 生效:

  • 可以使用iOS自带的备忘录程序,输入链接,长按链接,如果弹出菜单中有”在‘xxx’中打开”,即表示配置生效。

  • 或者将要测试的网址在Safari中打开,在出现的网页上方下滑,可以看到有在”xxx”应用中打开, 出现菜单:

5.在AppDelegate里中实现代理方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
{
NSURL *url = userActivity.webpageURL;
if (url是我们希望处理的)
{
//进行我们的处理
}else{
[[UIApplication sharedApplication] openURL:url];
}
}
return YES;
}

三、优缺点

####(1)优点

  • Universal Links本身也就是一个能够指向一个web页面或者app中的内容页的标准的web link(形如https://example.com) ,当已经安装了这个app的时候,不需要加载任何web页面,app就会立即启动;当这个app没有安装的时候,就会默认地从当前浏览器中重定向到App Store中引导用户去下载安装这个app。而且,Universal links支持从其他app中的UIWebView中跳转到目标app

  • Universal links是从服务器上查询是哪个app需要被打开,因此不存在Custom URL scheme那样名字被抢占、冲突的情况。

  • 安全性,用universl link去打开的时候,只有你(开发这个app的人)可以通过创建和上传一个允许这个网页去通过这个URL去打开你的app的文件。

  • 隐私性,提供Universal link给别的app进行app间的交流,然而对方并不能够用这个方法去检测你的app是否被安装。(之前的custom scheme URL的canOpenURL方法可以)

####(2)缺点

  • 如果用户手机上没有安裝 APP,那么使用ULink只能打开网页,而不能引导用户前往 App Store 下载。所以有些网页处理方案是在载入的時候,會运行一段 javascript ,然后通过timer 计时,如果在特定时间內无法开启 App,就前往 App Store 下载。

三、 deferred Deep Linking 延迟深度链接

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

  • 本文作者: Grx
  • 本文链接: https://ruixiaoguo.github.io/Grx.github.io/Grx.github.io/2022/01/08/深入了解DeepLink/
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
  • OC

扫一扫,分享到微信

创建属于自己的私有库(码云)以及提交到cocoapods
iOS广告归因历史演变
  1. 1. 一、URL Scheme:Deep Link第一代实现方式
    1. 1.0.1. URL Schemes其实就是实现deep linking的第一代解决方案。利用它就可以在移动开发中实现从web页面或者别的app中唤起自己的app的功能,然而开发者们很快就发现,这样也还有很多限制:
  • 2. 二、Universal Link(Deep Link第二代实现方式)
    1. 2.1. 一、概述
    2. 2.2. 二、使用
      1. 2.2.1. 1.配置App ID支持Associated Domains:
      2. 2.2.2. 3.配置和上传apple-app-association:
      3. 2.2.3. 说明:
      4. 2.2.4. 4.验证 Universal link 生效:
      5. 2.2.5. 5.在AppDelegate里中实现代理方法:
    3. 2.3. 三、优缺点
  • 3. 三、 deferred Deep Linking 延迟深度链接
  • © 2014-2024 Grx
    GitHub:hexo-theme-yilia-plus by Litten
    本站总访问量次 | 本站访客数人
    • 标签
    • 友链
    • 关于我

    tag:

    • life
    • OC
    • Google
    • Fastlane
    • Flutter
    • hexo
    • 智能家居
    • Apple Watch
    • 逆向
    • Lottie
    • PHP
    • cocos2d
    • Mac
    • MonkeyKing
    • RN
    • Swift
    • RAC
    • WKWebView
    • WebView
    • Xcode
    • xcode
    • ios
    • Android
    • appledoc
    • MMKV
    • LLVM
    • FreamWork






      
      

    • 唐巧的博客
    • 王巍(喵神)OneVsDen
    • 阿里“念纪“
    • 滴滴-戴铭
    • 郭曜源(ibireme)
    • 阿里”南栀倾寒“
    • 蘑菇街李忠
    • 码农人生
    • 玉令天下
    • bang
    • Ian的博客
    这里是Grx的个人博客:
    iOS开发工程师一枚
    联系方式:
    QQ:1217255509
    Email:grx0917@sina.com
    知识管理,时间管理,自我管理,架构即未来
    欢迎技术交流!