H5页面在浏览器中跳转APP的方式/URL Scheme/Universal Link

本文深入探讨了URLScheme和UniversalLink两种跳转至APP的方法。URLScheme通过链接跳转,适用于Android及iOS9以下设备;UniversalLink则针对iOS9及以上版本,允许通过HTTPS链接直接启动已安装的应用或引导至自定义网页,尤其在微信环境中表现优越。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、URL Scheme (Android或者IOS 9以下)

概念

URL Scheme是我们最常见的一种跳转app的方式,其实就是通过一个链接跳转。
格式为[scheme]://[host]/[path]?[query],具体内容需要h5端与app端协调。例如微信扫一扫weixin://dl/scan

统一资源标识符(英语:Uniform Resource Identifier,缩写:URI)在电脑术语中是一个用于标识某一互联网资源名称的字符串。URI的最常见的形式是统一资源定位符(URL),经常指定为非正式的网址。

流程

通过这种方式跳转APP的具体流程为:(APP端已经配置好的情况下)

  1. h5端通过a链接点击/嵌入iframe跳转/本页面路径跳转链接的方式触发。
    (如果是在微信中打开,需要提醒去其他浏览器打开)
const url = 'weixin://dl/scan';

// a链接
let ahref = document.createElement('a');
ahref.href = url;
ahref.click();

// 嵌入iframe跳转 (ios9以后,屏蔽iframe跳转)
let ifr = document.createElement("iframe");  
ifr.setAttribute('src', url);  
ifr.setAttribute('style', 'display:none');  
document.body.appendChild(ifr);  

// 本页面路径跳转
location.href = url;
  1. 手机端已经安装有APP时,直接跳转到APP。
  2. 手机端没有安装APP时,页面没有任何变化。
劣势

劣势主要体现在手机没有安装APP的情况下,不会给用户任何反馈信息,如果使用了本页面路径跳转方法,还可能跳转到一个404的页面,用户体验非常不好。

解决方案

所以在不使用本页面路径跳转的前提下,目前常见的解决方式有以下几种:

  1. 通过setTimeout设置定时器,如果离开了当前页面,setTimeout执行得会比设置的时间还要慢一些,通过Date.now()便可以监测到。如果没有离开当前页面,就说明用户没有安装APP,在设定的时间后就跳转APP下载页
var timeout, t = 1000, hasApp = true;  
var openScript = setTimeout(function () {  
        if (!hasApp) {
            // 跳转下载链接
        }
}, 2000)  
                
var t1 = Date.now();  
// 使用a标签方法或iframe方法触发URL Scheme

timeout = setTimeout(function () {  
       var t2 = Date.now();  
       if (t2 - t1 < t + 100) {  
             hasApp = false;
       }
}, t);
  1. 第二种也是通过setTimeout的方式判断是否离开页面,只是如果没有离开页面是弹出弹窗提示下载

2、Universal Link (IOS 9及以上)

概念

Universal Link是苹果在WWDC 2015上提出的iOS9的新特性之一。此特性类似于深层链接,并能够方便地通过打开一个Https链接来直接启动您的客户端应用(手机有安装App)。
可以在微信内直接打开其他app。

流程
  1. h5端点击链接触发跳转。
  2. 手机端已经安装有APP时,直接跳转到APP。
  3. 手机端没有安装APP时,跳转到自定义的web页面。
劣势
  1. 只适用于ios 9及以上。
  2. 只能使用https协议。
