最近干了件蠢事,事情是这样的,我们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
):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
和Icon-beta@2x.png
,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上还有其他精彩的文章等你发现。
相关推荐
在Android平台上,两个应用程序之间的交互通常涉及到应用间跳转,这是一种常见的需求,比如分享功能、登录授权等。本文将深入探讨如何实现Android应用间的跳转,主要基于标题和描述提供的内容,结合标签“android两...
标题中的“两个app小应用 安装即可使用”表明我们有两个安卓应用程序,它们设计得简单易用,用户在安装后无需额外配置即可直接运行。在移动互联网时代,这样的应用通常是为了提供便捷的服务或功能,例如社交、娱乐、...
在Android开发中,实现两个应用程序之间的跳转是常见的需求,比如分享功能、支付流程或者其他应用间的交互。这里我们将深入探讨如何在Android应用间进行跳转,以及如何通过Android Studio进行项目配置。 首先,理解...
本项目名为"ApkDemo",它是一个Android Studio工程,包含两个模块:一个是主应用程序(主apk工程),另一个是插件应用(插件apk工程)。插件apk的设计目的是使其可以直接被主apk调用,而无需预先安装到用户的设备上...
在Android开发过程中,Android Emulator是一个非常重要的工具,它允许开发者在没有物理设备的情况下测试应用程序。本篇文章将深入探讨如何在Android Emulator上安装App Market-g,并了解与之相关的源码和工具使用。 ...
在iOS平台上,基于服务端的App安装文件通常指的是通过企业级分发或者Ad-Hoc方式来部署应用程序。这种方式不依赖于Apple的App Store,而是直接将应用的.ipa文件发送到用户设备上进行安装。这种方式对于内部测试、企业...
苹果旧版app下载V1.3.2(临时).zip是一个包含多个库文件和一个可执行文件的压缩包,主要用于在苹果设备上安装旧版本的应用程序。以下是对压缩包内各个文件及其相关知识点的详细解释: 1. **libimobiledevice.dll**:...
在实际开发中,确保更新功能在不同网络环境、设备和Android版本上都能正常工作,发布新版本时,要遵循Google Play Store或自建应用市场的更新规范。 总之,Android应用的版本自动检测和更新涉及到多个开发环节,...
本系统主要由两个组件构成:服务器端和终端。终端在多数应用场景下要与服务器联网,使得数据可以同步到服务器上。整个系统所需的组件有:服务器主机、NFC终端、一个联网设备和NFC便签。 二、App设计与实现 1. 核心...
注意,这个方法有两个版本,一个是无参数的,返回所有应用;另一个接受一个`PackageManager.GET_*`标志位集合,可以控制返回信息的详细程度。例如,如果你只需要基本信息,可以使用`GET_META_DATA`标志: ```java ...
这个“iOS App版本更新Demo”旨在提供一个实际操作的例子,帮助开发者理解如何在自己的应用程序中实现这一功能。下面我们将详细探讨iOS App版本更新的相关知识点。 首先,我们需要知道iOS中的版本更新通常有两种...
- **隔离应用**:运行两个不同版本的同款应用,比如测试新版本的同时保持旧版本的稳定运行。 - **测试兼容性**:在不同Android版本的模拟环境中测试应用的兼容性。 - **隐私保护**:通过虚拟环境运行敏感应用,避免...
3. 应用权限:如果开发者正在创建一个系统应用,可以申请REBOOT权限,在代码中调用`System.reboot()`函数来重启设备。但请注意,这需要很高的权限,普通应用无法做到。 二、重启单个应用程序 1. ActivityManager...
“冀云ChinaDecision_V3.0.3.apk”是一个Android应用程序包文件,虽然不是Web App本身,但可能是基于Web技术开发的,然后通过打包成APK文件供用户在Android设备上安装使用。这种做法叫做“打包Web App”,它可以让...
以下是对这两个平台的详细说明: **Android系统:** 1. **隐藏桌面图标:** - **使用快捷方式:** 用户可以通过创建快捷方式来启动应用,而不需要在主屏幕上显示图标。只需在应用信息里找到“创建快捷方式”的...
在IT领域,尤其是在移动设备和桌面系统的交互中,"PC通过USB与Android APP通信"是一个常见且重要的主题。这个过程通常涉及到多个技术层面,包括USB通信协议、Android开发者选项、APP编程接口(API)以及数据传输机制...
这两个App可以完成2台Android手机,通过BLE4.0进行通信,可以发送和接收数据。 其中一台Android手机T模拟发出广播,作为BLE设备(周边设备),这个BLE设备在生产环境中就是我们用到的气体检测传感器、智能手环、...
它能够将现有的PC端网站快速转化为移动App,便于用户在移动设备上访问。以下是其制作流程: 1. **添加站点**:首先,用户需要将网站的URL添加到百度SiteApp中。 2. **定制效果**:接着,可以选择不同的模板和主题来...
同时,为了良好的用户体验,需要在App A中处理App B不在设备上或者无法响应的情况,可能需要显示提示信息或提供备选方案。 此外,附带的“iPhoneURLScheme_Reference.pdf”文档很可能是Apple官方的URL Scheme参考,...
这两个信息对于开发者来说至关重要,因为它们能够帮助追踪不同版本的发布状态,以及分析不同推广渠道的效果。以下是关于获取app版本号和渠道号的详细知识。 一、Android平台获取版本号与渠道号 1. 版本号: 在...