React Native鸿蒙开发实战(八):打包发布与AppGallery上架

React Native鸿蒙开发实战(八):打包发布与AppGallery上架

一、引言

在前七篇系列文章中,我们系统学习了React Native鸿蒙开发的全流程,从环境搭建、组件布局、状态管理、路由导航、网络请求、原生能力调用到性能优化,已经掌握了构建高质量跨平台应用的核心技能。现在,我们来到了开发流程的最后一步------将精心打造的应用打包发布到应用商店,让更多用户能够使用我们的产品。

从第7篇的性能优化过渡到本篇,我们可以思考:如何将优化后的应用以最佳状态呈现给用户?如何确保应用在发布过程中不出现配置错误或安全问题?这正是打包发布与上架的核心价值所在。

二、应用打包配置

2.1 Android打包配置

应用签名配置:

在android/app/build.gradle中配置签名信息:

复制代码
android {
    signingConfigs {
        release {
            storeFile file('my-release-key.keystore')
            storePassword 'your_store_password'
            keyAlias 'your_key_alias'
            keyPassword 'your_key_password'
        }
    }
    
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            shrinkResources true
        }
    }
}

生成签名证书:

复制代码
# 生成签名证书
keytool -genkey -v -keystore my-release-key.keystore -alias your_key_alias -keyalg RSA -keysize 2048 -validity 10000

# 查看证书信息
keytool -list -v -keystore my-release-key.keystore

环境变量配置:

创建android/gradle.properties文件:

复制代码
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=your_key_alias
MYAPP_RELEASE_STORE_PASSWORD=your_store_password
MYAPP_RELEASE_KEY_PASSWORD=your_key_password

2.2 iOS打包配置

Xcode项目配置:

  1. 在Xcode中打开ios/YourApp.xcodeproj
  2. 选择项目 -> General -> Identity,配置Bundle Identifier
  3. 选择项目 -> Signing & Capabilities,配置Team和签名证书

Info.plist配置:

复制代码
<key>CFBundleDisplayName</key>
<string>Your App Name</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

2.3 鸿蒙应用配置

module.json5配置:

复制代码
{
  "app": {
    "bundleName": "com.yourcompany.yourapp",
    "vendor": "yourcompany",
    "versionCode": 1,
    "versionName": "1.0.0",
    "icon": "$media:app_icon",
    "label": "$string:app_name"
  },
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "MainAbility",
    "deviceTypes": [
      "phone",
      "tablet"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "MainAbility",
        "srcEntry": "./ets/MainAbility/MainAbility.ts",
        "description": "$string:MainAbility_desc",
        "icon": "$media:icon",
        "label": "$string:MainAbility_label",
        "startWindowIcon": "$media:icon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "actions": [
              "action.system.home"
            ],
            "entities": [
              "entity.system.home"
            ]
          }
        ]
      }
    ]
  }
}

三、打包构建流程

3.1 Android打包命令

生成APK文件:

复制代码
# 进入android目录
cd android

# 清理构建缓存
./gradlew clean

# 生成Release APK
./gradlew assembleRelease

# 生成带Bundle的APK(推荐)
./gradlew bundleRelease

# 生成APK并安装到设备
./gradlew installRelease

构建产物位置:

  • APK文件:android/app/build/outputs/apk/release/app-release.apk
  • AAB文件:android/app/build/outputs/bundle/release/app-release.aab

3.2 iOS打包命令

生成IPA文件:

复制代码
# 进入ios目录
cd ios

# 清理构建缓存
xcodebuild clean -workspace YourApp.xcworkspace -scheme YourApp

# 生成Archive
xcodebuild archive -workspace YourApp.xcworkspace -scheme YourApp -configuration Release -archivePath ./build/YourApp.xcarchive

# 导出IPA
xcodebuild -exportArchive -archivePath ./build/YourApp.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath ./build

ExportOptions.plist配置:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>app-store</string>
    <key>teamID</key>
    <string>YOUR_TEAM_ID</string>
    <key>uploadBitcode</key>
    <false/>
    <key>uploadSymbols</key>
    <true/>
</dict>
</plist>

3.3 鸿蒙应用打包

生成HAP文件:

复制代码
# 进入项目根目录
cd your-harmony-app

# 安装依赖
npm install

# 构建Release版本
npm run build

