极光小课堂 | iOS 深度跳转——scheme 与 universal link)

  一、前  言  

首先,我们来聊一下深度跳转时,有哪些方面可以运用。

点击 wap 页面按钮,唤起对应 APP,并且跳转到了相对应的目标页面。比如:微信里浏览商品,点击打开 APP,会自动唤起手机里的对应 APP,并且会进入到你刚才浏览的商品详情页,这就是比较直观的:深度跳转。

上面的这种情况我们称之为:一键直达(或者一链拉起等,你怎么称呼开心就好)

如果,手机没有安装京东 APP,是会先去下载页面,待用户下载完后,点击打开APP依然会跳转到刚才浏览的商品页面,这种情况,我们可以称之为:场景还原。

还要一些代码层面的应用也属于深度跳转的业务,比如:销售推广 APP,用户点击了销售推广的 APP 下载链接,然后公司需要统计每个销售推广的量。

这种就属于深度跳转与统计相关的一些内容了,如果公司产品使用了深度跳转,那必然会有些数据的统计。

对于 【一键直达】,我们可以用 iOS 里的最简单 scheme 实现,也可以使用 universal link 来实现,不过 universal link 稍微有些烦人的操作(特别是对于第一次使用的,很多坑等着你们),而且 universal link 还得要前端配合。

对于 【场景还原】,我们就要和前端、后台配合开发,并且要定义各种逻辑、协议,客户端、前端、后台都需要有比较大的工作量。

对于不想踩坑、没那么多人力的可以选择一些比较靠谱的公司的 SDK,比如:极光魔链,还可以与极光的 JPush 、JMessage 配合使用。

下篇文章为大家讲解如何使用极光魔链,以及极光魔链的一些高级使用方法。

这篇我们先来了解下 scheme 和 universal link。

二、Scheme VS Universal Lin

Deeplink 相关的技术,在 wap 中唤起 app 其实应用最广泛的并不是 Universal Link,而是直接 Schema 跳转。

并且一般各大 APP 都会给自己做一套路由体系,这样其实可以直接在 schema 后面对接路由体系,做到一行 schema 定位打开任意 App 内功能界面(我就不详细扯路由的事了)

如果单纯为了实现 deeplink 在 WAP 上打开 App,并且传递来数据信息,定位 App 内的具体逻辑,那么 Schema 就够了,其实没必要上 Universal Link。

Schema 相当于是很特殊的 Url,他是 schema://xxx 这种样子,安装了 APP 才能支撑跳转这种 Schema Url;如果没安装 APP 就没任何效果,而 Universal Link 则是把普通 Url,长 http://xxx.xxx.xxx/xxx 这样的 Normal Url;

如果安装了 App,就能像 Schema 一样传递给 App,延续 App 内逻辑,如果没装 App,则还会继续在浏览器里跳转这个 Normal Url。

2.1

Schema 无法判断是否安装 App

一定会有这样的产品需求的:

  • 如果已经安装App,则打开App

  • 如果没有安装App,则前往下载App

浏览器实际上是没有能力判断手机里是否安装了某个App的,所以聪明的程序员们选择了讨巧的方法:

  • 首先发起跳转Schema

    • 如果没安装App,会打开App失败,没效果

    • 如果安装App,会成功打开App

  • 延迟1000ms

    • 如果没安装App,Schema打开失败,等1000秒后会自动跳转

    • 如果安装App,App会打开,当前网页会被暂停,这延迟代码不会执行

聪明的人会发现,这样有个风险,如果用户打开 APP 成功后,又手动切回浏览器,那么延迟1000ms 的代码依然会执行。

安卓会跳出下载 apk 包的提示,iOS 会再度跳到 Appstore,但这个瑕疵也不是太大的问题,所以这种做法被普遍采用,运用在各种安装就跳转,不安装就下载的用户场景。

坑货来了:安卓这么用挺好,iOS 有个讨厌的弹框。如果用户没有安装 App,那么他一定会经历2个事情:

  • schema 打开 app,但是失败

  • 延迟后,跳转下载 App

在第一个环节,安卓上 schema 打开失败,没有任何反映,也没有任何提示,一切顺利,但是 iOS 就不同了。

schema 会弹个可恶的跳转失败的框:

然后再延迟后弹跳转 App Store 的框:


2.2

Schema 被很多 App 禁止

Schema 被广泛使用,从浏览器中唤起打开专门的 App,但这并不被很多 App 认可,比如微信手机百度,他们本身除了浏览网页以外有其他的使用场景,所以站在微信/手百的角度,并不希望用户为了看一些分享和内容就跳出微信/手百的 App,于是这些客户端拦截了 Schema,使得所有 Schema 都无法生效。

于是不得已,广大开发者只好针对微信/手百,等特殊UA信息,展现出蒙层,引导用户用系统/外部浏览器打开:

2.3
2.3

Universal Link 解决 Schema 的弊端

文章前面就说了,如果你单纯为了能让 wap 打开 App,Schema 就能做到了,Universal Link 的意义则是把普通 url,也赋予了能打开 App 的能力,而不必编写专门的 Schema Url 去唤起 App。

