HarmonyOS 应用邀请测试和公开测试流程
一、简介
本文主要介绍 HarmonyOS 应用的邀请测试和公开测试流程,邀请测试可邀请不超过 10000 人的小范围用户,支持 100 个版本同时测试,需发布到测试专区;公开测试面向全网用户,下载安装次数上限 1000 万次,仅支持 1 个版本。测试前需满足 API≥10 且仅分发中国大陆等前提条件,还介绍了创建测试用户、版本,通知用户、收集反馈、停止测试等步骤,以及测试版本转正式版本的约束条件和操作,还有修改测试时间和下载安装次数的方法。
二、测试发布方式概览
测试阶段 | 邀请测试 | 公开测试 |
面向对象 | 可邀请友好、信任的小范围用户 | 面向全网所有用户公开招募测试 |
邀请人数 | 上限 10000 人 | 下载安装次数上限 1000 万次 |
支持同时测试的版本数 | 100 个 | 1 个 |
发布 AppGallery 测试专区 | 必须 | 可选 |
是否支持分享链接 | 支持 | 支持 |
三、前提条件
- HarmonyOS 应用 / 元服务的 API≥10,仅支持分发中国大陆地区。
- 登录 AppGallery Connect,创建 HarmonyOS 应用 / 元服务后,在 “分发” tab 页下可见 “应用测试” 菜单。
四、邀请测试流程
(一)创建测试用户
- 点击 “测试用户” 菜单,创建测试群组,最多 30 个,所有群组累计测试用户不超过 10000 个。
- 添加测试用户有三种方式:
- 单个添加:手动输入华为账号(邮箱或手机号,手机号按 “国家码 - 手机号” 格式)。
- 批量导入:使用.csv 格式文件,上限 10000 个账号。
- 邀请码添加:生成邀请码,有效期 30 天,可设置邀请上限 10000 人,需将邀请码拼接到测试版本分享链接上。
(二)创建测试版本
- 进入 “版本列表”,选择 “邀请测试”,填写版本描述。
- 配置基础信息(测试时间最长 90 天、支持设备)、测试包、测试信息(应用图标、介绍等)、隐私声明等。
- 选择测试用户群组(不超过 30 个),可生成分享链接,提交审核。
(三)通知用户参与测试
- 系统自动发送邮件 / 短信,用户首次需同意加入群组;也可手动复制分享链接给用户,或拼接邀请码后分享。
(四)收集用户反馈
在测试说明中预留联系方式,收集问题并优化。
(五)停止测试
- 手动停止后状态变为 “已失效”,新用户不能下载,已安装用户可使用至安装后 90 天。
五、公开测试流程
(一)创建测试版本
- 选择 “公开测试”,填写版本描述,配置基础信息(测试时间最长 30 天)、发布国家或地区、软件版本(类型为 “仅测试” 或 “测试和正式上架”)。
- 配置可本地化基础信息(应用名称、介绍等)、付费情况、内容分级、隐私声明等多项信息,提交审核。
(二)用户参与测试
- 若选择 “AppGallery 客户端测试专区”,版本在专区展示,下载次数达上限后不再显示;若生成分享链接,用户点击链接下载安装。
(三)停止测试
同邀请测试,已安装用户使用期限 90 天。
六、测试版本转正式版本
(一)约束条件
- 仅公开测试阶段、状态为 “正在测试”、软件包类型为 “测试和正式上架”、VersionCode≥正式版本、无 “待上架” 或 “待审核” 版本、发布国家包含中国大陆的版本支持推进。
(二)推进方式
- 全网发布:选择 “审核通过立即上架” 或 “指定时间”。
- 分阶段发布:设置生效时间、发布百分比(0-100%)、分阶段发布说明,生效结束后自动转全网发布。
七、修改测试时间和下载安装次数
(一)修改测试时间
- 等待生效时可修改开始和结束时间,若开始时间改为当前之前,状态立即变 “正在测试”;正在测试时仅可修改结束时间。
(二)修改下载安装次数
- 公开测试版本状态为等待生效 / 正在测试时,可修改下载安装次数,上限 1000 万次。
import router from **********'; import http from **********'; import common from **********'; import promptAction from **********'; @Entry @Component struct AppTestDashboard { // 测试状态(0:未参与 1:邀请测试中 2:公开测试中 3:已结束) @State testStatus: number = 0; // 测试版本信息 @State versionInfo: string = ''; // 用户反馈内容 @State feedbackContent: string = ''; // 联系方式 @State contactInfo: string = ''; // 反馈类型 @State feedbackType: string = 'bug'; // 页面构建 build() { Column() { // 测试状态卡片 this.buildStatusCard() // 反馈表单 if (this.testStatus === 1 || this.testStatus === 2) { this.buildFeedbackForm() } // 测试结束提示 if (this.testStatus === 3) { Text('测试已结束,感谢您的参与!') .fontSize(18) .fontColor('#666') .margin({ top: 30 }) } } .padding(20) .width('100%') .height('100%') .backgroundColor('#F8F9FA') .onPageShow(() => { this.checkTestStatus(); }) } // 构建状态卡片 @Builder buildStatusCard() { Column() { // 状态标题 Text(this.getStatusTitle()) .fontSize(22) .fontWeight(FontWeight.Bold) .margin({ bottom: 10 }) // 版本信息 Text(this.versionInfo || '正在获取版本信息...') .fontSize(16) .margin({ bottom: 15 }) // 操作按钮 if (this.testStatus === 0) { Button('加入邀请测试') .width('80%') .height(50) .onClick(() => this.joinInviteTest()) } else if (this.testStatus === 1 || this.testStatus === 2) { Row() { Button('查看测试说明') .layoutWeight(1) .onClick(() => this.openTestGuide()) Button('分享测试链接') .layoutWeight(1) .margin({ left: 10 }) .onClick(() => this.shareTestLink()) } .width('80%') .height(50) .margin({ top: 10 }) } } .padding(20) .borderRadius(16) .backgroundColor(Color.White) .shadow({ radius: 8, color: '#00000010', offsetX: 2, offsetY: 2 }) } // 构建反馈表单 @Builder buildFeedbackForm() { Column() { Text('问题反馈') .fontSize(20) .fontWeight(FontWeight.Medium) .margin({ top: 30, bottom: 15 }) .alignSelf(HorizontalAlign.Start) // 反馈类型选择 RadioGroup({ group: 'feedbackType' }) { Radio({ value: 'bug' }).checked(true).text('BUG报告') .fontSize(16) .margin({ right: 20 }) Radio({ value: 'suggestion' }).text('功能建议') .fontSize(16) .margin({ right: 20 }) Radio({ value: 'other' }).text('其他问题') .fontSize(16) } .onChange(value => this.feedbackType = value) .margin({ bottom: 20 }) // 反馈内容 TextArea({ placeholder: '请详细描述您遇到的问题或建议...' }) .height(150) .width('100%') .fontSize(16) .borderRadius(8) .backgroundColor('#FFFFFF') .onChange(value => this.feedbackContent = value) // 联系方式 TextInput({ placeholder: '邮箱/手机号(选填)' }) .width('100%') .height(50) .margin({ top: 15 }) .fontSize(16) .backgroundColor('#FFFFFF') .borderRadius(8) .onChange(value => this.contactInfo = value) // 提交按钮 Button('提交反馈') .type(ButtonType.Capsule) .width('60%') .height(45) .backgroundColor('#007DFF') .margin({ top: 25 }) .onClick(() => this.submitFeedback()) } .padding(20) .borderRadius(16) .backgroundColor(Color.White) .shadow({ radius: 8, color: '#00000010', offsetX: 2, offsetY: 2 }) .margin({ top: 20 }) } // 获取状态标题 private getStatusTitle(): string { switch (this.testStatus) { case 1: return '🎉 您正在参与邀请测试'; case 2: return '🔍 您正在参与公开测试'; case 3: return '⏱️ 测试已结束'; default: return '🔒 未参与测试'; } } // 检查测试状态 private async checkTestStatus() { try { // 模拟API调用获取测试状态 // 实际项目中替换为真实API: https://connect-api.cloud.huawei.com/api/test/status await new Promise(resolve => setTimeout(resolve, 800)); // 模拟返回数据 this.testStatus = 1; // 实际根据API响应设置 this.versionInfo = '测试版本 v2.1.0 (Build 210)\n有效期至: 2025-10-31'; } catch (error) { console.error('获取测试状态失败:', error); promptAction.showToast({ message: '网络异常,请稍后重试', duration: 2000 }); } } // 加入邀请测试 private joinInviteTest() { // 实际项目中调用AGC邀请码API router.pushUrl({ url: 'pages/InviteTestPage' }); } // 打开测试说明 private openTestGuide() { router.pushUrl({ url: 'pages/TestGuidePage' }); } // 分享测试链接 private shareTestLink() { // 调用系统分享能力 const shareData = { title: '参与应用测试', url: 'https://developer.harmonyos.com/test/invite?code=TEST12345' }; try { // 实际项目使用系统分享API console.info('分享链接:', shareData.url); promptAction.showToast({ message: '已复制测试链接到剪贴板', duration: 2000 }); } catch (error) { console.error('分享失败:', error); } } // 提交反馈 private async submitFeedback() { if (!this.feedbackContent.trim()) { promptAction.showToast({ message: '请填写反馈内容', duration: 2000 }); return; } try { // 构建反馈数据 const feedbackData = { type: this.feedbackType, content: this.feedbackContent, contact: this.contactInfo, version: 'v2.1.0', timestamp: new Date().toISOString() }; // 实际项目调用AGC反馈收集API // const httpRequest = http.createHttp(); // const response = await httpRequest.request( // "https://connect-api.cloud.huawei.com/api/feedback/submit", // { // method: http.RequestMethod.POST, // header: { 'Content-Type': 'application/json' }, // extraData: JSON.stringify(feedbackData) // } // ); // 模拟提交成功 await new Promise(resolve => setTimeout(resolve, 1000)); this.feedbackContent = ''; this.contactInfo = ''; promptAction.showToast({ message: '反馈提交成功!', duration: 3000 }); } catch (error) { console.error('提交反馈失败:', error); promptAction.showToast({ message: '提交失败,请检查网络', duration: 2000 }); } } }
##HarmonyOS应用测试##商务##