h5: 打开手机上的某个app

news2024/9/24 1:23:32
1、android端:直接通过URL Scheme方式打开。
2、ios端(2种):(1)使用URL Scheme方式打开。(2)使用Universal link方式打开。
3、Universal link方式使用注意事项:(1)需让原生app开发人员配置universal link给到前端;(2)只有ios9版本以上(包含ios9)的设备才支持universal link; (3)需让运维人员配置univeral link指定的h5页面路径(访问404时(微信或企微打开,手机没有安装app),定向到h5的落地页)。
4、微信或企微微信中:都不支持URL Scheme和Universal link打开 APP,需使用微信引导页,提示在浏览器打开的方式。
5、schemaUrl:让原生app的android和ios开发人员配置,给到前端URL即可。

一、新建工具函数文件utils.js如下:

// android终端
export const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
// ios终端
export const isIos = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) 
// 微信
export function isWeixin() {
  return navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1
}

/**
 * 获取IOS的版本号
 */
const getIosVersion = ()  => {
    const ua = navigator.userAgent.toLowerCase();
    const version = ua.match(/cpu iphone os (.*?) like mac os/);
    const finalVersionStr = version && version[1].replace(/_/g,".")
    return finalVersionStr
}

/**
 * 判断IOS设备版本号,是否大于ios9
 */
const isGreatOrSameIos9 = () => {
    const currentVersion = getIosVersion()
    const versionList = currentVersion.split('.')
    return Number(versionList[0]) >= 9
}

/**
 * 打开IOS的商品详情的universal link
 */
const openIosGoodDetailUniversalLink = (paramsStr) => {
    let ele = document.createElement('a')
    ele.style.display = 'none'
    ele.href = 'https://www.xxxx.com.cn/open/xxxx?action_type=1024&' + paramsStr  // ios的universal link
    document.body.appendChild(ele)
    ele.click()
}

/**
 * h5打开手机上的app
 * @param { Object } that 页面实例
 * @param { String } propName 控制微信浏览器(微信、企业微信)引导页显示的变量
 * @param { String } paramsStr 打开APP内某个页面的业务传参
 * @Note 1、ios的univeral link在微信或企业微信上,即使安装了app,也不会直接跳到 APP, 而是显示h5页面。
 * @Note 2、ios的itunes下载链接:在微信和企业微信中都无法显示页面, 加载不了。
 */
export const handleH5InvokeApp = (that, propName = 'showWeiXinGuide', paramsStr) => {
    // 微信 或 企微中: 需要在浏览器中打开
    try {
        if(isWeixin()) {
            that[propName] = true
        } else if (isAndroid || isIos) {
            const schemaUrl = 'xxxx://action?action_type=1024&' + paramsStr
            const downloadMarketUrl = isAndroid ? 'https://www.xxx.com/xxx' : 'https://itunes.apple.com/us/app/xxx/xxx?l=zh&ls=1&mt=x'
            let iframeEle = null
            let timer = setTimeout(function(){
                document.hasFocus() && (window.location.href = downloadMarketUrl)
            }, 3000)
            if (isIos) {
                // ios9以上(包含ios9): 使用univeral link方式
                if (isGreatOrSameIos9()) {
                    clearTimeout(timer)
                    openIosGoodDetailUniversalLink(paramsStr)
                    return
                } else {
                    iframeEle = document.createElement('iframe')
                    iframeEle.src = schemaUrl
                    iframeEle.style.display = 'none'
                    document.body.appendChild(iframeEle)
                }
                // ios 中无法触发 visibilitychange 事件,所以需要 pagehide 来做兼容
                window.addEventListener('pagehide', function(event) {
                    clearTimeout(timer)
                })
            } else {
                window.location.href = schemaUrl
            }
            // 各种浏览器兼容
            let hidden, visibilityChange;
            if (typeof document.hidden !== "undefined") {
                hidden = "hidden";
                visibilityChange = "visibilitychange";
            } else if (typeof document.mozHidden !== "undefined") {
                hidden = "mozHidden";
                visibilityChange = "mozvisibilitychange";
            } else if (typeof document.msHidden !== "undefined") {
                hidden = "msHidden";
                visibilityChange = "msvisibilitychange";
            } else if (typeof document.webkitHidden !== "undefined") {
                hidden = "webkitHidden";
                visibilityChange = "webkitvisibilitychange";
            } 
            // 安卓: 可以直接使用 visibilitychange 来判断标签页展示、还是隐藏
            document.addEventListener(visibilityChange, function() {
                 if(document.hidden) {
                    clearTimeout(timer)
                 }
            }, false);
        } else {
            alert('只能在手机端浏览器打开') // 部分手机端浏览器可设置为Web打开
        }
    } catch (e) {
        console.log('h5唤起app失败', e)
    }
}

