什么是应用宝统一链接服务器,applink

从同构的角度和降级支持的角度来看,使用Android和iOS系统增强的AppLinks和Universal Links,通过HTTPS统一标准打开APP是标准的选择。

使用自定义Scheme打开APP适用于:

网站尚不支持HTTPS;

App的iOS版本尚未添加Universal Links支持;

APP的Android版本尚未添加AppLinks支持,同时需要支持Android 6.0以下版本。

使用自定义Scheme打开App的难点在于浏览器的兼容性问题和alert弹窗的提示干扰问题。

在iOS和Android中可以用location.href请求自定义Scheme可以打开App,用iframe只能在Android中打开,在iOS中无法打开。故下面的实现用location.href请求的方案。

在DEEP-LINK.JS基础上修改为applink,放在团队代码库下。

将原来DeepLink的方案扩展为AppLink,使其兼容常见下载的需求。

基本思路

自动跳转链接赋值给href属性作为下载的默认值;

将AppStore地址、Android下载包地址、应用宝推广链接和应用deeplink地址赋值给自定义属性供程序使用;

将下载链接进行优化,避免302跳转带来的性能损失;

监听a链接点击事件,当存在deeplink时,尝试打开App,打开失败后进行下载或AppStore跳转(微信内部跳转到应用宝);

visibility发生变化后,取消备用方案执行。

核心代码

href="download-link" // 服务器端设置的根据UA判断的自动跳转链接,包含下面4中情况

data-href-android="android-download-link" // Android包下载地址

data-href-ios="itunes-link" // itunes地址

data-href-qq-android="myapp-link" // 应用宝推广地址

data-href-qq-ios="myapp-link" // 应用宝推广地址

data-deeplink="deep-link" // 跳转App地址

>立即打开复制代码

// 下载链接优化代码

// 根据agent取指定的值进行优化赋值

function optimize(anchor) {

if (!anchor) {

return;

}

var href = anchor.getAttribute('data-href-' + agent);

if (!href) {

return;

}

anchor.href = href;

}复制代码

// 尝试打开App代码

// App打开之后,浏览器转入后台运行,计时器会暂停,根据这个时间差判断是否打开了App

// 如果App打开失败,则执行后备方案,跳转到href地址进行App下载活安装

document.body.addEventListener('click', function (e) {

// Hijack click event

var target = e.target,

deeplink = target.getAttribute('data-deeplink'),

start;

if (target.tagName.toLowerCase() !== 'a' || !deeplink || clicked || timeout) {

return;

}

e.preventDefault();

e.stopImmediatePropagation();

// Store start time

start = Date.now();

clicked = true;

// Timeout to detect if the link worked

timeout = setTimeout(function () {

// Check if any of the values are unset

if (!clicked || !timeout) {

return;

}

// Reset things

clicked = false;

timeout = null;

// Has the user left the screen? ABORT!

if (Date.now() - start >= delay * 2) {

return;

}

open(target.href);

}, delay);

// Go to app

open(deeplink);

}, false);复制代码

// 取消备用代码执行

// 当浏览器窗口发生visibility变化时,App应该被调起过

function handleVisibilityChange() {

// Triggered on blur

if (!clicked || !timeout) {

return;

}

// Reset everything

clearInterval(timeout);

timeout = null;

clicked = false;

}

document.addEventListener(visibilityChange, handleVisibilityChange, false);复制代码

测试结果

任何技术方案和要交付的工作,必须做足够多的测试,因为我们要为自己的产出负责,要为下游的测试同事负责——而且自我再多的测试也是不足够充分的,总有一些小漏洞在暗处等着你我,出现问题解决问题这是我们的态度。

已安装启动测试结果

系统版本\浏览器

系统浏览器

UC浏览器

百度浏览器

QQ浏览器

猎豹浏览器

iOS 8.4.1

直接启动

ActionSheet确认打开AppStore,返回后触发ActionSheet确认打开AppStore

直接启动

直接启动,返回后打开应用宝App页面

直接启动,返回后浏览器内部打开AppStore

iOS 9.3.5

弹窗确认

直接启动

直接启动

直接启动,返回后打开应用宝App页面

直接启动

iOS 10.1.1

弹窗确认

ActionSheet确认

直接启动

直接启动,返回后打开应用宝App页面

直接启动,返回后浏览器内部打开AppStore

Z2 Android 4.4.2

直接启动

ActionSheet确认,返回后触发下载

无法启动,触发下载

弹窗确认,返回后触发下载

弹窗确认

MX5 Android 5.0.1

直接启动,触发下载

直接启动,触发下载

无法启动,触发下载

弹窗确认,返回后触发下载

弹窗确认

X6 Android 5.0.2

