1. 理解Uniapp打包的核心概念
第一次接触Uniapp打包时,我也被各种包类型搞得晕头转向。经过几个项目的实战,终于理清了这些概念的本质区别。简单来说,Uniapp打包主要产出三种包:APK、IPA和WGT。这三种包的关系就像装修房子,WGT是软装材料,APK/IPA则是带硬装的完整房子。
APK是Android系统的安装包,相当于Windows的exe文件。我在实际项目中遇到过这样的场景:当需要新增相机权限时,就必须重新打包APK。IPA则是iOS系统的安装包,由于苹果的封闭生态,打包流程比Android复杂得多。最特殊的是WGT资源包,它只包含业务代码和静态资源,不涉及原生配置。实测下来,WGT包体积通常只有完整安装包的1/10,这对用户更新非常友好。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 两种更新方式的实战选择
2.1 热更新(WGT资源包)
热更新是我最推荐的日常更新方式。具体操作是在HBuilderX中选择"发行->制作移动App资源升级包"。这里有个坑要注意:版本号必须大于当前版本,否则更新会失败。我通常用这样的命名规则:v1.0.0.20230701,最后一段是日期戳。
热更新的核心优势是用户无感知。后台可以配置静默更新策略,用户下次打开App时自动生效。但要注意这些限制:
- 不能修改manifest.json中的基础配置
- 不能新增原生插件
- iOS需要提前配置ATS白名单
2.2 整包更新(APK/IPA)
当需要修改应用图标、启动页或新增系统权限时,就必须走整包更新流程。Android端相对简单,直接打包新APK上传到CDN即可。但iOS端要特别注意,TestFlight审核通常需要1-3天,我建议预留足够的时间缓冲。
这里分享一个实用技巧:在manifest.json中配置versionCode时,Android建议用数字递增(如1001),iOS则要符合App Store的版本规范(如1.0.1)。这个细节不注意可能导致商店审核被拒。
3. Android上架全流程解析
3.1 应用商店打包
国内Android市场碎片化严重,主流商店就有十多个。我的经验是优先覆盖华为、小米、OPPO、vivo和应用宝这五大渠道。每个商店都需要:
- 注册开发者账号(企业认证)
- 准备软著证书(现在审核越来越严)
- 制作专属渠道包(在HBuilderX勾选对应渠道)
有个省时技巧:使用同一套代码,通过Jenkins自动化构建不同渠道包。我配置的打包命令是这样的:
bash复制npm run build:android -- --channel huawei,xiaomi,oppo
3.2 企业自分发方案
对于不想上架商店的应用,可以采用CDN分发。但要注意:
- 阿里云OSS需要配置跨域规则
- 安装页必须使用HTTPS协议
- Android 8.0以上需要额外申请安装未知来源权限
我常用的方案是七牛云+自定义安装页,配合版本检测接口实现更新提示。核心代码如下:
javascript复制uni.request({
url: 'https://your-cdn.com/version.json',
success(res) {
if(res.data.version > currentVersion) {
uni.showModal({title:'发现新版本',content:res.data.desc})
}
}
})
4. iOS上架避坑指南
4.1 App Store正规军路线
苹果审核是出了名的严格,我总结了一套通过率较高的流程:
- 开发阶段:使用Development证书调试
- 内测阶段:通过TestFlight添加最多100名测试员
- 预审阶段:确保没有隐藏功能、 placeholder文案
- 正式提交:截图必须用真机截图,不能使用模拟器
特别注意:如果应用涉及用户生成内容(UGC),必须提供内容审核机制说明。我的一个社交应用就因为这个被拒了3次。
4.2 企业签名方案
对于内部工具类应用,企业证书是不错的选择。但要注意这些风险点:
- 证书可能被苹果吊销
- 安装时需要手动信任证书
- 设备数超过500需要额外报备
我常用的分发方案是:
- 打包企业签名IPA
- 上传到阿里云OSS
- 生成plist文件配置安装链接
- 通过Safari访问itms-services协议链接
5. 版本升级的最佳实践
经过多个项目迭代,我总结出这些经验:
- 版本检测接口要做缓存,避免频繁请求
- 下载进度需要实时反馈给用户
- iOS热更新包大小建议控制在5MB以内
- 强制更新要提供明确的操作指引
- 保留旧版本兼容性至少2个迭代周期
一个典型的版本控制方案如下表:
| 版本类型 | 策略 | 用户提示 | 后台配置 |
|---|---|---|---|
| 热更新 | 静默 | 无 | autoUpdate:true |
| 可选更新 | 弹窗提示 | "发现新功能" | forceUpdate:false |
| 强制更新 | 阻断使用 | "必须升级" | forceUpdate:true |
在实际项目中,我习惯用uni.getSystemInfo获取设备信息,针对不同平台和版本号做差异化处理。比如对于低端Android设备,会延迟热更新时机以避免卡顿。
