H5唤醒App

news2024/11/30 0:52:36

H5唤醒App

         在App的业务场景中,H5唤醒App是一个几乎必备的功能。比如你想要实现以下需求:当App内容通过各种途径(短信、二维码、微信等)触达用户,从浏览器或者第三方内部可以直接打开H5网页,由网页端交互操作引导回App中(即唤醒App),并还原对应页面。其中实现难度最大的步骤就是通过H5网页唤醒App,并且打开指定页面。

         主要问题就在于第三方应用和浏览器的限制,正常来说,网页唤醒App的载体是网页,唤醒的是App,理论上我们只需要对接好App的协议即可,也就是Android、iOS的生态协议。但实际上,由于网页端的独立性,大部分浏览器和超级App都制定了一套规则,流量一旦进入各自的平台中就会被限制,比如虽然微信里可以自由打开网页,但大部分网页协议却被禁止,浏览器里的原生方案在微信中都是需要重新开发的,包括标签开发、权限申请、信息注册等。

直接撸代码

AndroidManifest.xml配置:

<activity android:name=".activity.export.H5VisitAppActivity" android:launchMode="singleTask"
            tools:ignore="AppLinkUrlError">
            <intent-filter>
                <!--
                    协议部分配置
                    要注意的是scheme只能包含字母和数字,不能包含大写字母、特殊字符或空格。
                    因此,在配置<intent-filter>时,不能使用大写字母或数字以外的字符作为数据方案的一部分。
                    例如,如果你想定义一个自定义的数据方案为mynamespace://example.com/page,
                    你应该在<intent-filter>配置中将scheme属性设置为mynamespace,而不是Mynamespace或Mynamespace123。
                -->
                <data
                    android:host="example.com"
                    android:path="/page"
                    android:scheme="mynamespace" />
                <!-- 下面这几行也必须得设置 -->
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>
        </activity>

activity里获取相关参数等等

try {
            if (Intent.ACTION_VIEW == getIntent().getAction() && getIntent().getData() != null) { // h5直接定位打开app对应详情
                // 尝试获取WEB HTML页面上过来的URL
                Uri uri = getIntent().getData();
                if (uri != null) {
                    
//                    mynamespace://example.com/page?useId=0978
                   //获取指定参数值
                    useId = uri.getQueryParameter("useId ");
                   //TODO 其他参数获取  以及跳转等等处理
                     //TODO 其他参数获取  以及跳转等等处理
                     //TODO 其他参数获取  以及跳转等等处理
                }
            }
        } catch (Exception e) {
            Log.e("getInitIntentParams", "getInitIntentParams has exception is " + e.getLocalizedMessage());
        }

H5调用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>

		<style>
			.rd_card_sm {
				background: linear-gradient(0deg, #fff 0%, transparent 100%);
				line-height: 82px;
				position: absolute;
				bottom: 420px;
				left: 50%;
				transform: translate(-50%, 50%);
				-webkit-transform: translate(-50%, 50%);
				-moz-transform: translate(-50%, 50%);
				-ms-transform: translate(-50%, 50%);
				border: 2px solid #3498db;
				border-radius: 21px;
				color: #3498db !important;
				padding: 0 45px;
				font-size: 45px;
			}
		</style>
	</head>
	<body>

		<button class="rd_card_sm" onclick="checkWeChatInstalled()">在APP打开</button>
		<script>
			function checkWeChatInstalled() {


				var scheme = "eyesnews://tianyan"; // 微信的Scheme URL
				var isInstalled = false;
				var ifAndroid = (navigator.userAgent.match(/(Android);?[\s\/]+([\d.]+)?/)) ? true : false;
				// 是否从微信打开
				var ifWeixin = navigator.userAgent.indexOf("MicroMessenger") >= 0; // weixin

				if (navigator.userAgent.match(/(iPhone|iPod|iPad)/)) {
					// iOS设备
					if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.interaction) {
						// 如果是在WebView中运行的iOS App,可以通过尝试调用微信的URL Scheme来判断是否已安装
						window.webkit.messageHandlers.interaction.postMessage({
							action: "canOpenURL",
							url: scheme
						});
						isInstalled = true;
					}
				} else if (ifAndroid) {

					if (ifWeixin) {
						window.location.href = "https://a.app.qq.com/o/simple.jsp?pkgname=xxx.xxx.xx"; // 应用下载链接
					} else {

						try {
							window.location.href = "mynamespace://example.com/page?useId=0978"; // 打开客户端用户主页面
							setTimeout(function() {
								window.location.href =
									"https://a.app.qq.com/o/simple.jsp?pkgname=xxx.xxx.xx"; //android下载地址
							}, 2000);
						} catch (e) {

						}
					}


				} else {
					// 其他设备或浏览器,无法准确判断是否已安装
					console.log("无法判断客户端是否已安装");
					alert("无法判断客户端是否已安装")
				}

			}
		</script>
	</body>