Schema 的2个弊端确实能通过 Universal Link 解决,不同于 Schema,在没装 App 的时候,Universal Link 他也是一个合法的 url 链接,浏览器可以正常跳转,因此不会出现在 iOS 上讨人厌的框。

Universal Link 目前还没有基于 iOS的UI/WKWebView 的应用进行拦截,所以目前看还是能突破微信/手百的封锁。(以后,不好说啊~)

三、Universal Link 开发

3.1

配置 apple-app-association

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

  • 你的域名必须支持 Https

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

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

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

怎么写 json 其实没啥可教的,满世界的文章都教你咋写了,我们看个例子,点下面的链接,你的浏览器就会自动把知乎的apple-app-association的 json file 给 down 下来。

链接:https://oia.zhihu.com/apple-app-site-association


大家自己去格式化一下这个 json 内容,先只看applinks对应的内容,其他内容这里先不讲解。

划重点:

有心人可能看到,知乎的 Universal Link 配置的是 oia.zhihu.com 这个域名,并且 path 配置的是,域名下所有路径都进行识别。

也就是说,知乎的 universal link,只有当你访问:https://oia.zhihu.com/xxxx,在移动端会触发  Universal Link,而知乎正经的 Urlhttps//www.zhihu.com/xxx,是不会触发 Universal Link 的,知乎为什么制作,为什么不把他的主域名配置 Universal Link,这是由于 Universal Link 的一个大坑所致(文章后面具体介绍这个坑)。

PS:

apple-app-association 你可以看完全了知乎的 json file,会发现里面也不止是 universal link。

苹果的一些其他功能都和 apple-app-association 有关,都需要配置这个文件,增加更多 json 字段信息。

比如 Hand off 还有一些跨 Web&App 的分享。

测试是否正确:

苹果官方提供了一个网站来测试你配置的域名 apple-app-association是否正常 work。

链接:https://search.developer.apple.com/appsearch-validation-tool/

这个网站有点XX,就是你用他测试不通过,其实 Universal Link也可能不生效的,比如我把知乎的oia.zhihu.com输入进去,他就没感应到,认为没有。我搜索的时候,发现也有人发现了这个问题,反正可以当个参考。


而且,好像第一次上传 apple-app-association 到域名根目录时,好像要48小时后才能正常使用,这个不知道大家是否遇到过?

3.2

配置 iOS App 工程

我想略过这部分,很简单,很多教程·····

还是简单说一下吧。

  • 开发者中心证书打开Associated Domains

  • 工程配置Associated Domains

  • 将你apple-app-association所在域名配置进去

  • 给你的工程像Schema的OpenUrl一样,编写App被唤醒后的处理逻辑

3.3

Universal Link 的基本运作流程

  • APP第一次启动 or APP 更新版本后第一次启动

  • APP向工程里配置的域名发起 Get 请求拉取 apple-app-association Json File

  • APP将 apple-app-association 注册给系统

  • 由任意 webview 发起跳转的 url,如果命中了 apple-app-association 注册过的通用链

  • 打开 App,触发 Universal Link delegate

  • 没命中,webview 继续跳转 url

在你进行apple-app-association 以及 App 工程的配置之后,整个 Universal Link 的运作流程完全由系统控制了。

四、Universal Link 采坑

整个Universal Link 开发其实非常简单,没几行代码就开发完成,完全写不了几行代码,就差不多搞定了,但是,但是,但是,还真是踩了几个坑····悲伤~

4.1

跨域

这个坑是坑我最惨的:

前端开发经常面临跨域问题,Universal Link 也有跨域问题,但不一样的是,Universal Link,必须要求跨域,如果不跨域,就不行,就失效,就不工作。(iOS 9.2之后的改动,苹果就这么规定这么设计的)

这也是上面拿知乎举例子的时候重点强调的一个问题,知乎为什么使用oia.zhihu.com做 Universal Link?

  • 假如当前网页的域名是 A

  • 当前网页发起跳转的域名是 B

  • 必须要求 B 和 A 是不同域名,才会触发 Universal Link

  • 如果B 和 A 是相同域名,只会继续在当前 WebView 里面进行跳转,哪怕你的 Universal Link 一切正常,根本不会打开 App

我直接拿知乎举例子看:

https://www.zhihu.com/oauth/redirect/social
知乎的一般网页 URL 都是www.zhihu.com域名,你在微信朋友圈看到了知乎的问题分享,如果 copy url 你就能看到这样的链接:

微信里其实是屏蔽 Schema 的,但是你依然能看到大大的一个按钮App内打开,这确实就是通过 Universal Link 来实现的,但如果知乎把 Universal Link 配在了www.zhihu.com域名,那么即便已经安装了App,Universal Link 也是不会生效的。

一般的公司都会有自己的主域名,比如知乎的www.zhihu.com,在各处分享传播的时候,也都是直接分享基于主域名的 url,但为了解决苹果强制要求跨域才生效的问题,Universal Link 就不能配置在主域名下,于是知乎才会准备一个oia.zhihu.com域名,专为 Universal Link 使用,不会跟任何主动传播分享的域名撞车,从而在任何活动WAP页面里,都能顺利让 Universal Link 生效。

