前两篇分别讲了打包配置和编译流程,本文进入指定设备发布的最后关键环节——如何通过Deeplink让团队成员下载安装应用。这部分涉及应用描述文件(manifest.json5)、服务器配置要求、Deeplink格式等。
一、整体流程
核心步骤:
将编译得到的各个HAP/HSP 包上传至公司的服务器或第三方云上
获取 HAP/HSP 包下载 URL,下载 URL 必须以
https开头基于应用信息生成应用描述文件(例如
manifest.json5,文件名可自定义)将描述文件上传至服务器,获取其下载 URL
将描述文件 URL 构建成Deeplink,用于下载应用
二、应用描述文件(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", "2in1", "phone"], "packageUrl": "HAP包下载链接", "packageHash": "HAP包sha256值" }, { "name": "module2", "type": "feature", "deviceTypes": ["tablet", "2in1", "phone"], "packageUrl": "HAP包下载链接", "packageHash": "HAP包sha256值" }, { "name": "module3", "type": "shared", "deviceTypes": ["tablet", "2in1", "phone"], "packageUrl": "HSP包下载链接", "packageHash": "HSP包sha256值" } ], "sign": "描述文件签名" } }三、应用信息字段说明
1. 应用基础信息
| 属性 | 数据类型 | 必选/可选 | 说明 |
|---|---|---|---|
bundleName | 字符串 | M(必选) | 应用的 Bundle 名称 |
bundleType | 字符串 | M | 应用的 Bundle 类型,用于区分 HarmonyOS 应用或元服务。 当前仅支持配置为 "app",表示 HarmonyOS 应用 |
versionCode | 数值 | M | 应用的版本号 |
versionName | 字符串 | M | 应用版本号的文字描述 |
label | 字符串 | M | 应用的名称,建议与实际应用名称一致,否则会出现下载与安装过程中应用名不一致的问题 |
2. 部署与图标信息
| 属性 | 数据类型 | 必选/可选 | 说明 |
|---|---|---|---|
deployDomain | 字符串 | M | 应用、图标及描述文件的部署域名,需要与 icons、packageUrl 以及描述文件自身下载 URL 中的域名一致,且不可包含协议头或端口号,否则会导致下载失败 |
icons | 字符串 | M | 应用的图标,提供内部部署的图片下载地址,必须以https开头 |
minAPIVersion | 字符串 | M | 应用运行所需 SDK 的 API 最小版本,用于判断是否与当前设备兼容 |
targetAPIVersion | 字符串 | M | 应用运行所需的 API 目标版本,用于判断是否与当前设备兼容 |
3. modules 列表信息
| 属性 | 数据类型 | 必选/可选 | 说明 |
|---|---|---|---|
modules | 列表 | M | 应用分包 module 信息列表,以数组形态组织,其中至少包括一个 entry module 信息 |
name | 字符串 | M | module 的名称,该名称在整个应用须唯一 |
type | 字符串 | M | 应用 module 的类型,取值范围: • entry:应用的主模块• feature:应用的动态特性模块• shared:动态共享包模块(仅支持应用内共享包) |
deviceTypes | 字符串 | M | 当前 module 可以运行在哪类设备上,取值范围: • phone:手机• tablet:平板(原文表格在此处被截断,PC/2in1 未在可识别文本中出现) |
packageUrl | 字符串 | M | 当前 module 上传至服务器后生成的下载 URL,必须以https开头 |
packageHash | 字符串 | M | 当前 module 的 SHA256 值。 • Windows: certutil -hashfile 包路径 SHA256• Mac: shasum -a 256 包路径说明:“包路径”指应用 HAP/HSP 包在本地的存储路径 |
sign | 字符串 | M | 描述文件签名。 • Windows:可使用验证工具生成签名 • Mac:可采用以下任意一种方法生成签名: ① 将 .bat 文件中的命令转换成在 iOS 上运行的命令使用 ② Windows 模拟器运行 .bat 文件 |
四、Deeplink 构建与拉起条件
1. Deeplink 格式
store://enterprise/manifest?url=https://xxx.xxx/xxx.json5| 部分 | 值 |
|---|---|
| Scheme | store:// |
| Host | enterprise |
| Path | manifest |
| 参数 | 应用描述文件上传至服务器后生成的下载 URL,必须以https开头 |
2. 拉起条件
仅支持页面点击行为触发拉起
不支持地址栏输入 DeepLink 拉起
不支持HTML 头文件自动拉起
仅支持华为浏览器拉起
从华为浏览器拉起的所有行为,均需判断是否有用户点击行为,确认用户点击才允许拉起
3. 特殊字符处理
如果下载 URL 内包含特殊字符,还需进行特殊字符编码:
declare function encodeURIComponent(uriComponent: string | number | boolean): string;五、服务器配置要求
1. 基本要求
服务器提供应用描述文件和安装包的 HTTPS 下载链接
下载链接中的域名不支持 IP 地址
应用描述文件和安装包的下载链接,均需要支持通过 HEAD 方式请求返回文件大小
2. 自签证书要求(如使用)
如果服务器提供的 HTTPS 下载链接使用了自签证书,还需满足:
用户设备需要安装服务器自签证书对应的 CA 证书
自签证书有效期不超过 13 个月,超期请及时更换
3. 分片下载能力
配置服务器支持分片下载能力
建议验证方式:构造下载请求头包含
range字段,返回码为 206表示支持分片下载;反之则不支持
4. 响应头配置
需配置服务器返回的响应头,使得应用描述文件和应用包可正确传输下载
六、分发页面实现下载功能
1. HTML 页面触发 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>2. 应用更新场景(openlink 方式)
对于应用更新场景,可以使用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.'); }); }