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

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

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>我们正在解决UniApp在iOS系统中使用scheme值`snssdk1128://`跳转抖音App失败的问题。根据常见的iOS应用间跳转机制,我们需要检查以下几个方面: 1. **URL Scheme配置**:确保抖音的Scheme已在iOS系统中正确注册。通常,抖音的Scheme是`snssdk1128`,但需要确认其有效性。 2. **白名单设置**:iOS 9以上需要在`Info.plist`中配置`LSApplicationQueriesSchemes`,将抖音的Scheme添加到白名单中。 3. **跳转代码**:使用UniApp的API进行跳转,并处理可能的失败情况。 4. **抖音App安装检测**:在跳转前应检测是否安装了抖音App,若未安装则跳转App Store。 ### 解决方案步骤 #### 1. 检查URL Scheme有效性 首先,确认抖音的Scheme值`snssdk1128://`是否有效。可以尝试在Safari浏览器中输入`snssdk1128://`并访问,如果抖音App被打开,则Scheme有效。注意:在iOS 15及更高版本中,直接在Safari输入Scheme可能被阻止,因此建议通过代码测试。 #### 2. 配置白名单 在UniApp项目中,找到`manifest.json`文件,配置iOS的`LSApplicationQueriesSchemes`。具体步骤如下: - 打开`manifest.json`,在`"app-plus" -> "distribute" -> "ios"`下添加`"urlschemewhitelist"`(或`"LSApplicationQueriesSchemes"`)字段,将抖音的Scheme添加进去。 示例: ```json { "app-plus": { "distribute": { "ios": { "urlschemewhitelist": ["snssdk1128"] } } } } ``` #### 3. 编写跳转代码 在UniApp中,可以使用`plus.runtime.openURL`方法打开外部App。同时,建议先检查抖音App是否安装。 ```javascript // 检查抖音App是否安装 function checkDouyinInstalled() { return new Promise((resolve, reject) => { plus.runtime.isApplicationExist({ action: 'snssdk1128://' }, (exist) => { resolve(exist); }); }); } // 跳转到抖音 function openDouyin() { plus.runtime.openURL('snssdk1128://', (error) => { if (error) { console.error('跳转失败:', error); // 跳转失败处理,例如跳转App Store plus.runtime.openURL('https://apps.apple.com/cn/app/抖音/id1142110895', (err) => { if (err) console.error('跳转App Store失败:', err); }); } }); } // 使用示例 async function tryOpenDouyin() { const isInstalled = await checkDouyinInstalled(); if (isInstalled) { openDouyin(); } else { // 未安装则跳转App Store plus.runtime.openURL('https://apps.apple.com/cn/app/抖音/id1142110895'); } } ``` #### 4. 处理iOS 15+的跳转问题 从iOS 15开始,苹果对Scheme跳转增加了安全限制。如果以上方法在iOS 15+上仍然失败,可以尝试使用`Universal Links`(通用链接)跳转。但需要抖音支持Universal Links,并且开发者需要在自己的域名下配置相关文件。由于抖音的Universal Links不对外公开,因此这种方法可能不可行。 ### 注意事项 - 在iOS 15+上,如果应用在后台,通过Scheme跳转可能会弹出提示框询问是否打开抖音。这是正常行为。 - 确保在真机上测试,模拟器无法测试Scheme跳转。 ### 备选方案 如果以上方案均无效,可以考虑使用H5页面跳转,即通过打开抖音的H5链接,如果用户安装了抖音,则可能会自动打开App(需要抖音支持)。但这种方式不是100%可靠。 ### 引用说明 关于iOS的URL Scheme限制和Universal Links的使用,可以参考苹果官方文档[^1]。 §§相关问题§§ 1. UniApp中如何检测其他App是否安装? 2. 如何在iOS 15以上版本中提高Scheme跳转的成功率? 3. UniApp中如何配置Universal Links? [^1]: [Apple Developer Documentation: Communicating with Other Apps](https://developer.apple.com/documentation/uikit/inter-process_communication/allowing_apps_and_websites_to_link_to_your_content/defining_a_custom_url_scheme_for_your_app)</think>### UniApp在iOS系统中使用Scheme跳转抖音失败的解决方案 在iOS系统中使用`snssdk1128://`跳转抖音失败,通常由以下原因导致,请按顺序排查: #### 1. **检查Scheme白名单配置** iOS 9+要求将目标AppScheme添加到白名单: - 打开`manifest.json`文件 - 在`"app-plus" → "distribute" → "ios"`下添加: ```json "urlschemewhitelist": ["snssdk1128"] ``` - 重新打包后生效[^1] #### 2. **验证Scheme有效性** 在Safari中直接输入测试: ```html <a href="snssdk1128://">打开抖音</a> ``` - 如果Safari能打开,说明Scheme有效 - 如果提示"无法打开",可能是抖音版本不兼容(尝试更新抖音) #### 3. **正确调用跳转API** UniApp中推荐使用以下代码: ```javascript // 检查是否安装 const isInstalled = plus.runtime.isApplicationExist({ action: 'snssdk1128://' }) if (isInstalled) { // 执行跳转 plus.runtime.openURL('snssdk1128://', (e) => { console.error('跳转失败:', e.message) }) } else { uni.showToast({ title: '未安装抖音', icon: 'none' }) // 可选跳转App Store plus.runtime.openURL('https://apps.apple.com/cn/app/抖音/id1142110895') } ``` #### 4. **iOS 15+的特殊处理** iOS 15+需要额外配置: ```json // manifest.json "ios" : { "UIViewControllerBasedStatusBarAppearance": false, "privacyDescription": { "NSPhotoLibraryUsageDescription": "需要相册权限" } } ``` #### 5. **常见错误排查** | 错误现象 | 解决方案 | |---|---| | 首次跳转无反应 | 添加延迟500ms再跳转 | | 弹出"是否打开"提示 | 这是iOS正常行为,无法消除 | | 后台跳转失败 | 确保App在前台执行跳转 | | 审核被拒 | 添加"用户触发操作"的条件判断 | #### 6. **备选方案(当Scheme失效时)** ```javascript // 尝试抖音官方H5跳转 plus.runtime.openURL('https://www.douyin.com/share/user/xxx') // 或使用Universal Link(需抖音支持) plus.runtime.openURL('https://v.douyin.com/xxxxxx/') ``` > ⚠️ **重要提示**:抖音的Scheme可能随版本更新变化,最新版已改用`aweme://`,建议测试多个Scheme: > - `snssdk1128://` > - `aweme://` > - `douyin://`
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值