应用商店部署Skill app-store-deployment

本技能提供iOS和Android应用部署到App Store和Google Play的详细指南,包括签名、版本控制、构建配置、提交流程和发布管理。

移动开发 0 次安装 0 次浏览 更新于 3/3/2026

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密钥
  • 不要跳过安全审查
  • 不要无监控部署
  • 不要忽视崩溃报告
  • 不要进行大版本跳跃
  • 不要使用无效证书
  • 不要无备份部署
  • 不要在假期发布