# 或者使用DevEco Studio
# 点击 Build -> Build Hap(s)/App(s) -> Build Hap

构建产物位置:

  • HAP文件:build/default/outputs/default/entry-default-signed.hap
  • APP文件:build/default/outputs/default/entry-default-signed.app

四、AppGallery上架流程

4.1 准备工作

注册华为开发者账号:

  1. 访问华为开发者联盟官网
  2. 注册个人或企业账号
  3. 完成实名认证和企业认证(企业应用需要)

准备应用信息:

  • 应用名称(中英文)
  • 应用图标(512×512像素,PNG格式)
  • 应用截图(至少3张,建议5张)
  • 应用描述(中英文)
  • 隐私政策链接
  • 应用分类

4.2 创建应用

创建新应用:

  1. 登录华为开发者联盟
  2. 进入"管理中心" -> "应用服务" -> "AppGallery Connect"
  3. 点击"我的应用" -> "创建应用"
  4. 填写应用基本信息: 应用名称 应用分类 默认语言 应用类型(游戏/应用)
  5. 点击"创建"

配置应用信息:

  1. 在应用详情页,完善"应用信息"
  2. 上传应用图标和截图
  3. 填写应用描述和功能介绍
  4. 设置隐私政策
  5. 配置价格和分发区域

4.3 上传应用包

上传APK/AAB文件:

  1. 在应用详情页,点击"版本管理"
  2. 点击"上传应用"
  3. 选择要上传的APK或AAB文件
  4. 等待系统自动解析应用信息
  5. 检查解析结果,确认无误后点击"保存"

配置版本信息:

  1. 填写版本号(必须大于上一个版本)
  2. 填写版本描述(更新内容)
  3. 设置最低兼容版本
  4. 配置权限说明
  5. 设置应用内购买(如有)

4.4 测试与审核

内部测试:

  1. 在"测试"页面,创建测试版本
  2. 添加测试人员(最多100人)
  3. 生成测试链接或二维码
  4. 分发测试版本,收集反馈

提交审核:

  1. 确认应用信息完整无误
  2. 点击"提交审核"
  3. 选择审核类型(普通审核/加急审核)
  4. 确认提交

审核状态跟踪:

  • 审核中:1-3个工作日
  • 审核通过:准备上架
  • 审核驳回:查看驳回原因,修改后重新提交

五、应用商店优化(ASO)

5.1 关键词优化

核心关键词策略:

  1. 应用名称:包含核心关键词,如"记账-个人理财助手"
  2. 应用描述:自然融入关键词,避免堆砌
  3. 关键词标签:选择5-10个相关关键词

关键词调研工具:

  • 华为开发者联盟关键词工具
  • 第三方ASO工具(如ASO114、蝉大师)

5.2 元数据优化

应用图标:

  • 尺寸:512×512像素,PNG格式
  • 设计:简洁明了,突出品牌特色
  • 颜色:与品牌色一致,对比度高

应用截图:

  • 数量:至少3张,建议5张
  • 尺寸:推荐1080×1920像素
  • 内容:展示核心功能,添加文字说明
  • 顺序:第一张最重要,展示核心价值

应用视频:

  • 时长:30-60秒
  • 内容:演示核心功能,突出产品亮点
  • 格式:MP4,720P以上

5.3 用户评价与评分

引导用户评价:

复制代码
import { Linking, Alert } from 'react-native';

const openAppStore = () => {
  Linking.openURL('market://details?id=com.yourcompany.yourapp')
    .catch(() => {
      Alert.alert('提示', '无法打开应用商店');
    });
};

// 在合适时机提示用户评价
const promptRating = () => {
  Alert.alert(
    '喜欢这个应用吗?',
    '给个好评支持我们吧!',
    [
      { text: '取消', style: 'cancel' },
      { text: '去评价', onPress: openAppStore }
    ]
  );
};

处理负面评价:

  1. 及时回复用户反馈
  2. 了解问题原因,提供解决方案
  3. 在后续版本中修复问题

六、版本管理与更新

6.1 版本号规范

语义化版本号:

  • 主版本号(Major):不兼容的API修改
  • 次版本号(Minor):向下兼容的功能性新增
  • 修订号(Patch):向下兼容的问题修正

示例:1.2.3表示第1个大版本,第2次功能更新,第3次问题修复

Android版本配置:

