capacitor-app-store by cap-go/capacitor-skills
npx skills add https://github.com/cap-go/capacitor-skills --skill capacitor-app-store将 Capacitor 应用提交至 Apple App Store 和 Google Play Store 的指南。
// capacitor.config.ts - 不存储在此处,仅作参考
// iOS: Info.plist
// CFBundleShortVersionString = "1.2.3" (用户可见)
// CFBundleVersion = "45" (构建号,每次上传递增)
// Android: build.gradle
// versionName = "1.2.3" (用户可见)
// versionCode = 45 (每次上传必须递增)
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
<!-- ios/App/App/Info.plist -->
<key>CFBundleDisplayName</key>
<string>My App</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<!-- 隐私描述 - 权限所必需 -->
<key>NSCameraUsageDescription</key>
<string>为您的个人资料拍摄照片</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>从您的相册中选择照片</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>查找附近位置</string>
<key>NSFaceIDUsageDescription</key>
<string>使用 Face ID 安全登录</string>
<key>NSMicrophoneUsageDescription</key>
<string>录制语音消息</string>
<!-- 应用跟踪透明度 -->
<key>NSUserTrackingUsageDescription</key>
<string>允许跟踪以获取个性化广告</string>
<!-- 出口合规性 -->
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
// android/app/build.gradle
android {
defaultConfig {
applicationId "com.yourcompany.yourapp"
minSdkVersion 22
targetSdkVersion 34
versionCode 1
versionName "1.0.0"
// 64 位支持
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
所需尺寸(放置在 Assets.xcassets 中):
| 尺寸 | 缩放比例 | 用途 |
|---|---|---|
| 20pt | 2x, 3x | 通知 |
| 29pt | 2x, 3x | 设置 |
| 40pt | 2x, 3x | 聚光灯 |
| 60pt | 2x, 3x | 应用图标 |
| 76pt | 1x, 2x | iPad |
| 83.5pt | 2x | iPad Pro |
| 1024pt | 1x | App Store |
所需尺寸(放置在 res/mipmap-* 中):
| 密度 | 尺寸 | 文件夹 |
|---|---|---|
| mdpi | 48x48 | mipmap-mdpi |
| hdpi | 72x72 | mipmap-hdpi |
| xhdpi | 96x96 | mipmap-xhdpi |
| xxhdpi | 144x144 | mipmap-xxhdpi |
| xxxhdpi | 192x192 | mipmap-xxxhdpi |
还需:
# 使用 capacitor-assets
bun add -D @capacitor/assets
bunx capacitor-assets generate --iconBackgroundColor '#ffffff'
| 设备 | 尺寸 | 必需 |
|---|---|---|
| iPhone 6.7" | 1290x2796 | 是 |
| iPhone 6.5" | 1284x2778 | 是 |
| iPhone 5.5" | 1242x2208 | 是 |
| iPad Pro 12.9" | 2048x2732 | 如支持 iPad |
| iPad Pro 11" | 1668x2388 | 如支持 iPad |
| 类型 | 尺寸 | 必需 |
|---|---|---|
| 手机 | 1080x1920 至 1080x2400 | 是(2-8张) |
| 7 英寸平板 | 1200x1920 | 如支持 |
| 10 英寸平板 | 1600x2560 | 如支持 |
// 使用 Playwright 进行自动化截图
import { test } from '@playwright/test';
const devices = [
{ name: 'iPhone 14 Pro Max', viewport: { width: 430, height: 932 } },
{ name: 'iPhone 14', viewport: { width: 390, height: 844 } },
{ name: 'Pixel 7', viewport: { width: 412, height: 915 } },
];
test('generate screenshots', async ({ page }) => {
for (const device of devices) {
await page.setViewportSize(device.viewport);
// 截图 1:主页
await page.goto('/');
await page.screenshot({
path: `screenshots/${device.name}-home.png`,
fullPage: false,
});
// 截图 2:功能
await page.goto('/feature');
await page.screenshot({
path: `screenshots/${device.name}-feature.png`,
});
}
});
# 使用 Xcode
# 产品 > 归档 > 分发应用 > App Store Connect
# 使用 Fastlane
fastlane ios release
# 使用 xcrun
xcrun altool --upload-app --type ios --file App.ipa \
--apiKey KEY_ID --apiIssuer ISSUER_ID
完成 IARC 分级问卷
# 构建 AAB(新应用必需)
cd android && ./gradlew bundleRelease
# 通过 Play Console 或 API 上传
# 生产 > 创建新版本 > 上传 AAB
| 轨道 | 用途 |
|---|---|
| 内部测试 | 最多 100 名测试者,即时 |
| 封闭测试 | 仅限邀请,需审核 |
| 公开测试 | 公开测试版 |
| 生产 | 完整发布 |
| 原因 | 解决方案 |
|---|---|
| 崩溃 | 在真实设备上测试,修复错误 |
| 链接失效 | 验证所有 URL 有效 |
| 元数据不完整 | 填写所有必填字段 |
| 缺少隐私信息 | 完成应用隐私部分 |
| 登录问题 | 提供演示账户 |
| 准则 4.2(最低功能要求) | 添加有意义的功能 |
| 准则 5.1.1(数据收集) | 证明数据使用合理性 |
| 原因 | 解决方案 |
|---|---|
| 崩溃/ANR | 修复稳定性问题 |
| 政策违规 | 查看 Play 政策 |
| 欺骗性行为 | 对功能保持透明 |
| 敏感权限 | 在应用内证明合理性 |
| 目标 SDK 过低 | 更新至 API 34+ |
# 递增修订号 (1.0.0 -> 1.0.1)
bun version patch
# 递增次版本号 (1.0.0 -> 1.1.0)
bun version minor
# 递增主版本号 (1.0.0 -> 2.0.0)
bun version major
iOS:
Android:
每周安装量
70
仓库
GitHub 星标数
18
首次出现
2026年1月25日
安全审计
安装于
opencode45
claude-code44
gemini-cli42
github-copilot41
cursor41
codex40
Guide to submitting Capacitor apps to Apple App Store and Google Play Store.
// capacitor.config.ts - Not stored here, just for reference
// iOS: Info.plist
// CFBundleShortVersionString = "1.2.3" (user-visible)
// CFBundleVersion = "45" (build number, increment each upload)
// Android: build.gradle
// versionName = "1.2.3" (user-visible)
// versionCode = 45 (must increment each upload)
<!-- ios/App/App/Info.plist -->
<key>CFBundleDisplayName</key>
<string>My App</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<!-- Privacy descriptions - REQUIRED for permissions -->
<key>NSCameraUsageDescription</key>
<string>Take photos for your profile</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Select photos from your library</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Find nearby locations</string>
<key>NSFaceIDUsageDescription</key>
<string>Secure login with Face ID</string>
<key>NSMicrophoneUsageDescription</key>
<string>Record voice messages</string>
<!-- App Tracking Transparency -->
<key>NSUserTrackingUsageDescription</key>
<string>Allow tracking for personalized ads</string>
<!-- Export compliance -->
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
// android/app/build.gradle
android {
defaultConfig {
applicationId "com.yourcompany.yourapp"
minSdkVersion 22
targetSdkVersion 34
versionCode 1
versionName "1.0.0"
// 64-bit support
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
Required sizes (place in Assets.xcassets):
| Size | Scale | Usage |
|---|---|---|
| 20pt | 2x, 3x | Notification |
| 29pt | 2x, 3x | Settings |
| 40pt | 2x, 3x | Spotlight |
| 60pt | 2x, 3x | App Icon |
| 76pt | 1x, 2x | iPad |
| 83.5pt | 2x | iPad Pro |
| 1024pt | 1x | App Store |
Required sizes (place in res/mipmap-*):
| Density | Size | Folder |
|---|---|---|
| mdpi | 48x48 | mipmap-mdpi |
| hdpi | 72x72 | mipmap-hdpi |
| xhdpi | 96x96 | mipmap-xhdpi |
| xxhdpi | 144x144 | mipmap-xxhdpi |
| xxxhdpi | 192x192 | mipmap-xxxhdpi |
Also needed:
# Use capacitor-assets
bun add -D @capacitor/assets
bunx capacitor-assets generate --iconBackgroundColor '#ffffff'
| Device | Size | Required |
|---|---|---|
| iPhone 6.7" | 1290x2796 | Yes |
| iPhone 6.5" | 1284x2778 | Yes |
| iPhone 5.5" | 1242x2208 | Yes |
| iPad Pro 12.9" | 2048x2732 | If supporting iPad |
| iPad Pro 11" | 1668x2388 | If supporting iPad |
| Type | Size | Required |
|---|---|---|
| Phone | 1080x1920 to 1080x2400 | Yes (2-8) |
| 7" Tablet | 1200x1920 | If supporting |
| 10" Tablet | 1600x2560 | If supporting |
// Use Playwright for automated screenshots
import { test } from '@playwright/test';
const devices = [
{ name: 'iPhone 14 Pro Max', viewport: { width: 430, height: 932 } },
{ name: 'iPhone 14', viewport: { width: 390, height: 844 } },
{ name: 'Pixel 7', viewport: { width: 412, height: 915 } },
];
test('generate screenshots', async ({ page }) => {
for (const device of devices) {
await page.setViewportSize(device.viewport);
// Screenshot 1: Home
await page.goto('/');
await page.screenshot({
path: `screenshots/${device.name}-home.png`,
fullPage: false,
});
// Screenshot 2: Feature
await page.goto('/feature');
await page.screenshot({
path: `screenshots/${device.name}-feature.png`,
});
}
});
# Using Xcode
# Product > Archive > Distribute App > App Store Connect
# Using Fastlane
fastlane ios release
# Using xcrun
xcrun altool --upload-app --type ios --file App.ipa \
--apiKey KEY_ID --apiIssuer ISSUER_ID
Complete the questionnaire for IARC rating
# Build AAB (required for new apps)
cd android && ./gradlew bundleRelease
# Upload via Play Console or API
# Production > Create new release > Upload AAB
| Track | Purpose |
|---|---|
| Internal testing | Up to 100 testers, instant |
| Closed testing | Invite-only, review |
| Open testing | Public beta |
| Production | Full release |
| Reason | Solution |
|---|---|
| Crashes | Test on real devices, fix bugs |
| Broken links | Verify all URLs work |
| Incomplete metadata | Fill all required fields |
| Missing privacy info | Complete App Privacy section |
| Login issues | Provide demo account |
| Guideline 4.2 (Minimum Functionality) | Add meaningful features |
| Guideline 5.1.1 (Data Collection) | Justify data usage |
| Reason | Solution |
|---|---|
| Crashes/ANRs | Fix stability issues |
| Policy violation | Review Play policies |
| Deceptive behavior | Be transparent about features |
| Sensitive permissions | Justify in-app |
| Target SDK too low | Update to API 34+ |
# Increment patch (1.0.0 -> 1.0.1)
bun version patch
# Increment minor (1.0.0 -> 1.1.0)
bun version minor
# Increment major (1.0.0 -> 2.0.0)
bun version major
iOS :
Android :
Weekly Installs
70
Repository
GitHub Stars
18
First Seen
Jan 25, 2026
Security Audits
Gen Agent Trust HubFailSocketPassSnykPass
Installed on
opencode45
claude-code44
gemini-cli42
github-copilot41
cursor41
codex40
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
116,600 周安装
TanStack Router 最佳实践指南:类型安全、数据加载与路由优化
1,700 周安装
Coinbase Agentic Wallet 代币交易技能 - 通过 CDP Swap API 在 Base 网络交换代币
1,700 周安装
TypeScript E2E 测试指南:使用 Docker 和 GWT 模式进行端到端测试
1,700 周安装
Claude Playground Builder:交互式提示词生成器,可视化构建AI指令
1,700 周安装
AI潜在客户研究助手:自动识别目标客户、优先级排序与拓展策略生成
1,700 周安装
x402 支付协议:使用 USDC 自动支付调用付费 API 端点的命令行工具
1,700 周安装