HarmonyOS 应用邀请测试和公开测试流程

2025-06-20 17:24:07
147次阅读
0个评论
最后修改时间:2025-07-21 23:31:52

一、简介

本文主要介绍 HarmonyOS 应用的邀请测试和公开测试流程,邀请测试可邀请不超过 10000 人的小范围用户,支持 100 个版本同时测试,需发布到测试专区;公开测试面向全网用户,下载安装次数上限 1000 万次,仅支持 1 个版本。测试前需满足 API≥10 且仅分发中国大陆等前提条件,还介绍了创建测试用户、版本,通知用户、收集反馈、停止测试等步骤,以及测试版本转正式版本的约束条件和操作,还有修改测试时间和下载安装次数的方法。

20250616132221.png

二、测试发布方式概览

测试阶段 邀请测试 公开测试
面向对象 可邀请友好、信任的小范围用户 面向全网所有用户公开招募测试
邀请人数 上限 10000 人 下载安装次数上限 1000 万次
支持同时测试的版本数 100 个 1 个
发布 AppGallery 测试专区 必须 可选
是否支持分享链接 支持 支持

三、前提条件

  • HarmonyOS 应用 / 元服务的 API≥10,仅支持分发中国大陆地区。
  • 登录 AppGallery Connect,创建 HarmonyOS 应用 / 元服务后,在 “分发” tab 页下可见 “应用测试” 菜单。

四、邀请测试流程

(一)创建测试用户
  1. 点击 “测试用户” 菜单,创建测试群组,最多 30 个,所有群组累计测试用户不超过 10000 个。
  2. 添加测试用户有三种方式:
  • 单个添加:手动输入华为账号(邮箱或手机号,手机号按 “国家码 - 手机号” 格式)。
  • 批量导入:使用.csv 格式文件,上限 10000 个账号。
  • 邀请码添加:生成邀请码,有效期 30 天,可设置邀请上限 10000 人,需将邀请码拼接到测试版本分享链接上。
(二)创建测试版本
  1. 进入 “版本列表”,选择 “邀请测试”,填写版本描述。
  2. 配置基础信息(测试时间最长 90 天、支持设备)、测试包、测试信息(应用图标、介绍等)、隐私声明等。
  3. 选择测试用户群组(不超过 30 个),可生成分享链接,提交审核。
(三)通知用户参与测试
  • 系统自动发送邮件 / 短信,用户首次需同意加入群组;也可手动复制分享链接给用户,或拼接邀请码后分享。
(四)收集用户反馈

在测试说明中预留联系方式,收集问题并优化。

(五)停止测试
  • 手动停止后状态变为 “已失效”,新用户不能下载,已安装用户可使用至安装后 90 天。

五、公开测试流程

(一)创建测试版本
  1. 选择 “公开测试”,填写版本描述,配置基础信息(测试时间最长 30 天)、发布国家或地区、软件版本(类型为 “仅测试” 或 “测试和正式上架”)。
  2. 配置可本地化基础信息(应用名称、介绍等)、付费情况、内容分级、隐私声明等多项信息,提交审核。
(二)用户参与测试
  • 若选择 “AppGallery 客户端测试专区”,版本在专区展示,下载次数达上限后不再显示;若生成分享链接,用户点击链接下载安装。
(三)停止测试

同邀请测试,已安装用户使用期限 90 天。

六、测试版本转正式版本

(一)约束条件
  • 仅公开测试阶段、状态为 “正在测试”、软件包类型为 “测试和正式上架”、VersionCode≥正式版本、无 “待上架” 或 “待审核” 版本、发布国家包含中国大陆的版本支持推进。
(二)推进方式
  1. 全网发布:选择 “审核通过立即上架” 或 “指定时间”。
  2. 分阶段发布:设置生效时间、发布百分比(0-100%)、分阶段发布说明,生效结束后自动转全网发布。

七、修改测试时间和下载安装次数

(一)修改测试时间
  • 等待生效时可修改开始和结束时间,若开始时间改为当前之前,状态立即变 “正在测试”;正在测试时仅可修改结束时间。
(二)修改下载安装次数
  • 公开测试版本状态为等待生效 / 正在测试时,可修改下载安装次数,上限 1000 万次。
import http from '@ohos.net.http';
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';

@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应用测试##商务##

收藏00

登录 后评论。没有帐号? 注册 一个。