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项目配置:
- 在Xcode中打开
ios/YourApp.xcodeproj - 选择项目 -> General -> Identity,配置Bundle Identifier
- 选择项目 -> 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 准备工作
注册华为开发者账号:
- 访问华为开发者联盟官网
- 注册个人或企业账号
- 完成实名认证和企业认证(企业应用需要)
准备应用信息:
- 应用名称(中英文)
- 应用图标(512×512像素,PNG格式)
- 应用截图(至少3张,建议5张)
- 应用描述(中英文)
- 隐私政策链接
- 应用分类
4.2 创建应用
创建新应用:
- 登录华为开发者联盟
- 进入"管理中心" -> "应用服务" -> "AppGallery Connect"
- 点击"我的应用" -> "创建应用"
- 填写应用基本信息: 应用名称 应用分类 默认语言 应用类型(游戏/应用)
- 点击"创建"
配置应用信息:
- 在应用详情页,完善"应用信息"
- 上传应用图标和截图
- 填写应用描述和功能介绍
- 设置隐私政策
- 配置价格和分发区域
4.3 上传应用包
上传APK/AAB文件:
- 在应用详情页,点击"版本管理"
- 点击"上传应用"
- 选择要上传的APK或AAB文件
- 等待系统自动解析应用信息
- 检查解析结果,确认无误后点击"保存"
配置版本信息:
- 填写版本号(必须大于上一个版本)
- 填写版本描述(更新内容)
- 设置最低兼容版本
- 配置权限说明
- 设置应用内购买(如有)
4.4 测试与审核
内部测试:
- 在"测试"页面,创建测试版本
- 添加测试人员(最多100人)
- 生成测试链接或二维码
- 分发测试版本,收集反馈
提交审核:
- 确认应用信息完整无误
- 点击"提交审核"
- 选择审核类型(普通审核/加急审核)
- 确认提交
审核状态跟踪:
- 审核中:1-3个工作日
- 审核通过:准备上架
- 审核驳回:查看驳回原因,修改后重新提交
五、应用商店优化(ASO)
5.1 关键词优化
核心关键词策略:
- 应用名称:包含核心关键词,如"记账-个人理财助手"
- 应用描述:自然融入关键词,避免堆砌
- 关键词标签:选择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 }
]
);
};
处理负面评价:
- 及时回复用户反馈
- 了解问题原因,提供解决方案
- 在后续版本中修复问题
六、版本管理与更新
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 版本发布策略
灰度发布流程:
- 内部测试:开发团队和测试人员验证
- 小范围灰度:5%-10%用户,收集反馈
- 逐步放量:50%用户,监控崩溃率和性能指标
- 全量发布:100%用户,持续监控
版本回滚机制:
- 准备回滚包:保留上一个稳定版本的安装包
- 监控关键指标:崩溃率、启动失败率、用户反馈
- 快速响应:发现问题后30分钟内决定是否回滚
- 回滚操作:在应用商店后台回滚版本
七、应用安全与合规
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 隐私合规
隐私政策配置:
- 在应用首次启动时展示隐私政策
- 获取用户同意后才能收集数据
- 提供隐私政策查看入口
权限申请说明:
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鸿蒙应用的打包发布与上架全流程:
- 打包配置:掌握了Android、iOS和鸿蒙应用的签名配置和打包命令
- AppGallery上架:了解了从创建应用到提交审核的完整流程
- ASO优化:学习了应用商店优化的核心策略,包括关键词优化、元数据优化和用户评价管理
- 版本管理:掌握了版本号规范、热更新方案和灰度发布策略
- 安全合规:了解了代码混淆、数据加密和隐私合规的重要性
8.2 常见问题解决方案
问题1:签名证书错误
- 解决方案:检查签名配置是否正确,确认证书文件和密码无误
问题2:应用审核被驳回
- 解决方案:仔细阅读驳回原因,修改应用内容后重新提交
问题3:热更新失败
- 解决方案:检查CodePush配置是否正确,确认网络连接正常
问题4:应用崩溃率过高
- 解决方案:使用崩溃监控工具定位问题,及时发布修复版本
8.3 系列文章总结
回顾整个《React Native鸿蒙开发实战》系列,我们从零开始,系统学习了:
- 环境搭建:配置开发环境,创建第一个应用
- 基础组件:掌握核心组件和Flex布局
- 状态管理:使用useState、useEffect等Hook管理状态
- 路由导航:实现多页面应用的路由跳转
- 网络请求:使用Fetch和Axios进行数据交互
- 原生能力:调用相机、定位、蓝牙等设备API
- 性能优化:使用Profiler监控性能,优化内存和渲染
- 打包发布:将应用打包上架到AppGallery
通过这8篇系列文章的学习,您已经掌握了React Native鸿蒙开发的全栈技能,能够独立完成从需求分析、开发实现到打包上架的完整流程。希望这些知识能够帮助您在鸿蒙生态中开发出更多优秀的应用!
后续学习建议:
- 深入学习鸿蒙分布式能力,开发多设备协同应用
- 探索AI和机器学习在移动端的应用
- 关注React Native新架构(Fabric和TurboModules)的演进
- 参与开源社区,贡献代码和分享经验
祝您在鸿蒙开发的道路上越走越远,创造出更多改变世界的产品!