</html>

正常跳转到APP的页面去

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

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

相关文章

线性代数的本质(十)——矩阵分解

文章目录 矩阵分解LU分解QR分解特征值分解奇异值分解奇异值分解矩阵的基本子空间奇异值分解的性质矩阵的外积展开式 矩阵分解 矩阵的因式分解是把矩阵表示为多个矩阵的乘积&#xff0c;这种结构更便于理解和计算。 LU分解 设 A A A 是 m n m\times n mn 矩阵&#xff0c;…

web安全漏洞-SQL注入实验2

实验目的 学习sql显注的漏洞判断原理掌握sqlmap工具的使用分析SQL注入漏洞的成因 实验工具 sqlmapsqlmap是用python写的开源的测试框架&#xff0c;支持MySQL&#xff0c;Oracle&#xff0c;PostgreSQL&#xff0c;Microsoft SQL Server&#xff0c;Microsoft Access&#x…

SLS 1508 支持艾默生DeltaV报警抑制模块的设计

SLS 1508 支持艾默生DeltaV报警抑制模块的设计 宣布其SILAlarm V2.10合理化工具支持艾默生DeltaV报警抑制模块的设计和自动配置。这些模块通过在满足预定义条件时抑制来自操作员的警报来消除警报泛滥&#xff0c;并帮助用户符合ISA-18.2和IEC 62682标准。 报警抑制逻辑在艾默…

安全测试BurpSuite-抓包篡改数据

bp做安全测试很核心的一个步骤就是抓包 一、配置代理 浏览器代理&#xff0c;第一种使用浏览器自身手动代理 第二种下载插件&#xff08;推荐使用&#xff0c;切换多个代理方便&#xff09; 1、浏览器chrome/火狐安装插件 2、配置对应的代理情景 二、burp suite配置对应的…

List与ArrayList

目录 一、List及其使用 1.1 List的概念 1.2 常见接口的介绍 1.3 List的使用 二、线性表和顺序表 2.1 线性表 2.2 顺序表 三、ArrayList介绍 四、ArrayList的使用 4.1 ArrayList构造 4.2 ArrayList的常用方法 4.3 ArrayList的遍历 4.4 ArrayList的扩容机制 五、ArrayList的具…

LVS负载均衡群集NAT模式

LVS负载均衡群集NAT模式 一、集群与分布式1.1、集群的含义1.2、lvs模型1.3、系统性能扩展方式1.4、群集的三种类型1.4.1、负载均衡群集1.4.2、高可用群集1.4.3、高性能运算群集 1.5、LVS的负载调度算法1.5.1、轮询1.5.2、加权轮询1.5.3、最少连接1.5.4、加权最少连接1.5.5、ip_…

【Spring源码解析】一文读懂Spring注入模型:开发者必备知识

文章目录 什么是注入模型注入模型的种类案例分析例子一创建Bean对象创建配置类重写后置处理器创建测试类执行测试方法分析 例子二改写站点类&#xff0c;去掉Autowired注解重写后置处理器执行测试方法分析思考 ✨这里是第七人格的博客✨小七&#xff0c;欢迎您的到来~✨ &#…

华为云云耀云服务器L实例评测|怎么搭建企业综合Web平台

前言 记得2019年&#xff0c;公司搞混合云的时候&#xff0c;测试过多家公有云&#xff0c;其中就有华为云。因公司也在深圳&#xff0c;项目也比较急&#xff0c;我司业务上云经验又不足&#xff0c;华为官方获悉情况后&#xff0c;第二天就派了4人小团队到我司来交流&#x…

金蝶云星空与金蝶云星空对接集成发货通知单查询打通发货通知单新增

金蝶云星空与金蝶云星空对接集成发货通知单查询打通发货通知单新增 数据源平台:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的ERP服务平台…

加载动态库失败(loadLibrary返回为空 GetLastError126)解决办法 dll有依赖的dll缺失