ActionSheet确认,返回后触发下载

ActionSheet确认,返回后触发下载

无法启动,触发下载

弹窗确认,返回后触发下载

弹窗确认,返回后触发下载

T2 Android 5.1.1

直接启动

ActionSheet确认

无法启动,触发下载

弹窗确认,返回后触发下载

直接启动

Mi5 Android 6.0.1

直接启动

ActionSheet确认,返回后触发下载

无法启动,触发下载

弹窗确认,返回后触发下载

弹窗确认,返回后触发下载

6P Android 7.0.0

直接启动

ActionSheet确认,返回后触发下载

无法启动,触发下载

弹窗确认

弹窗确认,返回后触发下载

未安装下载测试结果

系统版本\浏览器

系统浏览器

UC浏览器

百度浏览器

QQ浏览器

猎豹浏览器

iOS 8.4.1

先显示链接错误弹窗,再AppStore打开确认

先显示链接错误弹窗,之后ActionSheet提醒打开AppStore

直接打开AppStore

打开应用宝App页面

提示应用未安装之后在浏览器内部打开AppStore

iOS 9.3.5

先显示链接错误弹窗,再AppStore打开确认

ActionSheet提醒打开AppStore

直接打开AppStore

打开应用宝App页面

提示应用未安装之后打开AppStore

iOS 10.1.1

先显示链接错误弹窗,再AppStore打开确认

直接打开AppStore

直接打开AppStore

打开应用宝App页面

浏览器内部打开AppStore

Z2 Android 4.4.2

打开自定义scheme页面

ActionSheet提示打开App,关闭ActionSheet后开始下载

直接下载

直接下载

直接下载

MX5 Android 5.0.1

直接下载

直接下载

直接下载

直接下载

直接下载

X6 Android 5.0.2

直接下载

ActionSheet提示打开App,关闭ActionSheet后开始下载

直接下载

直接下载

直接下载

T2 Android 5.1.1

直接下载

直接下载

直接下载

直接下载

直接下载

Mi5 Android 6.0.1

直接下载

ActionSheet提示打开App,关闭ActionSheet后开始下载

直接下载

直接下载

直接下载

6P Android 7.0.0

选择下载器下载

ActionSheet提示打开App,关闭ActionSheet后开始下载

直接下载

直接下载

直接下载

参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Flutter上优雅地序列化一个对象

序列化一个对象才是正经事 对象的序列化和反序列化是我们日常编码中一个非常基础的需求,尤其是对一个对象的json encode/decode操作。每一个平台都会有相关的库来帮助开发者方便得进行这两个操作,比如Java平台上赫赫有名的GSON,阿里巴巴开源…

腾讯汤道生:2020年加大投入产业互联网生态建设

新一轮产业革命正在不断深化,为全球经济发展提供了历史性机遇。如何通过数字化、智能化等手段打通产业链不同环节,优化产业效率,实现产业协同,加速产业转型升级? “与合作伙伴‘共创’是产业互联网发展最重要的路径&am…

定时器new Timer().schedule()的使用

文章目录一、基础知识1. 简介2. 常用API二、需求案例2.1. 案例12.2. 案例22.3. 案例3三、场景案例3.1. 在特定时间执行任务,只执行一次3.2. 指定第一次执行的时间,然后按照间隔时间,重复执行在开发中,我们经常需要一些周期性的操作…

优酷IPv6改造纪实:视频行业首家拥抱下一代网络技术

阿里妹导读:2018年双11前,优酷开启了IPV6的大门。9月份PC端业务开启灰度,迎来首位IPV6 VIP用户后,优酷移动客户端也马不停蹄地加入灰度大军。从0到1,花了几个月;从10到1000,花了几天&#xff1b…

服务器上的文件怎么取名,给新的服务器取名你会取神马?

亲爱的谕霸们:本周话题 emmmm.....又一次想话题想到脑壳痛,忽然想到,要不然大家也来想一个,于是乎就是......噢对了,看到论坛的宝宝们都晒出来2018年新年历了,怎么能少了APP的宝宝们?&#xff1…

NVIDIA发布全新推理软件,开创交互式会话AI新时代!

近日, NVIDIA发布了一款突破性的推理软件。借助于该软件,全球各地的开发者都可以实现会话式AI应用,大幅减少推理延迟。而此前,巨大的推理延迟一直都是实现真正交互式互动的一大阻碍。 NVIDIA TensorRT™ 7作为NVIDIA第七代推理软件…

可应用于实际的14个NLP突破性研究成果(二)

论文摘要 尽管最近在训练高质量的句子嵌入上做出了很多的努力,但是大家仍然对它们所捕捉的内容缺乏了解。基于句子分类的‘Downstream’tasks通常用于评估句子表示的质量。然而任务的复杂性使得它很难推断出句子表示中出现了什么样的信息。在本文将介绍10个probing…

