鸿蒙Next-应用检测、安装以及企业内部商店的实现
一、企业内部应用检测和更新升级
A应用检测是否安装B应用
canOpenApp():boolean{ try { let link = 'schB://com.example.test/open'; // 替换成你目标应用的link串儿 let canOpen = bundleManager.canOpenLink(link); console.log("canOpen:"+canOpen) this.openDeepLink(link) return canOpen; } catch (err) { let message = (err as BusinessError).message; console.log('testTag', 'canOpenLink failed: %{public}s', message); } return false; } link的构成
为了便于应用A判断设备上是否有安装应用B,从而决定是否引导用户去下载应用B,需要应用A、B做如下配置:
应用B配置,在entry模块的 module.json5文件中添加配置具体标签路径如下:module-> abilities -> skills-> 添加 uris
{ "abilities": [ { "skills": [ { "actions": [ "ohos.want.action.home", "ohos.want.action.viewData" ], "entities": [ "entity.system.home" ], "uris": [ { "scheme":"schB", "host":"com.example.test", "path":"open", } ], } ] } ] } 应用A配置,在entry模块的module.json5文件中添加配置具体标签路径如下:module-> querySchemes
"querySchemes": [ "schB"] 打开某个应用
this.openDeeplink("schB://com.example.test/open") /** * 打开或者下载安装应用 * @param deeplink */ private openDeepLink(deeplink: string): void { let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; context.openLink(deeplink).then(() => { console.info('openlink success.') }).catch((error: BusinessError) => { console.error('openlink failed.') }); } 应用升级
deeplink的构成结构(具体解释见第二章节《二、企业内部商店如何实现》):
let deeplink: string = "store://enterprise/manifest?url=https://xxx/xxx.json5"; /** * 打开或者下载安装应用 * @param deeplink */ private openDeepLink(deeplink: string): void { let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; context.openLink(deeplink).then(() => { console.info('openlink success.') }).catch((error: BusinessError) => { console.error('openlink failed.') }); } 二、企业内部商店如何实现
对于不适合或不希望在华为应用市场上公开发布的、面向企业内部或特定人群的HarmonyOS应用的分发,必须使用专用的组织内部发布证书和组织内部发布Profile来编译打包HarmonyOS应用,然后将应用包及应用描述文件上传到您的服务器或第三方云上,用户按指定方式直接下载安装即可。
上传应用包至服务器
将编译得到的各个HAP/HSP包上传至您的服务器或第三方云上,获取HAP/HSP包下载URL,下载URL必须以“https”开头。
生成应用描述文件并上传至服务器
基于应用信息生成应用描述文件(如“manifest.json5”,文件名可自定义),代码如下:
{ "app": { "bundleName": "com.example.demo.a", "bundleType": "app", "versionCode": 1000000, "versionName": "1.0.0", "label": "DemoA", "deployDomain": "应用、图标以及描述文件部署域名", "icons": { "normal": "标准图标下载链接", "large": "大图标下载链接" }, "minAPIVersion": "4.1.0(11)", "targetAPIVersion": "4.1.0(11)", "modules": [ { "name": "module1", "type": "entry", "deviceTypes": [ "tablet", "phone" ], "packageUrl": "hap包下载链接", "packageHash": "hap包sha256值" }, { "name": "module2", "type": "feature", "deviceTypes": [ "tablet", "phone" ], "packageUrl": "hap包下载链接", "packageHash": "hap包sha256值" } ] }}
需传入的应用信息如下表所示。
属性
数据类型
必选(M)/可选(O)
说明
bundleName
字符串
M
应用的Bundle名称。
bundleType
字符串
M
应用的Bundle类型,用于区分HarmonyOS应用或元服务。
当前仅支持配置为“app”,表示HarmonyOS应用。
versionCode
数值
M
应用的版本号。
versionName
字符串
M
应用版本号的文字描述。
label
字符串
M
应用的名称,建议与实际应用名称一致,否则会出现下载与安装过程中应用名不一致的问题。
deployDomain
字符串
M
应用、图标及描述文件的部署域名,需要与icons、packageUrl以及描述文件自身下载URL中的域名一致,否则会导致下载失败。
icons
字符串
M
应用的图标,提供企业内部部署的图片下载地址,必须以“https”开头。
minAPIVersion
字符串
M
应用运行所需SDK的API最小版本,用于判断是否与当前设备兼容。
targetAPIVersion
字符串
M
应用运行所需的API目标版本,用于判断是否与当前设备兼容。
modules
列表
M
应用分包module信息列表,以数组形态组织,其中至少包括一个entry module信息。
name
字符串
M
module的名称,该名称在整个应用须唯一。
type
字符串
M
应用module的类型,取值范围:
deviceTypes
字符串
M
当前module可以运行在哪类设备上,目前仅支持phone(手机)和tablet(平板)。
packageUrl
字符串
M
当前module上传至服务器后生成的下载URL,必须以“https”开头。
packageHash
字符串
M
当前module的SHA256值。例如,可通过certutil -hashfile 包路径 SHA256命令获取。
说明
“包路径”指应用HAP/HSP包在本地的存储路径。
entry:应用的主模块
feature:应用的动态特性模块
shared:动态共享包模块(仅支持应用内共享包)
将应用描述文件上传至您的服务器或第三方云上,获取该描述文件的下载URL。
构造DeepLink拉起应用下载安装
获取应用描述文件的下载URL后,您便可使用该URL构造DeepLink来拉起应用下载安装。DeepLink需满足如下条件:
仅支持页面点击行为触发拉起,不支持地址栏输入DeepLink拉起或HTML头文件自动拉起。
仅支持华为浏览器拉起,且从华为浏览器拉起的所有行为,均需判断是否有用户点击行为,确认用户点击才允许拉起。
DeepLink格式:store://enterprise/manifest?url=https://xxx.xxx/xxx.json5
Schema
store://
Host
enterprise
Path
manifest
参数
描述文件上传至服务器后生成的下载URL,必须以“https”开头。
示例:url=https://xxx.xxx/xxx.json5
说明
如描述文件下载URL内包含特殊字符,还需进行特殊字符编码:declare function encodeURIComponent(uriComponent: string | number | boolean): string;
同时,服务器配置需满足如下条件,请特别关注:
您需要配置服务器支持分片下载能力。建议您在配置后进行验证:构造下载请求头包含range字段,返回码为206(如下方示例图),表示服务器支持分片下载;反之则不支持。

您需要配置服务器返回的响应头(如下方示例图),使得应用描述文件和应用包可正确传输下载。

例如,用户在应用分发页面点击“下载”按钮后,华为浏览器将解析您构造的DeepLink,触发应用的下载安装流程。
<html lang="en"> <head> <meta charset="UTF-8"> <title>Button Open DeepLink Example</title> <script> function openDeepLink() { let url ='store://enterprise/manifest?url=https://xxx.xxx/xxx.json5' window.open(url, '_parent') } </script> </head> <body> <button onclick="openDeepLink()">下载</button> </body></html> 更新场景下,可以使用openlink方式直接拉起下载安装:
private openDeepLink(deeplink: string): void {// deeplink格式具体见开发者文档let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;context.openLink(deeplink).then(() => {console.info('openlink success.')}).catch((error: BusinessError) => {console.error('openlink failed.')});} 
如果应用已安装成功,但被阻止运行,请在“设置 > 系统 > 企业设备和应用管理 > 企业应用管理”中找到您的企业内部应用,点击“允许”。
说明
系统软件版本(3.0.0.22)的路径为 “设置 > 通用 > 企业设备和应用管理”。

关注我获取更多知识或者投稿


相关文章:
鸿蒙Next-应用检测、安装以及企业内部商店的实现
一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…...
存量思维和增量思维
在网上看一篇文章,有两种典型的阅读方式。 一种,是挑刺式,眼里只有缺点。 比如,有人不厌其烦地告诉作者,哪段有错别字,哪段不够严谨。 闲得蛋疼。 有这工夫,多看会书,不香么&…...
golang将大接口传递给小接口以及场景
文章目录 golang将大接口传递给小接口背景什么是大接口传递给小接口使用场景 golang将大接口传递给小接口 背景 在 Go 语言中,接口是一种强大的工具,它允许我们定义对象的行为而不关心其具体实现。特别是在复杂的应用程序中,将一个实现了较…...
K8s 1.27.1 实战系列(七)Deployment
一、Deployment介绍 Deployment负责创建和更新应用程序的实例,使Pod拥有多副本,自愈,扩缩容等能力。创建Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的…...
Swift系列02-Swift 数据类型系统与内存模型
Swift 是一门现代的、安全的编程语言,其类型系统和内存模型设计对性能和安全性有着重要影响。本文将深入探讨 Swift 的数据类型系统与内存模型,帮助你更好地理解并利用这些特性来优化你的 iOS 应用。本文主要包含: 值类型和引用类型…...
MySQL中like模糊查询如何优化?
大家好,我是锋哥。今天分享关于【MySQL中like模糊查询如何优化?】面试题。希望对大家有帮助; MySQL中like模糊查询如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中,LIKE 模糊查询虽然非常常见,…...
用低代码平台集成人工智能:无需专业开发也能实现智能化
引言:人工智能的普及与企业需求 随着人工智能(AI)技术的飞速发展,越来越多的企业开始意识到其在提升运营效率、优化客户体验和推动业务创新方面的巨大潜力。从智能客服到自动化决策支持,从数据分析到个性化推荐&#x…...
【使用hexo模板创建个人博客网站】
使用hexo模板创建个人博客网站 环境准备node安装hexo安装ssh配置 使用hexo命令搭建个人博客网站hexo命令 部署到github创建仓库修改_config.yml文件 编写博客主题扩展 环境准备 node安装 进入node官网安装node.js 使用node -v检查是否安装成功 安装成功后应该出现如上界面 …...
最简单圆形进度条实现CSS+javascript,两端带圆弧
两端是弧形的圆形进度条。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title…...
vuejs 模板语法、条件渲染、v-for、事件处理、表单输入绑定
创建vue项目之后我们就可以开始写代码了,我们的代码一般都会写在src目录-components目录-HelloWord.vue文件内。 我们之前写的HTML文件的结构是HTML代码可以集成或者连接外部的css/js文件。 我们通过vue建立的项目,它的结构是在一个vue文件内集成了HTML…...
论文阅读方法
文章目录 步骤一:对论文进行自我判断阅读题目和关键词。阅读摘要阅读总结要点 步骤二:阅读文章阅读图表和图表的注释阅读引言阅读实验部分阅读结果和作者对结果的讨论(创新点)要点 步骤三:精度论文回答问题1回答问题2回…...
问题解决:Kali Linux 中配置启用 Vim 复制粘贴功能
在 Kali Linux 系统中,使用 XShell 或其他类似终端时,Vim 编辑器的默认设置并不支持直接进行复制和粘贴操作,这对于日常的开发工作或渗透测试人员来说可能会造成不便。幸运的是,通过简单的配置调整,可以让 Vim 轻松支持…...
Linux hexdump命令
hexdump 是 Linux 中一个强大的二进制文件查看工具,可以用于查看文件的十六进制、ASCII 或其他格式的转储内容。以下是常见用法及示例: 1. 查看文件头部(前 N 个字节) 语法 hexdump -n <字节数> -C <文件名>示例&am…...
Stable Diffusion教程|快速入门SD绘画原理与安装
什么是Stable Diffusion,什么是炼丹师?根据市场研究机构预测,到2025年全球AI绘画市场规模将达到100亿美元,其中Stable Diffusion(简称SD)作为一种先进的图像生成技术之一,市场份额也在不断增长&…...
系统架构设计师—系统架构设计篇—微服务架构
文章目录 概述优势挑战 概述 微服务是一种架构风格,将单体应用划分成一组小的服务,服务之间相互协作,实现业务功能,每个服务运营在独立的进程中,服务间采用轻量级的通信机制协作(通常是HTTP/JSON࿰…...
Array and string offset access syntax with curly braces is deprecated
警告信息 “Array and string offset access syntax with curly braces is deprecated” 是 PHP 中的一个弃用警告(Deprecation Notice),表明在 PHP 中使用花括号 {} 来访问数组或字符串的偏移量已经被标记为过时。 背景 在 PHP 的早期版本…...
腾讯元宝:AI 时代的快速论文阅读助手
1. 背景与需求 在 AI 研究领域,每天都会涌现大量学术论文。如何高效阅读并提取关键信息成为研究者的一大难题。腾讯元宝是腾讯推出的一款大模型,结合了**大语言模型(LLM)和自然语言处理(NLP)**技术&#x…...
基于单片机的风速报警装置设计
标题:基于单片机的风速报警装置设计 内容:1.摘要 本设计聚焦于基于单片机的风速报警装置,旨在解决传统风速监测缺乏实时报警功能的问题。采用单片机作为核心控制单元,结合风速传感器采集风速数据。经实验测试,该装置能准确测量 0 - 60m/s 范…...
1998-2022年各地级市第一产业占GDP比重/地级市第一产业占比数据(市辖区)
1998-2022年各地级市第一产业占GDP比重/地级市第一产业占比数据(市辖区) 1、时间:1998-2022年 2、指标:地级市第一产业占GDP比重/地级市第一产业占比 3、来源:城市统计年鉴 4、范围:299个地级市 5、缺…...
IntersectionObserver接口介绍
IntersectionObserver API 是浏览器提供的一个用于异步观察目标元素与其祖先元素或视口(Viewport)交叉状态(即是否进入或离开视口)的接口。在 IntersectionObserver 出现之前,开发者通常需要通过监听 scroll 事件或使用…...
墨语灵犀镜像灰度发布:Kubernetes滚动更新无感升级实践
墨语灵犀镜像灰度发布:Kubernetes滚动更新无感升级实践 1. 引言:优雅升级的艺术挑战 在现代应用部署中,如何实现平滑无感的服务升级一直是个技术难题。特别是对于「墨语灵犀」这样注重用户体验的深度翻译工具,任何服务中断或体验…...
DeepSeek-R1-Distill-Qwen-7B效果展示:复杂问题推理实测
DeepSeek-R1-Distill-Qwen-7B效果展示:复杂问题推理实测 1. 模型能力概览 DeepSeek-R1-Distill-Qwen-7B是DeepSeek团队基于Qwen架构开发的7B参数推理模型,通过强化学习训练和知识蒸馏技术优化,在数学推理、代码生成和逻辑分析任务上展现出卓…...
零代码驯服Qwen-2.5VL:LLaMA-Factory图形界面实战指南
1. 为什么你需要零代码驯服Qwen-2.5VL 想象一下,你手里有一台能看懂图片的AI机器人,但它总把工业零件认成厨房用具。传统解决方法需要你租用几十张显卡,像炼丹一样折腾几个月——但现在,有了LLaMA-Factory的图形界面,这…...
图片压缩与懒加载的完美结合:提升网站性能的终极指南
图片压缩与懒加载的完美结合:提升网站性能的终极指南 【免费下载链接】compressorjs compressorjs: 是一个JavaScript图像压缩库,使用浏览器原生的canvas.toBlob API进行图像压缩。 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs 在…...
KubeSphere Core 离线部署实战:从镜像搬运到私有仓库配置
1. 离线部署KubeSphere Core的核心挑战 在企业内网环境中部署KubeSphere Core时,最大的障碍就是如何解决容器镜像的获取问题。我去年给某金融机构做私有云改造时就遇到过这种情况——他们的生产环境完全隔离,所有服务器都无法直接访问公网。当时为了部署…...
【多模态实战】Swift框架高效微调Qwen2-VL:从SFT到RLHF的完整指南
1. 为什么选择Swift框架微调Qwen2-VL 第一次接触Qwen2-VL这个多模态大模型时,我被它强大的图文理解能力惊艳到了。但真正让我惊喜的是发现Swift框架能让模型微调变得如此简单。记得当时为了测试一个定制化需求,传统方法需要写上百行训练代码,…...
人形机器人强化学习实战:从奖励设计到PPO算法优化
1. 人形机器人强化学习入门:为什么奖励设计是关键 第一次接触人形机器人强化学习时,我被一个简单问题困扰了很久:为什么同样的算法,换个任务就要重新调参?后来发现问题的核心在于奖励函数设计。就像教小孩学走路&#…...
ArtnetnodeWifi:WiFi嵌入式Art-Net DMX节点实现
1. ArtnetnodeWifi 项目概述ArtnetnodeWifi 是一个面向嵌入式平台的轻量级 Art-Net 协议实现库,专为 WiFi 连接的微控制器设计。其核心目标是将 ESP8266、ESP32、MKR1000(WiFi101)、Nano 33 IoT(WiFiNINA)等具备 WiFi …...
TypeScript——声明合并
声明合并1、接口声明合并2、枚举声明合并3、类声明合并4、命名空间声明合并4.1、命名空间与命名空间合并4.2、 命名空间与函数合并4.3、 命名空间与类合并4.4、 命名空间与枚举合并5、扩充模块声明6、扩充全局声明声明是编程语言中的基础结构,它描述了一个标识符…...
OpenClaw技能扩展实战:用百川2-13B-4bits量化模型开发自定义自动化模块
OpenClaw技能扩展实战:用百川2-13B-4bits量化模型开发自定义自动化模块 1. 为什么选择百川2-13B-4bits量化模型 去年冬天,当我第一次尝试用本地部署的大模型开发OpenClaw技能时,显存不足的报错成了家常便饭。直到发现百川2-13B的4bits量化版…...
