第一次接触Uniapp打包时,我也被各种包类型搞得晕头转向。经过几个项目的实战,终于理清了这些概念的本质区别。简单来说,Uniapp打包主要产出三种包:APK、IPA和WGT。这三种包的关系就像装修房子,WGT是软装材料,APK/IPA则是带硬装的完整房子。
APK是Android系统的安装包,相当于Windows的exe文件。我在实际项目中遇到过这样的场景:当需要新增相机权限时,就必须重新打包APK。IPA则是iOS系统的安装包,由于苹果的封闭生态,打包流程比Android复杂得多。最特殊的是WGT资源包,它只包含业务代码和静态资源,不涉及原生配置。实测下来,WGT包体积通常只有完整安装包的1/10,这对用户更新非常友好。
热更新是我最推荐的日常更新方式。具体操作是在HBuilderX中选择"发行->制作移动App资源升级包"。这里有个坑要注意:版本号必须大于当前版本,否则更新会失败。我通常用这样的命名规则:v1.0.0.20230701,最后一段是日期戳。
热更新的核心优势是用户无感知。后台可以配置静默更新策略,用户下次打开App时自动生效。但要注意这些限制:
当需要修改应用图标、启动页或新增系统权限时,就必须走整包更新流程。Android端相对简单,直接打包新APK上传到CDN即可。但iOS端要特别注意,TestFlight审核通常需要1-3天,我建议预留足够的时间缓冲。
这里分享一个实用技巧:在manifest.json中配置versionCode时,Android建议用数字递增(如1001),iOS则要符合App Store的版本规范(如1.0.1)。这个细节不注意可能导致商店审核被拒。
国内Android市场碎片化严重,主流商店就有十多个。我的经验是优先覆盖华为、小米、OPPO、vivo和应用宝这五大渠道。每个商店都需要:
有个省时技巧:使用同一套代码,通过Jenkins自动化构建不同渠道包。我配置的打包命令是这样的:
bash复制npm run build:android -- --channel huawei,xiaomi,oppo
对于不想上架商店的应用,可以采用CDN分发。但要注意:
我常用的方案是七牛云+自定义安装页,配合版本检测接口实现更新提示。核心代码如下:
javascript复制uni.request({
url: 'https://your-cdn.com/version.json',
success(res) {
if(res.data.version > currentVersion) {
uni.showModal({title:'发现新版本',content:res.data.desc})
}
}
})
苹果审核是出了名的严格,我总结了一套通过率较高的流程:
特别注意:如果应用涉及用户生成内容(UGC),必须提供内容审核机制说明。我的一个社交应用就因为这个被拒了3次。
对于内部工具类应用,企业证书是不错的选择。但要注意这些风险点:
我常用的分发方案是:
经过多个项目迭代,我总结出这些经验:
一个典型的版本控制方案如下表:
| 版本类型 | 策略 | 用户提示 | 后台配置 |
|---|---|---|---|
| 热更新 | 静默 | 无 | autoUpdate:true |
| 可选更新 | 弹窗提示 | "发现新功能" | forceUpdate:false |
| 强制更新 | 阻断使用 | "必须升级" | forceUpdate:true |
在实际项目中,我习惯用uni.getSystemInfo获取设备信息,针对不同平台和版本号做差异化处理。比如对于低端Android设备,会延迟热更新时机以避免卡顿。