简单总结一句话:

  • 只有当前 webview 的 url 域名,与跳转目标 url 域名不一致时,Universal Link 才生效

4.2

apple-app-association 文件覆盖

我们业务机房的集群是大部门下几条业务线共用的,有一整套云服务系统来进行机房集群的管理,有统一的接入层进行分发。虽然是不同的产品线,不同的服务,但是共享分布式的机房进行运作的。

很多Universal Link的教学文章是这么写的:

  • 将 json 命名为 apple-app-association 不要乱改名

  • 将 file 上传到域名所在的服务器根目录下

于是我就将我们文库的 apple-app-association,上传到我准备的 wenkuUniversal 域名的所在机器的根目录下。(因为机房都是分布式的,所以其实就是 upload 的全部门下的很多机器上)

同部门另一个产品线阅读后来也开始尝试 Universal Link,也要把他们写好的 apple-app-association 上传到他们的 yueduUniversal 域名所在的机器的根目录下。

因为都是同样的文件名,又因为整个事业部机器实际上是共用的,因此就发生了覆盖。

解决办法:共用同一个 apple-app-association

因为 apple-app-association 的具体内容里有 App 的 Bundle ID在,因此可以简单的把2个 json file 进行 merge,你的 App bundle 生效你的 link,我的 App bundle 生效我的 link。

但其实并不推荐,毕竟双方都要小心在更新的时候,不能覆盖对方,并且这样做也很不合理,apple-app-association 也不止为 universal link 一个 feature 工作,当面临跨 app / web share 甚至 hand off 的时候,共用一个 json file 还是有坑。

  • 接入层分发不同 json file

2个产品线的 link 域名其实是不一样的,只不过恰巧这两个域名最重达到的机器是同一个或者说有重叠,因此产生了覆盖,完全可以将 json 文件保存成各自的名字,在接入层对域名进行分发。

最终 App 也是通过 Get 请求去拉取 apple-app-association 的,只要 Get 到,并且 ssl 安全性上符合要求(强制 https)就没问题。

隐藏的坑:apple-app-association 被覆盖后如何更新。我们线上已经 work的 Universal Link 功能,突然有一天发现坏了,查了一圈最后查到被阅读覆盖了,那就修复呗,修复倒是没问题,问题在于修复后的 universal link,用户必须重新安装一次 app,才能重新 work,这个太坑了啊。

所以关键是需要掌握 apple-app-association 的更新时机,反复重新杀 APP 重开完全没用,删了 APP 重装确实有用,但不可能让用户这么去做。其实,每次 App 安装后的第一次 Launch,会拉取 apple-app-association,除此之外在 Appstore 每次 App 的版本更新后的第一次 Launch,也会拉取 apple-app-association。

也就是说,一旦不小心因为意外 apple-app-association,想要挽回又让那部分用户无感,App 再发一个版本就好了。

4.3

Universal Link 会因为用户行为而失效

Universal Link 触发后打开 App,这时候 App 的状态栏右上角会有文字提示来自某某App,可以点状态栏的文字快速返回原来的 App。

如果用户点了返回微信,就会被苹果记住,认为用户并不需要跳出原 App 打开新 App,因此这个 App 的 Universal Link会 被关闭,再也无效。

想要开启也不是不行,让用户重新用 safari 打开,universal link 的页面,然后会出现很像苹果 smart bar 的东西,那个东西点了后就能打开(我是看到的别人写的,我没亲自操作过)

为了统一 WAP&APP,为了通用链接的效果。

我刚才提到,我们选择的 Universal Link 的域名其实是一个没有实际页面的域名,也就是说https://xxx.xxx.xxx/*这个 url,如果没安装 APP 因此触发 WebView 继续跳转原地址,会直接404。处理很简单,重定向一下。

最简单的就是把这个地址重定向到下载地址,打不开就直接到下载页面了。

  五、总   结  

Scheme 的弊端,以及 universal link 的使用和遇到的一些坑,都简单介绍介绍了。其实,深度跳转的运用不仅仅是这么简单,不仅仅是用于唤起 APP 这么单一的。

深度跳转可以做很多更为丰富的功能,比如文章开篇说的链直达场景还原等。

关于极光

极光(Aurora Mobile,纳斯达克股票代码:JG)成立于2011年,是中国领先的开发者服务提供商。极光专注于为移动应用开发者提供稳定高效的消息推送、即时通讯、统计分析、极光分享、短信、一键认证、深度链接等开发者服务。截止到2019年12月份,极光已经为超过50万移动开发者和145.2万款移动应用提供服务,其开发工具包(SDK)安装量累计336亿,月度独立活跃设备13.6亿部。同时,极光持续赋能开发者和传统行业客户,推出精准营销、金融风控、市场洞察、商业地理服务产品,致力于为社会和各行各业提高运营效率,优化决策制定。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值