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
发布步骤 #
- 登录 Google Play Console
- 选择应用
- 进入 Release management → App releases
- 创建新发布
- 上传 AAB 文件
- 填写发布说明
- 审核并发布
发布到 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/
发布步骤 #
- 登录 App Store Connect
- 选择应用
- 填写所有必填信息
- 上传构建版本
- 提交审核
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