复制代码
android {
    defaultConfig {
        versionCode 1002003  // 1.2.3 -> 1002003
        versionName "1.2.3"
    }
}

iOS版本配置:

在Xcode中设置Version和Build Number

6.2 热更新方案

使用CodePush热更新:

复制代码
# 安装CodePush
npm install react-native-code-push --save

# 安装CodePush CLI
npm install -g code-push-cli

# 注册CodePush应用
code-push app add YourApp-Android android react-native
code-push app add YourApp-iOS ios react-native

集成CodePush:

复制代码
import codePush from 'react-native-code-push';

// 手动检查更新
const checkForUpdate = async () => {
  const update = await codePush.checkForUpdate();
  if (update) {
    Alert.alert(
      '发现新版本',
      '是否立即更新?',
      [
        { text: '取消', style: 'cancel' },
        { text: '更新', onPress: () => codePush.sync() }
      ]
    );
  }
};

// 自动静默更新
codePush.sync({
  installMode: codePush.InstallMode.ON_NEXT_RESTART,
  updateDialog: {
    appendReleaseDescription: true,
    descriptionPrefix: '\n\n更新内容:\n',
    title: '发现新版本',
    mandatoryUpdateMessage: '',
    mandatoryContinueButtonLabel: '更新',
  },
});

发布热更新:

复制代码
# 发布Android更新
code-push release-react YourApp-Android android --description "修复已知问题"

# 发布iOS更新
code-push release-react YourApp-iOS ios --description "修复已知问题"

# 发布强制更新
code-push release-react YourApp-Android android --mandatory true

# 发布灰度更新
code-push release-react YourApp-Android android --rollout 50%

6.3 版本发布策略

灰度发布流程:

  1. 内部测试:开发团队和测试人员验证
  2. 小范围灰度:5%-10%用户,收集反馈
  3. 逐步放量:50%用户,监控崩溃率和性能指标
  4. 全量发布:100%用户,持续监控

版本回滚机制:

  1. 准备回滚包:保留上一个稳定版本的安装包
  2. 监控关键指标:崩溃率、启动失败率、用户反馈
  3. 快速响应:发现问题后30分钟内决定是否回滚
  4. 回滚操作:在应用商店后台回滚版本

七、应用安全与合规

7.1 代码混淆与加固

Android代码混淆:

复制代码
// android/app/proguard-rules.pro
-keep class com.facebook.react.** { *; }
-keep class com.facebook.hermes.unicode.** { *; }
-keep class com.facebook.jni.** { *; }

# 保留React Native相关类
-keep class com.facebook.react.bridge.** { *; }
-keep class com.facebook.react.uimanager.** { *; }
-keep class com.facebook.react.views.** { *; }

# 保留第三方库
-keep class com.yourcompany.yourapp.** { *; }

使用第三方加固服务:

  • 腾讯乐固
  • 360加固保
  • 梆梆安全

7.2 数据安全

敏感数据加密:

复制代码
import CryptoJS from 'crypto-js';

const encryptData = (data, key) => {
  return CryptoJS.AES.encrypt(JSON.stringify(data), key).toString();
};

const decryptData = (encryptedData, key) => {
  const bytes = CryptoJS.AES.decrypt(encryptedData, key);
  return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
};

网络请求加密:

复制代码
import axios from 'axios';

const api = axios.create({
  baseURL: 'https://api.yourcompany.com',
  httpsAgent: new https.Agent({
    rejectUnauthorized: true,
  }),
});

// 添加请求拦截器
api.interceptors.request.use((config) => {
  config.headers['Authorization'] = `Bearer ${token}`;
  return config;
});

7.3 隐私合规

隐私政策配置:

  1. 在应用首次启动时展示隐私政策
  2. 获取用户同意后才能收集数据
  3. 提供隐私政策查看入口

权限申请说明:

复制代码
import { PermissionsAndroid, Alert } from 'react-native';

const requestPermission = async (permission, rationale) => {
  try {
    const granted = await PermissionsAndroid.request(
      permission,
      rationale
    );
    return granted === PermissionsAndroid.RESULTS.GRANTED;
  } catch (err) {
    console.warn(err);
    return false;
  }
};

