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)的演进
  • 参与开源社区,贡献代码和分享经验

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

相关推荐
L、2182 小时前
状态共享新范式:在 Flutter + OpenHarmony 应用中实现跨框架状态同步(Riverpod + ArkState)
javascript·华为·智能手机·electron·harmonyos
晚霞的不甘2 小时前
[鸿蒙2025领航者闯关]鸿蒙实战进阶:多端协同与性能优化实践心得
华为·性能优化·harmonyos
ezeroyoung2 小时前
Flutter HarmonyOS 键盘高度监听插件开发指南
flutter·计算机外设·harmonyos
爱吃大芒果11 小时前
GitCode口袋工具的部署运行教程
flutter·华为·harmonyos·gitcode
爱吃大芒果11 小时前
Flutter基础入门与核心能力构建——Widget、State与BuildContext核心解析
flutter·华为·harmonyos
wordbaby11 小时前
Expo 进阶指南:赋予 TanStack Query “原生感知力” —— 深度解析 AppState 与 NetInfo
前端·react native
wordbaby14 小时前
Expo (React Native) 最佳实践:TanStack Query 深度集成指南
前端·react native
威哥爱编程15 小时前
【鸿蒙开发案例篇】鸿蒙6.0计算器实现详解
harmonyos·arkts·arkui
wordbaby15 小时前
Expo (React Native) 本地存储全攻略:普通数据与敏感数据该存哪?
前端·react native