IDEA JDK1.8 ProGuard 混淆Maven项目代码

直接复制到pom中即可使用 <build><plugins><plugin><groupId>com.github.wvengen</groupId><artifactId>proguard-maven-plugin</artifactId><!-- <version>2.0.14</version>--><version>2.1.1</version…

可应用于实际的14个NLP突破性研究成果(三)

论文摘要 当前最先进的语义角色标记&#xff08;SRL&#xff09;使用深度神经网络&#xff0c;但没有明确的语言特征。之前的工作表明&#xff0c;抽象语法树可以显著改善SRL&#xff0c;从而提高模型准确性。在这项研究中&#xff0c;我们提出了语言学的自我关注&#xff08;…

服务器cpu虚拟插槽,服务器更换cpu插槽

服务器更换cpu插槽 内容精选换一换弹性云服务器创建成功后&#xff0c;您可以根据需求&#xff0c;修改云服务器的名称。系统支持批量修改多台弹性云服务器的名称&#xff0c;修改完成后&#xff0c;这些弹性云服务器的名称相同。登录管理控制台。单击管理控制台左上角的&#…

云+X案例展 | 民生类:贝斯平云助力500强跨国企数字化转型

本案例由贝斯平云投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。在全球化的科技进步和…

json处理最外层引号

String substring jsonMsg.substring(1, jsonMsg.length() - 1); String replace substring.replace("\\", "");

基于Alluxio系统的Spark DataFrame高效存储管理技术

介绍 越来越多的公司和组织开始将Alluxio和Spark一起部署从而简化数据管理&#xff0c;提升数据访问性能。Qunar最近将Alluxio部署在他们的生产环境中&#xff0c;从而将Spark streaming作业的平均性能提升了15倍&#xff0c;峰值甚至达到300倍左右。在未使用Alluxio之前&#…

Arthas实践--获取到Spring Context,然后为所欲为

背景 Arthas 是Alibaba开源的Java诊断工具&#xff0c;深受开发者喜爱。 https://github.com/alibaba/arthas Arthas提供了非常丰富的关于调用拦截的命令&#xff0c;比如 trace/watch/monitor/tt 。但是很多时候我们在排查问题时&#xff0c;需要更多的线索&#xff0c;并不…

$.ajax modal,使用bootstrap modal.load()加载的js,第二次modal显示的时候,js不生效?...

我想要动态加载modal内的内容(一个模版&#xff0c;里面包含加载js文件)&#xff0c;我使用load(),在modal显示的时候进行ajax加载&#xff0c;js如下&#xff1a;$(#modal).on(show.bs.modal, function (e) {$(this).load($(e.relatedTarget).data(url));});原先在页面上已经存…

云+X案例展 | 金融类:青云QingCloud助力泰康人寿云计算演进之路

本案例由荣之联投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。泰康保险泰康云平台 青…

阿里云Kubernetes容器服务上体验Knative

概述 Knative Serving是一种可缩放至零、请求驱动的计算运行环境&#xff0c;构建在 Kubernetes 和 Istio 之上&#xff0c;支持为 serverless 应用、函数提供部署与服务。Knative Serving的目标是为Kubernetes提供扩展功能&#xff0c;用于部署和运行无服务器工作负载。 下面…

Springboot2 Quartz实现JAVA定时任务的动态配置

动态配置Quartz。没接触过定时任务的同学可以先看下此篇&#xff1a;JAVA定时任务实现的几种方式 文章目录一、需求背景1. 问题现象2. 问题分析3. 解决方案二、需求背景2.1. maven依赖2.2. 创建一个任务表2.3. 实现步骤三、代码逻辑3.1. Quartz配置3.2. 启动项目&#xff0c;加…

IoT Studio + LoRa打造“又猛又持久”的智能厕所

概述 为了增加厕所使用效率&#xff0c;减少被味道“熏陶”的等待时间&#xff0c;同时也为了增加厕所的清洁效率&#xff0c;我们决定做一个非侵入式的智能厕所改造方案。它可以通过红外热释电检测每个坑位有没有人&#xff0c;在web/app上实时显示&#xff0c;方便如厕人员查…

分布式事务中间件Fescar—全局写排它锁解读

前言 一般&#xff0c;数据库事务的隔离级别会被设置成 读已提交&#xff0c;已满足业务需求&#xff0c;这样对应在Fescar中的分支&#xff08;本地&#xff09;事务的隔离级别就是 读已提交&#xff0c;那么Fescar中对于全局事务的隔离级别又是什么呢&#xff1f;如果认真阅…