如何在一个设备上安装一个 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 上还有其他精彩的文章等你发现。