如何在一个设备上安装一个 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, Icon@2x.png, OTA 版是Icon-beta.png, Icon-beta@2x.png. 那如果做到自动化的配置呢?答案在 Build 设置(Build Setting) 里。

默认 Xcode 会提供 2 个 Build 配置 (Build Configuration):DebugRelease,我们再加一个AppStore, 这样来用:

  • Debug: 用来直接连机调试
  • Release:用于发布 OTA 的测试版
  • AppStore:用户提交到 AppStore

下一步我们来在项目的 Build Setting 里添加两个自定义的设置,一个命名为BUNDLE_IDENTIFIER, 另一个命名为APP_ICON_NAME,如下图这样设置:

add_user_define_setting

这两个值分别定义个 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.pngIcon-beta@2x.png,Cooool

实际上我自己实践的时候,新建了一个叫 myApp-AppStoreSchema,在不同的 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 上还有其他精彩的文章等你发现。