name: 应用商店部署 description: 部署iOS和Android应用到App Store和Google Play。涵盖签名、版本控制、构建配置、提交流程和发布管理。
应用商店部署
概览
发布移动应用到官方应用商店,确保正确的代码签名、版本控制、测试和提交程序。
何时使用
- 发布应用到App Store和Google Play
- 管理应用版本和发布
- 配置签名证书和配置文件
- 自动化构建和部署流程
- 管理应用更新和发布
指南
1. iOS部署设置
# 创建开发和分发签名证书
# 第1步:在Keychain Access中生成证书签名请求(CSR)
# 第2步:在Apple Developer Portal中创建App ID
# 第3步:创建配置文件(开发、分发)
# Xcode配置签名
# 设置团队ID、Bundle Identifier,并选择配置文件
# 构建设置:
# - 代码签名身份:“iPhone Distribution”
# - 配置文件:选择适当的文件
# - 代码签名样式:自动(推荐)
# Info.plist设置
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
</dict>
<key>NSUserTrackingUsageDescription</key>
<string>我们使用跟踪进行分析</string>
</dict>
</plist>
# 为App Store提交构建
xcodebuild -workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-archivePath ~/Desktop/MyApp.xcarchive \
archive
# 分发导出
xcodebuild -exportArchive \
-archivePath ~/Desktop/MyApp.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath ~/Desktop/MyApp
# ExportOptions.plist
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>teamID</key>
<string>YOUR_TEAM_ID</string>
<key>signingStyle</key>
<string>automatic</string>
<key>method</key>
<string>app-store</string>
</dict>
</plist>
# 上传到App Store
xcrun altool --upload-app --file MyApp.ipa \
--type ios \
-u your-apple-id@example.com \
-p your-app-specific-password
2. Android部署设置
// build.gradle配置
android {
compileSdkVersion 33
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 21
targetSdkVersion 33
versionCode 1
versionName "1.0.0"
}
signingConfigs {
release {
storeFile file("keystore.jks")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'com.google.android.play:core:1.10.3'
}
# 创建应用签名的密钥库
keytool -genkey -v \
-keystore ~/my-release-key.jks \
-keyalg RSA \
-keysize 2048 \
-validity 10950 \
-alias my-key-alias
# 构建应用捆绑包
./gradlew bundleRelease
# 构建用于测试的APK
./gradlew assembleRelease
# 验证APK签名
jarsigner -verify -verbose -certs app/build/outputs/apk/release/app-release.apk
3. 版本管理
# 版本跟踪
# package.json
{
"name": "myapp",
"version": "1.0.0",
"build": {
"ios": { "buildNumber": "1" },
"android": { "versionCode": 1 }
}
}
# 增加版本脚本
#!/bin/bash
CURRENT=$(jq -r '.version' package.json)
IFS='.' read -ra VER <<< "$CURRENT"
MAJOR=${VER[0]}
MINOR=${VER[1]}
PATCH=${VER[2]}
PATCH=$((PATCH + 1))
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
jq ".version = \"$NEW_VERSION\"" package.json > package.json.tmp
mv package.json.tmp package.json
echo "版本更新到 $NEW_VERSION"
4. 使用GitHub Actions自动化CI/CD
name: 部署到应用商店
on:
push:
tags:
- 'v*'
jobs:
build-ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- name: 设置Node
uses: actions/setup-node@v3
with:
node-version: '18'
- name: 安装依赖
run: npm install
- name: 构建iOS应用
run: |
cd ios
pod install
xcodebuild -workspace MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-archivePath ~/Desktop/MyApp.xcarchive \
archive
- name: 上传到App Store
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
run: |
xcrun altool --upload-app \
--file MyApp.ipa \
--type ios \
-u $APPLE_ID \
-p $APPLE_PASSWORD
build-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: 设置Java
uses: actions/setup-java@v3
with:
java-version: '11'
- name: 设置Node
uses: actions/setup-node@v3
with:
node-version: '18'
- name: 安装依赖
run: npm install
- name: 构建Android应用
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
cd android
./gradlew bundleRelease
- name: 上传到Google Play
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.PLAY_STORE_SERVICE_ACCOUNT }}
packageName: com.example.myapp
releaseFiles: android/app/build/outputs/bundle/release/app.aab
track: internal
status: completed
create-release:
runs-on: ubuntu-latest
needs: [build-ios, build-android]
steps:
- uses: actions/checkout@v3
- name: 创建GitHub发布
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
body: 发布说明在这里
draft: false
prerelease: false
5. 预部署清单
# iOS清单
- [ ] 增加版本(CFBundleShortVersionString)
- [ ] 更新构建号(CFBundleVersion)
- [ ] 运行所有测试(>80%覆盖率)
- [ ] 在最低iOS版本上测试
- [ ] 审核崩溃日志
- [ ] 检查废弃的API
- [ ] 验证所有权限文档
- [ ] 测试离线功能
- [ ] 验证应用图标(1024x1024)
- [ ] 设置隐私政策URL
- [ ] 归档并验证构建
- [ ] 在真实设备上测试
# Android清单
- [ ] 增加versionCode和versionName
- [ ] 运行所有测试(>80%覆盖率)
- [ ] 在API 21+设备上测试
- [ ] 验证导航
- [ ] 检查电池优化
- [ ] 启用应用签名
- [ ] 构建发布AAB
- [ ] 验证ProGuard混淆
- [ ] 测试横屏/竖屏
- [ ] 上传截图
- [ ] 添加发布说明
- [ ] 在多个设备上测试
最佳实践
✅ 做
- 使用签名证书和配置文件
- 使用CI/CD自动化构建
- 提交前在真实设备上测试
- 保持版本号一致
- 记录部署程序
- 使用环境特定配置
- 实施适当的错误跟踪
- 发布后监控应用性能
- 计划推出策略
- 保留签名材料备份
- 测试离线功能
- 维护发布说明
❌ 不做
- 不要将签名材料提交到git
- 不要跳过设备测试
- 不要发布未测试的代码
- 不要忽视商店政策
- 不要使用硬编码的API密钥
- 不要跳过安全审查
- 不要无监控部署
- 不要忽视崩溃报告
- 不要进行大版本跳跃
- 不要使用无效证书
- 不要无备份部署
- 不要在假期发布