// 申请相机权限
const requestCameraPermission = async () => {
  return await requestPermission(
    PermissionsAndroid.PERMISSIONS.CAMERA,
    {
      title: '相机权限申请',
      message: '应用需要访问相机以拍摄照片',
      buttonNeutral: '稍后询问',
      buttonNegative: '取消',
      buttonPositive: '确定',
    }
  );
};

八、总结

8.1 核心要点回顾

通过本篇的学习,我们掌握了React Native鸿蒙应用的打包发布与上架全流程:

  1. 打包配置:掌握了Android、iOS和鸿蒙应用的签名配置和打包命令
  2. AppGallery上架:了解了从创建应用到提交审核的完整流程
  3. ASO优化:学习了应用商店优化的核心策略,包括关键词优化、元数据优化和用户评价管理
  4. 版本管理:掌握了版本号规范、热更新方案和灰度发布策略
  5. 安全合规:了解了代码混淆、数据加密和隐私合规的重要性

8.2 常见问题解决方案

问题1:签名证书错误

  • 解决方案:检查签名配置是否正确,确认证书文件和密码无误

问题2:应用审核被驳回

  • 解决方案:仔细阅读驳回原因,修改应用内容后重新提交

问题3:热更新失败

  • 解决方案:检查CodePush配置是否正确,确认网络连接正常

问题4:应用崩溃率过高

  • 解决方案:使用崩溃监控工具定位问题,及时发布修复版本

8.3 系列文章总结

回顾整个《React Native鸿蒙开发实战》系列,我们从零开始,系统学习了:

  1. 环境搭建:配置开发环境,创建第一个应用
  2. 基础组件:掌握核心组件和Flex布局
  3. 状态管理:使用useState、useEffect等Hook管理状态
  4. 路由导航:实现多页面应用的路由跳转
  5. 网络请求:使用Fetch和Axios进行数据交互
  6. 原生能力:调用相机、定位、蓝牙等设备API
  7. 性能优化:使用Profiler监控性能,优化内存和渲染
  8. 打包发布:将应用打包上架到AppGallery

通过这8篇系列文章的学习,您已经掌握了React Native鸿蒙开发的全栈技能,能够独立完成从需求分析、开发实现到打包上架的完整流程。希望这些知识能够帮助您在鸿蒙生态中开发出更多优秀的应用!

后续学习建议:

  • 深入学习鸿蒙分布式能力,开发多设备协同应用
  • 探索AI和机器学习在移动端的应用
  • 关注React Native新架构(Fabric和TurboModules)的演进
  • 参与开源社区,贡献代码和分享经验

祝您在鸿蒙开发的道路上越走越远,创造出更多改变世界的产品!

相关推荐
特立独行的猫a3 小时前
用仓颉写一个 Tauri:IPC 的每次往返实现原理(web层到仓颉层的触发过程)
前端·ui·harmonyos·tauri·鸿蒙·仓颉
2501_919749034 小时前
华为鸿蒙桌面时钟与悬浮时钟APP—小羊时钟
华为·harmonyos
HwJack205 小时前
【共创稿事节】HarmonyOS 7空间交互综述:视线、头部、手势的协同
数码相机·交互·harmonyos
李游Leo6 小时前
HarmonyOS 7 ArkUI + Window Kit:折叠屏编辑页的键盘避让快照与焦点恢复时序【鸿蒙心迹】
华为·计算机外设·harmonyos
李游Leo7 小时前
HarmonyOS 7 HSP + Localization Kit:共享组件资源导出、语言回退与相对路径失效诊断【鸿蒙心迹】
harmonyos
m0_738185827 小时前
Flutter 鸿蒙化实战:flutter_nfc_kit 适配 OpenHarmony,NFC 读写一步到位
flutter·华为·harmonyos·鸿蒙
李游Leo7 小时前
HarmonyOS 7 TaskPool + Node-API + zstd:Native 批量压缩任务的主线程隔离、进度回传与资源收口【鸿蒙心迹】
java·华为·harmonyos
李游Leo8 小时前
HarmonyOS ArkUI Navigation + GridRow:折叠态切换后的双栏路由恢复与返回栈收敛【鸿蒙心迹】
华为·harmonyos
HwJack208 小时前
【共创稿事节】HarmonyOS 7是3DGS 端侧重建:空间建模类应用的设计机会
3d·华为·harmonyos
传奇开心果编程8 小时前
【ArkUI进阶练中学】第5课:编译优化与包体积进
学习·ui·华为·harmonyos