二、微信或企微环境中的引导页组件open-in-browser-guide.vue(使用uniapp-h5语法)

<template>
    <view class="guide-container">
        <u-mask :show="show" @click="handleClose">
            <view class="main">
                <view class="content">
                    <text>步骤一、点击右上角的三个点</text>
                    <text>步骤二、选择在浏览器中打开</text>
                    <u-image width="166rpx" height="257rpx" :src="src" class="image-wrap"></u-image>
                </view>
            </view>
        </u-mask>
    </view>
</template>

<script>
    export default {
        props: {
            show: {
                type: Boolean,
                default: false
            }
        },
        data() {
            return {
                // 箭头图片(图片资源在博客最下方)
                src:  require('../../static/imgs/guide-arrow.png'), 
            };
        },
        methods: {
            handleClose() {
                this.$emit('update:show', false)
            }
        }
    }
</script>

<style lang="scss" scoped>
    .guide-container {
        .main {
            display: flex;
            justify-content: center;
            height: 100%;
            .content {
                display: flex;
                flex-direction: column;
                align-items:center;
                justify-content: center;
                width: 80%;
                font-size: 32rpx;
                line-height: 2;
                margin: -80rpx auto 0;
                color: #fff;
            }
            .image-wrap {
                border-style: none;
                position: absolute;
                transform: rotateZ(246deg);
                top: 20%;
                right: 100rpx;
            }
        }
    }
</style>

guide-arrow.png

参考链接:

  • 一篇文章了解H5打开APP的诸多方案:https://mp.weixin.qq.com/s?__biz=MzI2OTQ3NDU1MA==&mid=2247484368&idx=1&sn=b232115efd8107f622854370d218273b&chksm=eade8c49dda9055f6da7e0d14805e88f06649280f2649f92b13870ca3104b9361a10bc72a4da&mpshare=1&scene=1&srcid=0217QAbw6zMuzrvGY1It6In5&sharer_sharetime=1676610130340&sharer_shareid=f2f33c323565b5c8acdb7a31574d6c5b&version=4.1.0.6011&platform=win#rd

  • 关于URL Schema:https://www.jianshu.com/p/5bf51eb5322a?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

  • H5如何实现唤起APP(如唤起知乎):https://blog.csdn.net/qq_41960279/article/details/124817190

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

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

相关文章

IM即时通讯开发群聊消息的已读回执功能该怎么实现?

我们平时在使用即时通讯应用时候&#xff0c;每当发出一条聊天消息&#xff0c;都希望对方尽快看到&#xff0c;并尽快回复&#xff0c;但对方到底有没有真的看到&#xff1f;我却并不知道。一个残酷的现实是&#xff0c;很多时候对方其实是早就已经看到了这条消息&#xff0c;…

Java “框架 = 注解 + 反射 + 设计模式” 之 注解详解

Java ”框架 注解 反射 设计模式“ 之 注解详解 每博一文案 刹那间我真想令时光停住&#xff0c;好让我回顾自己&#xff0c;回顾失去的年华&#xff0c;缅怀哪个穿一身短小的连衣裙 和瘦窄的短衫的小女孩。让我追悔少年时代&#xff0c;我心灵的愚钝无知&#xff0c;它轻易…

【Eye】Fake News Reading on Social Media: An Eye-tracking Study

Fake News Reading on Social Media: An Eye-tracking Study Abstract 在网上传播假新闻&#xff08;以及一般的虚假信息&#xff09;最近被认为是威胁整个社会的一个主要问题。这种传播在很大程度上是由于新的媒体形式&#xff0c;即社交网络和在线媒体网站。研究人员和从业…

Python WebDriver自动化测试

Webdriver Selenium 是 ThroughtWorks 一个强大的基于浏览器的开源自动化测试工具&#xff0c;它通常用来编写 Web 应用的自动化测试。 Selenium 2&#xff0c;又名 WebDriver&#xff0c;它的主要新功能是集成了 Selenium 1.0 以及 WebDriver​&#xff08;WebDriver 曾经是…

CentOS8基础篇7:Linux系统启动配置

一、Linux系统的启动过程 Linux的启动过程大体分为五个阶段&#xff1a; 1&#xff0e;计算机主机加电后&#xff0c;CPU初始化自身&#xff0c;接着在硬件固定位置执行一条指令。这条指令跳转到BIOS&#xff0c;BIOS找到启动设备并获取MBR&#xff0c;该MBR指向LILO或GRUB。 …

