NativeScript 部署发布 #

发布概述 #

将 NativeScript 应用发布到应用商店需要完成多个步骤。

text
┌─────────────────────────────────────────────────────────────┐
│                    发布流程                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  准备阶段                                                    │
│  ├── 配置应用信息                                           │
│  ├── 准备应用图标                                           │
│  └── 准备启动画面                                           │
│                                                             │
│  构建阶段                                                    │
│  ├── 代码优化                                               │
│  ├── 构建发布版本                                           │
│  └── 应用签名                                               │
│                                                             │
│  发布阶段                                                    │
│  ├── 上传应用包                                             │
│  ├── 填写商店信息                                           │
│  └── 提交审核                                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

应用配置 #

应用标识 #

typescript
// nativescript.config.ts
import { NativeScriptConfig } from '@nativescript/core';

export default {
    id: 'com.company.myapp',
    appPath: 'app',
    appResourcesPath: 'App_Resources',
    android: {
        v8Flags: '--expose_gc'
    },
    ios: {
        discardUncaughtJsExceptions: true
    }
} as NativeScriptConfig;

Android 配置 #

xml
<!-- App_Resources/Android/src/main/AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.company.myapp">
    
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    
    <application
        android:name="com.tns.NativeScriptApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        <activity
            android:name="com.tns.NativeScriptActivity"
            android:label="@string/app_name"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|uiMode"
            android:theme="@style/LaunchScreenTheme">
            
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

iOS 配置 #

xml
<!-- App_Resources/iOS/Info.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>CFBundleDisplayName</key>
    <string>My App</string>
    <key>CFBundleIdentifier</key>
    <string>com.company.myapp</string>
    <key>CFBundleVersion</key>
    <string>1.0.0</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0.0</string>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
        <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>NSCameraUsageDescription</key>
    <string>This app needs camera access</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>This app needs photo library access</string>
</dict>
</plist>

应用图标 #

Android 图标 #

text
App_Resources/Android/src/main/res/
├── mipmap-mdpi/
│   └── ic_launcher.png        (48x48)
├── mipmap-hdpi/
│   └── ic_launcher.png        (72x72)
├── mipmap-xhdpi/
│   └── ic_launcher.png        (96x96)
├── mipmap-xxhdpi/
│   └── ic_launcher.png        (144x144)
└── mipmap-xxxhdpi/
    └── ic_launcher.png        (192x192)

iOS 图标 #

text
App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/
├── icon-20.png
├── icon-20@2x.png
├── icon-20@3x.png
├── icon-29.png
├── icon-29@2x.png
├── icon-29@3x.png
├── icon-40.png
├── icon-40@2x.png
├── icon-40@3x.png
├── icon-60@2x.png
├── icon-60@3x.png
├── icon-76.png
├── icon-76@2x.png
├── icon-83.5@2x.png
└── Contents.json

构建发布版本 #

Android 发布构建 #

bash
# 构建发布版本
ns build android --release --env.aot

# 使用签名
ns build android --release --env.aot --keyStorePath ~/my-release-key.jks --keyStorePassword mypassword --keyStoreAlias my-alias --keyStoreAliasPassword mypassword

创建签名密钥 #

bash
# 生成密钥库
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

# 查看密钥信息
keytool -list -v -keystore my-release-key.jks

iOS 发布构建 #

bash
# 构建发布版本
ns build ios --release --env.aot

# 使用 Xcode 归档
# 1. 打开 platforms/ios/YourApp.xcworkspace
# 2. Product -> Archive
# 3. Distribute App

应用签名 #

Android 签名配置 #

