
// 简报
发布应用就像开餐厅——你只有一次机会留下好的第一印象。仓促上架,遗漏要求、留有安全漏洞或性能不佳,可能毁掉数月的开发成果,损害品牌声誉。
我们见过无数应用因为创始人跳过关键的上架前步骤,被应用商店拒绝,或收到毁灭性的差评。好消息是?只要准备充分,绝大多数上架失败都完全可以避免。
这份全面的检查清单涵盖提交应用前需要核实的一切。按照这些步骤,确保顺利上架、收获好评,并从第一天起稳健增长。
01/05
商店要求与合规
应用商店元数据要求
iOS App Store
- 应用名称(上限 30 个字符)
- 副标题(上限 30 个字符)
- 关键词(上限 100 个字符)
- 描述(上限 4000 个字符)
- 截图(6.5"、6.7"、12.9" 尺寸)
- 应用预览视频(可选)
- 应用图标(1024x1024px)
Google Play Store
- 应用标题(上限 50 个字符)
- 简短描述(上限 80 个字符)
- 完整描述(上限 4000 个字符)
- 截图(手机、平板、TV)
- 宣传图片(1024x500px)
- 应用图标(512x512px)
- 内容分级问卷
法律文件检查清单
- 隐私政策: 所有应用均须提供,且必须可通过 URL 访问
- 服务条款: 列明应用使用条款的法律协议
- 数据删除政策: GDPR 合规及应用商店指南均有此要求
年龄分级与内容指南
重要:请如实准确填写年龄分级问卷。分级不正确可能导致应用被下架或分发受限。
02/05
技术就绪
应用签名与证书
signing_setup.sh
# iOS Certificate Setup
# 1. Create App ID in Apple Developer Console
# 2. Generate Distribution Certificate
# 3. Create Provisioning Profile for App Store
# Flutter iOS build configuration
flutter build ios --release --no-codesign
# Then sign in Xcode with proper certificates
# Android Signing Setup
# 1. Generate keystore file
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
# 2. Configure android/key.properties
storePassword=your_store_password
keyPassword=your_key_password
keyAlias=key
storeFile=../key.jks
# 3. Update android/app/build.gradle
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}后端配置
- 环境变量: 将开发、预发布及生产环境的配置分开管理
- API 端点: 核实所有端点均指向生产服务器
- 数据库迁移: 运行并测试所有生产数据库迁移
API 安全检查清单
- 所有 API 端点均已启用 HTTPS
- 已实施 API 速率限制
- 身份验证令牌已妥善保护
- 已启用输入验证及清理
03/05
性能与安全
性能基准测试
性能目标
- 应用启动时间:少于 3 秒
- 页面切换:少于 300ms
- 内存占用:少于 100MB
- 耗电量:影响轻微
- 网络请求:少于 5 秒
安全审计
- 静态数据加密
- 数据传输安全
- 身份验证安全
- API 漏洞扫描
- 已启用代码混淆
错误处理与监控
main.dart
// Flutter error handling setup
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize Firebase Crashlytics
await Firebase.initializeApp();
// Catch Flutter framework errors
FlutterError.onError = (errorDetails) {
FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
};
// Catch async errors
PlatformDispatcher.instance.onError = (error, stack) {
FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
return true;
};
runApp(MyApp());
}
// Global error boundary
class ErrorBoundary extends StatelessWidget {
final Widget child;
const ErrorBoundary({required this.child});
@override
Widget build(BuildContext context) {
return MaterialApp(
builder: (context, widget) {
ErrorWidget.builder = (FlutterErrorDetails errorDetails) {
return CustomErrorWidget(errorDetails: errorDetails);
};
return widget!;
},
home: child,
);
}
}04/05
测试与质量保证
跨设备测试矩阵
iOS 测试
- iPhone SE(小屏幕)
- iPhone 15(标准)
- iPhone 15 Pro Max(大屏幕)
- iPad(平板布局)
- iPad Pro(大尺寸平板)
- iOS 16、17、18 版本
Android 测试
- Samsung Galaxy S 系列
- Google Pixel 设备
- OnePlus 旗舰机型
- 入门级 Android 设备
- 平板形态设备
- Android 12、13、14 版本
网络与边缘情况测试
- 网络环境: 在 WiFi、4G、3G 及离线场景下进行测试
- 屏幕方向切换: 核实竖屏及横屏模式均正常工作
- 前后台切换: 测试应用进入后台及返回前台时的行为
用户验收测试
专业提示:招募 10 至 20 位符合目标受众的 beta 测试员。新鲜的目光往往能发现开发者埋头数月后忽略的问题。
05/05
分析与监控
必要的分析设置
analytics_service.dart
// Firebase Analytics setup
import 'package:firebase_analytics/firebase_analytics.dart';
class AnalyticsService {
static FirebaseAnalytics analytics = FirebaseAnalytics.instance;
// Track key user events
static Future<void> trackAppOpen() async {
await analytics.logAppOpen();
}
static Future<void> trackScreenView(String screenName) async {
await analytics.logScreenView(screenName: screenName);
}
static Future<void> trackUserAction(String action, Map<String, dynamic> parameters) async {
await analytics.logEvent(name: action, parameters: parameters);
}
static Future<void> trackPurchase(double value, String currency, String itemId) async {
await analytics.logPurchase(
currency: currency,
value: value,
parameters: {'item_id': itemId},
);
}
static Future<void> setUserProperties(String userId, Map<String, String> properties) async {
await analytics.setUserId(id: userId);
for (var entry in properties.entries) {
await analytics.setUserProperty(name: entry.key, value: entry.value);
}
}
}
// Usage in app
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
void initState() {
super.initState();
AnalyticsService.trackScreenView('home_screen');
}
void _onButtonPressed() {
AnalyticsService.trackUserAction('button_pressed', {
'button_name': 'get_started',
'screen': 'home',
});
}
}推送通知测试
- 在两个平台上测试通知送达
- 核实从通知打开的 deep link 正常工作
- 测试通知权限流程
支付流程验证
- 测试支付成功的场景
- 测试支付失败的处理
- 核实收据验证正常工作
需避免的常见陷阱
- 元数据缺失: 商店资料不完整会拖延审核
- 测试不足: 只在旗舰设备上测试会遗漏问题
- 后端扩容: 开发服务器无法承受上架后的流量
- 隐私疏忽: 缺少隐私政策会直接被拒
- 没有错误监控: 看不见的问题就无法修复
- 时间表过急: 请为应用商店审核预留 2 至 7 天