steam/csgo游戏搬砖,适合个人/团队操作的创业项目(内附详细操作流程)

不懂得小伙伴继续听我娓娓道来&#xff01; 首先准备工作&#xff0c;需要用到的软件&#xff1a; 软件&#xff1a; 1、电脑&#xff08;开网页不卡的就行&#xff09; 2、ti子 3、谷歌浏览器&#xff08;多开方便些&#xff0c;别的也可以&#xff09; 4、桌面令牌 5、…

Vue的表单处理全解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录表单处理知识点基本用法文本多行文本单选按钮复选框多个复选框选择框值绑定单选按钮复选框选择框修饰符.number.trim综合小练习表单处理 在日常的开发中&#xff0c…

urllib之urlopen和urlretrieve的headers传入以及parse、urlparse、urlsplit的使用

urllib库是什么?urllib库python的一个最基本的网络请求库&#xff0c;不需要安装任何依赖库就可以导入使用。它可以模拟浏览器想目标服务器发起请求&#xff0c;并可以保存服务器返回的数据。urllib库的使用&#xff1a;1、request.urlopen(1)只能传入url的方式from http.clie…

有状态登录和无状态登录详解

有状态登录和无状态登录详解一 有状态登录二 无状态登陆无状态登陆介绍&#xff1a;无状态token生成方式一 Jwt方式二 RSA256非对称加密方式三 区别与差异四 参考连接一 有状态登录 有状态登录(Session)&#xff1a; 传统上&#xff0c;我们会使用 Session 和 Cookie 来保存用…

云计算介绍

云计算介绍概述云分类服务模式应用起源传统 IT 技术存在的问题云计算的产生云计算的发展趋势主要特点关键技术关键技术一览表虚拟化桌面显示协议用户个性化配置海量数据并行计算云安全相关技术相关技术一览表分布式计算网格计算效用计算概述 云计算&#xff08;Cloud Computin…

rest和rpc的区别

一、rest&#xff1a; REST 不是一种协议&#xff0c;它是一种架构。大部分REST的实现中使用了RPC的机制&#xff0c;大致由三部分组成&#xff1a; 1、method&#xff1a;动词&#xff08;get、post之类的&#xff09; 2、Host&#xff1a;URI&#xff08;统一资源标识&…

华为OD机试题,用 Java 解【静态扫描最优成本】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

2023-02-28 mmap的原理及使用-思考

摘要: 最近在使用mmap解决数据库内存占用损耗过高导致OOM的问题, 不得不说在有些场景下mmap是非常有用. 本文主要涉及一些对mmap的思考. mmap本身的思考: mmap和文件系统的交互规则是什么mmap中给进程虚拟内存映射的文件上的部分,是什么? 为什么是页缓存? 有没有文件缓存?…

Vscode快速配置(1)之基础工具

VScode快速配置(1)之基础工具(v1.0) Author&#xff1a;Once Day Date&#xff1a;2023年2月19日 漫漫长路&#xff0c;才刚刚开始… &#xff08;嵌入式程序员开发环境&#xff09; 1. 概述 下面是一些基础插件&#xff0c;基本上嵌入式程序员都会用到。 首先是远程连接…

力扣-销售分析III

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1084. 销售分析III二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结…

Apache Hive入门

文章目录一、Apache Hive概述1.1、什么是Hive1.2、使用Hive原因1.3、Hive和Hadoop关系二、Hive功能思想2.1、映射信息记录2.2、SQL语法解析、编译三、Hive架构、组件3.1、Hive架构图3.2Hive组件四、Hive常用操作4.1、数据类型4.1.1、基本数据类型4.1.2、集合数据类型4.2、数据库…

动态网页的核心——JSP

文章目录1&#xff0c;JSP 概述2&#xff0c;JSP 小案例2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3&#xff0c;JSP 原理4&#xff0c;JSP 总结4.1 JSP的 缺点4.2技术的发展历程4.3JSP的必要性最后说一句1&#xff0c;JSP 概述 JSP&#xff08;全称…

IB数学/生物/化学/物理所需的教材有哪些

高中阶段的学习是迈向大学的重要步骤&#xff0c;涉及到的课程分为许多结构&#xff0c;其中最为常见的则是通过IB, AP和A-Level的学习&#xff0c;实现迈入国外大学的目的。 IB课程即国际文凭组织IBO&#xff08;International Baccalaureate Organization&#xff09;&#x…

「TCG 规范解读」规范结构

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

「TCG 规范解读」TCG 主规范-命令

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alliance,TCPA)所开发的规范。现在的规范都不是最终稿,都…