如何在一个设备上安装一个 App 的两个不同版本
最近干了件蠢事,事情是这样的,我们 App 有 2 套图标,一套是测试版图标用于发布 OTA 的内部测试版,一套是正式版用于发布到 AppStore,每次打包,我都会检查图标,结果上次粗心搞错了,把测试版的图标打包发布到 AppStore 了,发现之后想死的心都有了。马上修改了一版,申请紧急审核,结果你可能猜到了,没有通过。这是个很大的教训,像这一类的手动来改都不靠谱,毕竟有忘掉的概率存在,能不能自动处理呢? 在这篇 Blog上找到了答案, 我大概的翻译一下。
iOS 系统区分两个 App 是否相同的根据是 App 的 Bundle ID 是否相同,在安装一个程序时,系统是根据 Bundle ID 来判断是全新安装还是升级。那想在一个系统上安装一个 App 的两个不同版本,其实是需要两个不同的 Bundle ID。就是说正式版一个 Bundle ID,OTA 版本 / Debug 版本用一个 Bundle ID,假设 AppStore 版的 ID 是com.mycompany.myapp,OTA 版的是com.mycompany.myapp-beta。同时为了直观的区分两个 App,一般也会使用两套图标, 假设 AppStore 版的图标名称为Icon.png, [email protected], OTA 版是Icon-beta.png, [email protected]. 那如果做到自动化的配置呢?答案在 Build 设置 (Build Setting) 里。
默认 Xcode 会提供 2 个 Build 配置 (Build Configuration):Debug和Release,我们再加一个AppStore,这样来用:
- Debug: 用来直接连机调试
- Release:用于发布 OTA 的测试版
- AppStore:用户提交到 AppStore
下一步我们来在项目的Build Setting里添加两个自定义的设置,一个命名为BUNDLE_IDENTIFIER, 另一个命名为APP_ICON_NAME,如下图这样设置:

这两个值分别定义个 Bundle ID 和图标的名称,下一步需要在 Info.plist(名字格式是 YourAppName-Info.plist) 中修改 BundleId 和 Icon 图标名称,把bundle identifier值设置为${BUNDLE_IDENTIFIER},把图标值设置为${APP_ICON_NAME}@2x.png 和 ${APP_ICON_NAME}.png,如果提供了 72px 和 144px 等图标也类似这样。
${xxx}语法是预处理语法,都会被替换为xxx对应的真实值,在刚才的设置的基础上,在 Debug 的时候,实际的 Bundle ID 会替换为com.mycompany.myapp-beta,图标对应的为Icon-beta.png和[email protected],Cooool
实际上我自己实践的时候,新建了一个叫myApp-AppStore的Schema,在不同的 Schema 里的 Archive 里是用不同的 Build 配置,myApp-AppStore的 Schema 里 Archive 的 Build 配置为” AppStore”,原来的myApp这个 Schema 的 Build 配置为 Release,这样当我想发布 OTA 的时候,选择myApp-AppStore这个 Schema,然后 Archive,就能使用 AppStore 的自定义的配置来打包,用来提交 AppStore;当选择myApp这个 Schema 的时候,Archive 得到的是使用 Release 的自定义配置来打包的,用来上传到 OTA 测试。整个过程是自动化的,包括 BundleId 和图标文件的名称,如果你有别的类似的需要,也可以参考着来。
总之,麻麻再也不用担心我的图标会搞错了。
这篇文章编译自:How to Have Two Versions of the Same App on Your Device ,原作者 Blog 上还有其他精彩的文章等你发现。
- Title: 如何在一个设备上安装一个 App 的两个不同版本
- Author: Xueshi
- Created at : 2013-08-16 00:00:00
- Updated at : 2026-06-07 01:44:22
- Link: http://xueshi.me/2013/08/16/how-to-have-two-versions-of-the-same-app-on-your-device/
- License: This work is licensed under CC BY-NC-SA 4.0.