HarmonyOS鸿蒙Next中要在APP内实现开发,测试,生产环境切换等Demo

HarmonyOS鸿蒙Next中要在APP内实现开发,测试,生产环境切换等Demo 【问题描述】:想要根据订阅系统环境变量变化能力,在APP内实现开发,测试,生产环境切换,寻求Demo

【问题现象】:不涉及

【版本信息】:不涉及

【复现代码】:不涉及

【尝试解决方案】:不涉及

cke_27918.png


更多关于HarmonyOS鸿蒙Next中要在APP内实现开发,测试,生产环境切换等Demo的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

如果是在app内切换访问后台的域名环境:测试环境域名,生产环境域名,这种的话倒是可以的:

实现方式是这样:1. 将域名提取出来,通过方法来获取域名。2. 在切换域名的地方通过持久化缓存记录选择的域名环境,3. 最后在项目的启动页面,获取域名环境,并将这个值用在域名方法内,至此就达到了动态切换域名环境了。

其中最重要的一点:就是在切换完域名之后要重启下,使其生效。下面的是重启app的方法。

let wantInfo: Want = {
  bundleName: 'bundleName',
  abilityName: 'EntryAbility' // 启动项
};
getContext().getApplicationContext().restartApp(wantInfo);

更多关于HarmonyOS鸿蒙Next中要在APP内实现开发,测试,生产环境切换等Demo的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


小伙伴你好,在编译构建时,Hvigor 会生成 BuildProfile 类,开发者可以通过该类在运行时获取编译构建参数,也可以在 build-profile.json5 中通过 buildProfileFields 增加自定义字段,从而在运行时获取自定义的参数。

1.在工程级 build_profile.json5 中新增自定义编译构建产物,新增自定义编译构建参数。自定义参数 value 取值仅支持 number、string、boolean 类型。

{
  "app": {
    "products": [
      {
        "name": "default", // 默认产物名称
        "signingConfig": "default",
        "compatibleSdkVersion": "5.0.0(12)",
        "runtimeOS": "HarmonyOS",
        "buildOption": {
          "strictMode": {
            "caseSensitiveCheck": true,
            "useNormalizedOHMUrl": true
          },
          "arkOptions": {
            "buildProfileFields": {
              // 自定义构建参数,默认产物该参数设置为false。
              "isAppTest": false
            }
          }
        }
      },
      {
       "name": "test", // 自定义产物名称
       "signingConfig": "default",
       "compatibleSdkVersion": "5.0.0(12)",
       "runtimeOS": "HarmonyOS",
       "buildOption": {
         "strictMode": {
           "caseSensitiveCheck": true,
           "useNormalizedOHMUrl": true
         },
         "arkOptions": {
           "buildProfileFields": {
             // 自定义编译构建参数,测试版本该参数设置为true。
             "isAppTest": true
           }
         }
       }
     }
    ]
  }
}

3.在工程级build-profile.json5中关联product。

  "modules": [
   {
     "name": "entry",
     "srcPath": "./entry",
     "targets": [
       {
         "name": "default",
         "applyToProducts": [
           "default",
           "test", // 关联自定义product
         ]
       }
     ]
   }
 ]

5.在业务代码中获取自定义编译参数,根据不同的参数,执行不同分支。

import BuildProfile from 'BuildProfile';

if (BuildProfile.isAppTest) {
  // 测试版本逻辑
} else {
  // 正式版本逻辑
}

6.选择不同的product进行编译构建。

参考文档

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-get-build-profile-para-guide#section8279154125918

鸿蒙Next应用内环境切换可通过配置管理模块实现。使用@ohos.app.ability.Configuration类管理不同环境配置,结合Stage模型的应用级配置。通过Preferences或轻量级存储保存环境标识,动态加载对应资源配置文件。利用条件编译和模块化设计隔离环境差异代码。

在HarmonyOS Next中实现多环境切换,可以通过配置管理结合环境变量来实现。以下是核心实现思路和代码示例:

1. 环境配置定义

创建EnvConfig.ets文件定义环境枚举和配置:

// EnvConfig.ets
export enum Environment {
  DEV = 'dev',
  TEST = 'test',
  PROD = 'prod'
}