gradle
// App_Resources/Android/app.gradle
android {
    defaultConfig {
        applicationId "com.company.myapp"
        minSdkVersion 21
        targetSdkVersion 33
        versionCode 1
        versionName "1.0.0"
    }
    
    signingConfigs {
        release {
            storeFile file("my-release-key.jks")
            storePassword "mypassword"
            keyAlias "my-alias"
            keyPassword "mypassword"
        }
    }
    
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

iOS 签名 #

text
┌─────────────────────────────────────────────────────────────┐
│                    iOS 签名流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 注册 Apple Developer 账号                               │
│     访问 developer.apple.com                                │
│                                                             │
│  2. 创建 App ID                                             │
│     在开发者中心创建应用标识                                │
│                                                             │
│  3. 创建证书                                                │
│     - 开发证书                                              │
│     - 发布证书                                              │
│                                                             │
│  4. 创建 Provisioning Profile                               │
│     - 开发描述文件                                          │
│     - 发布描述文件                                          │
│                                                             │
│  5. 在 Xcode 中配置签名                                     │
│     选择 Team 和描述文件                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

发布到 Google Play #

准备工作 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Google Play 准备                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 注册 Google Play Developer 账号                         │
│     访问 play.google.com/apps/publish                       │
│     支付一次性注册费用 $25                                  │
│                                                             │
│  2. 创建应用                                                │
│     填写应用基本信息                                        │
│                                                             │
│  3. 准备素材                                                │
│     - 应用图标 (512x512)                                    │
│     - 宣传图 (1024x500)                                     │
│     - 截图 (至少 2 张)                                      │
│     - 应用描述                                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

上传 APK/AAB #

bash
# 构建 AAB (Android App Bundle)
ns build android --release --env.aot --aab

# 输出位置
# platforms/android/app/build/outputs/bundle/release/app-release.aab

发布步骤 #

  1. 登录 Google Play Console
  2. 选择应用
  3. 进入 Release management → App releases
  4. 创建新发布
  5. 上传 AAB 文件
  6. 填写发布说明
  7. 审核并发布

发布到 App Store #

准备工作 #

text
┌─────────────────────────────────────────────────────────────┐
│                    App Store 准备                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 注册 Apple Developer 账号                               │
│     访问 developer.apple.com                                │
│     年费 $99                                                │
│                                                             │
│  2. 在 App Store Connect 创建应用                           │
│     访问 appstoreconnect.apple.com                          │
│                                                             │
│  3. 准备素材                                                │
│     - 应用图标 (1024x1024)                                  │
│     - 截图 (多种尺寸)                                       │
│     - 预览视频 (可选)                                       │
│     - 应用描述                                              │
│     - 关键词                                                │
│     - 隐私政策 URL                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

上传 IPA #

bash
# 使用 Xcode 上传
# 1. 打开 platforms/ios/YourApp.xcworkspace
# 2. Product -> Archive
# 3. Distribute App -> App Store Connect

# 或使用命令行
xcodebuild -exportArchive -archivePath build/YourApp.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath build/

发布步骤 #

  1. 登录 App Store Connect
  2. 选择应用
  3. 填写所有必填信息
  4. 上传构建版本
  5. 提交审核

CI/CD 配置 #

GitHub Actions #

yaml
# .github/workflows/build.yml
name: Build and Deploy

on:
    push:
        branches: [main]
    pull_request:
        branches: [main]

jobs:
    build-android:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3
            
            - name: Setup Node.js
              uses: actions/setup-node@v3
              with:
                  node-version: '18'
            
            - name: Install dependencies
              run: npm install
            
            - name: Build Android
              run: ns build android --release --env.aot
              env:
                  KEYSTORE_PATH: ${{ secrets.KEYSTORE_PATH }}
                  KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
                  KEYSTORE_ALIAS: ${{ secrets.KEYSTORE_ALIAS }}
                  KEYSTORE_ALIAS_PASSWORD: ${{ secrets.KEYSTORE_ALIAS_PASSWORD }}
            
            - name: Upload APK
              uses: actions/upload-artifact@v3
              with:
                  name: app-release
                  path: platforms/android/app/build/outputs/apk/release/app-release.apk
    
    build-ios:
        runs-on: macos-latest
        steps:
            - uses: actions/checkout@v3
            
            - name: Setup Node.js
              uses: actions/setup-node@v3
              with:
                  node-version: '18'
            
            - name: Install dependencies
              run: npm install
            
            - name: Build iOS
              run: ns build ios --release --env.aot
            
            - name: Archive iOS
              run: |
                  xcodebuild -workspace platforms/ios/YourApp.xcworkspace \
                    -scheme YourApp \
                    -archivePath build/YourApp.xcarchive \
                    archive

自动化发布 #

yaml
# .github/workflows/deploy.yml
name: Deploy to Stores

on:
    push:
        tags:
            - 'v*'

jobs:
    deploy-android:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3
            
            - name: Setup Node.js
              uses: actions/setup-node@v3
              with:
                  node-version: '18'
            
            - name: Install dependencies
              run: npm install
            
            - name: Build AAB
              run: ns build android --release --env.aot --aab
            
            - name: Deploy to Google Play
              uses: r0adkll/upload-google-play@v1
              with:
                  serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT }}
                  packageName: com.company.myapp
                  releaseFiles: platforms/android/app/build/outputs/bundle/release/app-release.aab
                  track: production

版本管理 #

版本号规范 #

text
版本号格式: major.minor.patch (例如: 1.0.0)

major: 主版本号 - 不兼容的 API 变更
minor: 次版本号 - 向后兼容的功能新增
patch: 修订号 - 向后兼容的问题修复

更新版本 #

bash
# 更新 package.json 版本
npm version patch  # 1.0.0 -> 1.0.1
npm version minor  # 1.0.0 -> 1.1.0
npm version major  # 1.0.0 -> 2.0.0

最佳实践 #

发布检查清单 #

text
┌─────────────────────────────────────────────────────────────┐
│                    发布检查清单                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  代码质量                                                    │
│  □ 所有测试通过                                             │
│  □ 无 console.log 调试代码                                  │
│  □ 无敏感信息硬编码                                         │
│  □ 代码已优化                                               │
│                                                             │
│  配置检查                                                    │
│  □ 应用 ID 正确                                             │
│  □ 版本号已更新                                             │
│  □ 权限配置正确                                             │
│  □ 签名配置正确                                             │
│                                                             │
│  资源检查                                                    │
│  □ 应用图标完整                                             │
│  □ 启动画面正确                                             │
│  □ 资源文件完整                                             │
│                                                             │
│  商店信息                                                    │
│  □ 应用描述完整                                             │
│  □ 截图已准备                                               │
│  □ 隐私政策已发布                                           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

恭喜完成! #

你已经完成了 NativeScript 完全指南的学习!现在你已经掌握了:

  • NativeScript 基础概念和开发环境
  • UI 组件和布局系统
  • 导航和数据绑定
  • 样式和主题定制
  • 插件和原生功能
  • 网络请求和本地存储
  • 状态管理和动画系统
  • 性能优化和测试策略
  • 框架集成和部署发布

继续实践,构建更多优秀的原生应用!

最后更新:2026-03-29