问题&#xff1a;加载动态库失败&#xff08;loadLibrary返回为空&#xff09; 排除&#xff1a;64位也对。平台相同。 错误&#xff1a;至少找不到一个必需的隐式或转发依赖项。这个不影响。 SmartPay_PGL.dll下的四个dll&#xff0c;则是他所依赖的四个dll。因为我这里有缺失…

破天荒呀!小杜微信有名额了

写在前面 小杜粉&#xff0c;众所周知前面加小杜微信为好友的基本都是由名额限制的。一般都是付费进入社群且进行备注&#xff0c;小杜才会长期保留微信好友。主要由于&#xff0c;添加的人数太多了&#xff0c;微信账号人数名额有限。因此&#xff0c;小杜过一段时间&#xf…

在线会计软件推荐:高效实用的选择解析

如果您始终在密切关注Zoho&#xff0c;您一定知道&#xff0c;我们的软件在一个接一个的增加&#xff0c;为的是构建出一套可以全面在线协作、提升业务生产力的应用系统&#xff0c;我们始终致力于为各类企业构建完整的业务应用&#xff0c;以便他们在Zoho上运行整个业务系统。…

操作系统OS的发展历史和分类

1.手工操作阶段 使用纸带机&#xff0c;输入输出速度慢。但计算机速度快&#xff0c;导致计算机资源大部分时间处于闲置状态。主要缺点:用户独占全机、人机速度矛盾导致资源利用率极低。 2.批处理阶段 1.单道批处理系统 引入脱机输入/输出技术&#xff08;用外围机磁带完成…

Polygon ID:不仅仅是生物识别的人格证明

1. 引言 2023年7月V神在博客 What do I think about biometric proof of personhood? 中指出&#xff1a; 其中的risks包括&#xff1a;不可避免的隐私泄露、人们匿名浏览互联网的能力进一步削弱、威权政府的胁迫&#xff0c;以及在去中心化的同时可能不安全。 Polygon ID致…

【vue】vue 中插槽的三种类型:

文章目录 一、匿名插槽&#xff1a;二、具名插槽&#xff1a;三、作用域插槽 一、匿名插槽&#xff1a;<slot></slot> 1.没有为插槽指定名称 2.通过slot标签可以添加匿名插槽 3.在使用组件的时候&#xff0c;组件中的内容会填充到所有匿名插槽的位置&#xff0c;所…

知识库网站如何搭建?需要注意这五个要点!

正因为知识库提供结构化知识库来记载信息和知识&#xff0c;便于团队沉淀经验、共享资源&#xff0c;形成完整的知识体系并持续进化​&#xff0c;使得它成为当前企业发展新宠。 构建自己/团队的知识库是一个良好的习惯&#xff0c;可以提高工作和学习效率&#xff0c;以下是一…

SpringMVC之JSON数据返回与异常处理机制

目录 一.SpringMVC的JSON数据返回 1.导入Maven依赖 2.配置spring-mvc.xml 3.ResponseBody注解的使用 3.1案例演示 1.List集合转JSON 2.Map集合转JSON 3.返回指定格式String 4. ResponseBody用法 5.Jackson 5.1介绍 5.2常用注解 二.异常处理机制 1.为什么要全局异常处…

$ref赋值之后,子组件不渲染(刷新后,$ref父组件传值,子组件不更新数据问题)

在父组件中&#xff0c;点击搜索&#xff0c; 通过this.$refs传值给子组件 this.$refs.GoodsClassNav.paramsAll.keyword key; 子组件结果中不显示&#xff0c; 但是打印this.$refs.GoodsClassNav.paramsAll.keyword&#xff0c;可以打印到最新的值&#xff0c;点击子组件中…

SpringCloud在idea中一键启动项目

1、如下图文件中加上&#xff1a; <component name"RunDashboard"><option name"configurationTypes"><set><option value"SpringBootApplicationConfigurationType" /></set></option></component>…

CS5817规格书|CS5817芯片参数|多功能便携式显示器方案芯片规格

CS5817支持最高4K 60Hz是集睿致远&#xff08;ASL&#xff09; 新推出的多功能显示控制器芯片&#xff0c;CS5817产品可应用于便携显示器、电竞显示器、桌面显示器、一体式台式机和嵌入式显示系统。 Type-C/DP/HDMI2.0输入转LVDS/eDP/VBO 芯片, 高度集成了多种输入输出接口, 并…