export const envConfigs = {
  [Environment.DEV]: {
    apiBaseUrl: 'https://dev.api.example.com',
    logLevel: 'debug',
    featureFlags: { /* 开发特性开关 */ }
  },
  [Environment.TEST]: {
    apiBaseUrl: 'https://test.api.example.com',
    logLevel: 'info',
    featureFlags: { /* 测试特性开关 */ }
  },
  [Environment.PROD]: {
    apiBaseUrl: 'https://api.example.com',
    logLevel: 'warn',
    featureFlags: { /* 生产特性开关 */ }
  }
};

2. 环境管理类

创建EnvironmentManager.ets管理环境状态:

// EnvironmentManager.ets
import { Environment, envConfigs } from './EnvConfig';
import { emitter } from '@kit.EventKit';

export class EnvironmentManager {
  private currentEnv: Environment = Environment.DEV;
  private envChangeEmitter = new emitter.EventEmitter();

  // 获取当前环境配置
  getCurrentConfig() {
    return envConfigs[this.currentEnv];
  }

  // 切换环境
  switchEnvironment(env: Environment) {
    if (this.currentEnv !== env) {
      this.currentEnv = env;
      this.envChangeEmitter.emit('envChanged', env);
    }
  }

  // 订阅环境变化
  onEnvironmentChange(callback: (env: Environment) => void) {
    this.envChangeEmitter.on('envChanged', callback);
  }

  // 取消订阅
  offEnvironmentChange(callback: (env: Environment) => void) {
    this.envChangeEmitter.off('envChanged', callback);
  }
}

export const envManager = new EnvironmentManager();

3. 应用配置

AppScope/app.json5中配置环境变量:

{
  "app": {
    "bundleName": "com.example.app",
    "versionCode": 1,
    "versionName": "1.0.0",
    "env": {
      "default": "dev",
      "environments": {
        "dev": {
          "apiBaseUrl": "https://dev.api.example.com"
        },
        "test": {
          "apiBaseUrl": "https://test.api.example.com"
        },
        "prod": {
          "apiBaseUrl": "https://api.example.com"
        }
      }
    }
  }
}

4. 使用示例

在页面中实现环境切换:

// Index.ets
import { envManager } from '../model/EnvironmentManager';
import { Environment } from '../model/EnvConfig';

@Entry
@Component
struct Index {
  @State currentEnv: string = envManager.getCurrentConfig().apiBaseUrl;

  aboutToAppear() {
    // 订阅环境变化
    envManager.onEnvironmentChange((env: Environment) => {
      this.currentEnv = envManager.getCurrentConfig().apiBaseUrl;
    });
  }

  build() {
    Column() {
      Text(`当前环境: ${this.currentEnv}`)
        .fontSize(20)
        .margin(10)

      Button('切换到开发环境')
        .onClick(() => envManager.switchEnvironment(Environment.DEV))
        .margin(5)

      Button('切换到测试环境')
        .onClick(() => envManager.switchEnvironment(Environment.TEST))
        .margin(5)

      Button('切换到生产环境')
        .onClick(() => envManager.switchEnvironment(Environment.PROD))
        .margin(5)
    }
  }
}

5. 构建配置

build-profile.json5中配置不同环境的构建参数:

{
  "app": {
    "signingConfigs": [],
    "products": [
      {
        "name": "dev",
        "signingConfig": "default",
        "compileSdkVersion": 11,
        "compatibleSdkVersion": 11,
        "runtimeOS": "HarmonyOS"
      },
      {
        "name": "prod",
        "signingConfig": "release",
        "compileSdkVersion": 11,
        "compatibleSdkVersion": 11,
        "runtimeOS": "HarmonyOS"
      }
    ]
  }
}

关键点说明:

  1. 环境隔离:通过枚举明确区分不同环境
  2. 配置集中管理:所有环境相关配置统一在EnvConfig中维护
  3. 事件驱动:使用EventEmitter实现环境变化的订阅通知
  4. 运行时切换:支持应用运行时的环境动态切换
  5. 类型安全:使用TypeScript确保配置访问的类型安全

这种实现方式支持开发期快速切换环境进行调试,也支持测试阶段验证不同环境的功能表现。

回到顶部