<think>好的,我现在要详细解释MySQL的可重复读隔离级别。首先,我需要确认可重复读的定义,根据引用[1],它确保在同一个事务中多次读取的数据是一致的,不会被其他事务的提交影响。这说明可重复读通过快照读来实现一致性,但可能有幻读的问题。 接下来,要讲工作原理。引用[1]提到快照读依赖MVCC,而当前读需要其他机制。MVCC如何工作呢?应该解释版本号和Undo Log,确保事务看到一致的数据快照。同时,引用[2]说明悲观锁如行锁不能防止幻读,所以需要间隙锁。这里需要详细说明间隙锁的作用,如何阻止其他事务插入新数据到范围内。 然后,幻读的问题。引用[3]的例子很好,可以引用来说明幻读现象,以及可重复读如何通过间隙锁来防止。需要区分快照读和当前读的不同处理方式,快照读用MVCC避免幻读,当前读用间隙锁。 最后,应用场景和限制。根据引用[1],可重复读适用于需要事务内一致性的场景,但需要注意锁的机制带来的性能影响。可能还需要对比其他隔离级别,比如读已提交,来突出可重复读的特点。 现在需要确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$。例如,解释版本号时可以用$version$变量,或者举一个数据行的例子。但用户的问题主要是数据库相关,可能数学公式较少,但如果有涉及计算的地方要正确应用格式。 另外,生成相关问题时要围绕可重复读、MVCC、间隙锁、幻读等关键词,确保问题有针对性。例如,如何配置隔离级别,MVCC工作原理,间隙锁如何防止幻读等。 检查引用是否正确,每个引用对应的内容是否准确。引用[1]提到快照读和当前读的不同解决方案,引用[2]讨论锁机制,引用[3]定义幻读。这些都需要在回答中正确引用,例如在解释间隙锁时引用[2],在讨论幻读例子时引用[3]。 可能的结构: 1. 定义 2. 工作原理(MVCC和间隙锁) 3. 幻读问题及解决方案 4. 应用场景和限制 确保每个部分都自然引用相关文献,并在末尾添加引用标识。例如,在讲MVCC时引用[^1],讲间隙锁时引用[^2],举例幻读时引用[^3]。 最后,检查语言是否通顺,符合中文表达,避免技术术语错误,比如“事务”而不是“事物”。</think>### MySQL 可重复读隔离级别详解 #### 1. 定义与核心特性 **可重复读(Repeatable Read, RR)** 是MySQL的默认事务隔离级别,其核心特性是: - 事务内多次读取同一范围的数据时,结果始终一致,不受其他事务提交的影响 - 通过**快照读**(基于MVCC)实现数据一致性 - 通过**间隙锁**(Gap Lock)解决当前读的幻读问题 #### 2. 工作原理 **1. MVCC(多版本并发控制)** - 每个事务启动时生成唯一的事务ID(`$tx\_id$`) - 数据行通过隐藏字段 `$DB\_TRX\_ID$` 记录修改该行的事务ID - 通过 **Undo Log** 链实现版本回溯,确保事务只能看到早于其 `$tx\_id$` 或自身修改的数据版本 例如: ```sql -- 事务A查询id=10的数据时,实际访问的是对应Undo Log中的历史版本 SELECT * FROM table WHERE id = 10; -- 快照读 ``` **2. 间隙锁(Gap Lock)** - 针对**当前读**(如 `SELECT ... FOR UPDATE`)场景 - 锁住索引记录之间的“间隙”,阻止其他事务插入新数据 - 例如执行 `SELECT * FROM table WHERE id BETWEEN 10 AND 20 FOR UPDATE` 时,会锁住区间(10,20),阻止插入id=15的记录[^2] #### 3. 幻读问题与解决方案 **幻读现象**(引用示例[^3]): ```sql -- 事务C第一次查询 SELECT * FROM users WHERE id > 10 AND id < 20; -- 返回5条记录 -- 事务D插入id=15的新数据并提交 -- 事务C再次查询(当前读) SELECT * FROM users WHERE id > 10 AND id < 20 FOR UPDATE; -- 返回6条记录 ``` **解决方案**: - **快照读**:通过MVCC返回事务开始时的数据版本,避免看到新插入的数据[^1] - **当前读**:通过间隙锁封锁范围,阻止其他事务插入新数据[^2] #### 4. 应用场景与限制 **适用场景**: - 需要事务内多次查询结果一致的场景(如对账、统计) - 需要同时保证数据可见性和部分写冲突控制的场景 **限制**: - 间隙锁可能降低并发性能 - 不适用于需要实时读取最新数据的场景 $$ \text{隔离级别对比公式:} \\ \text{可重复读} \subset \text{隔离级别} \subseteq \\{\text{读未提交}, \text{读已提交}, \text{可重复读}, \text{串行化}\\} $$
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值