如何在一个设备上安装一个App的两个不同版本

本文介绍了一种自动化配置iOS应用不同版本的方法,通过设置自定义的Build配置,实现AppStore版与测试版间的区别,避免手动操作导致的错误。

最近干了件蠢事,事情是这样的,我们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和图标文件的名称,如果你有别的类似的需要,也可以参考着来。

总之,再也不用担心我的图标会搞错了。

<think>我们参考了引用中的信息:在Unity中打包出多个安卓apk且不相互覆盖的关键在于修改应用的包名(BundleIdentifier)和版本号(Version)等设置,确保每个apk在系统看来是独立的应用程序。根据用户上一次的问题和需求:用户想要在同一个Unity工程中打包两个版本的APk,并确保它们可以在同一部手机上同时安装。这需要我们在打包时让系统将两个apk识别为不同的应用。解决方案步骤:1.修改应用的包名(BundleIdentifier):这是唯一标识应用的字符串,通常采用反向域名的形式(如com.yourcompany.yourapp)。每一个不同的包名会被系统视为不同的应用。2.修改版本号(Version)和内部版本号(BundleVersionCode):虽然同一应用的多个版本通常通过版本号区分,但这里我们主要依赖包名的不同来让系统识别为不同应用。但为了区分版本,我们也可以修改版本号。3.在Unity的PlayerSettings中进行配置。详细步骤:-打开Unity工程,进入菜单栏:File->BuildSettings->PlayerSettings(或直接在Inspector窗口中选择PlayerSettings)。-在PlayerSettings窗口中,选择Android平台(注意:需要先切换到Android平台)。-在OtherSettings区域:a.修改BundleIdentifier:对于不同版本,我们可以设置不同的包名。例如,第一个版本使用com.Company.ProductA,第二个版本使用com.Company.ProductB。b.修改Version(即BundleVersion),这个可以保持相同,但一般我们会用不同版本来区分,比如第一个版本设为1.0,第二个版本设为1.1。c.修改BundleVersionCode(内部版本号),这个必须是整数,且每个apk的版本号应该不同。通常,每次打包递增这个数字,但在这里,我们为了安装两个不同的apk,可以设置不同的数字,例如第一个版本设为1,第二个版本设为2(注意:对于同一个包名的应用,系统要求新版本版本号必须比旧版本高才能覆盖,但是这里我们包名不同,所以版本号可以任意,但为了规范,建议设置不同版本号)。注意:如果我们的两个版本在功能或内容上有较大差异,除了包名,我们可能还需要修改应用名称(ProductName)来区分,这样在手机桌面上会显示两个不同的应用名称。修改应用名称的方法:-在PlayerSettings中,找到ProductName,可以设置为两个不同的名称,比如"MyApp_V1"和"MyApp_V2"。步骤总结:1.打开PlayerSettings(Inspector窗口)2.选择Android平台3.在OtherSettings中修改:-BundleIdentifier(必须不同)-Version(可选不同,用于显示给用户)-BundleVersionCode(必须整数,建议不同,且新版本大于旧版本,但如果是不同包名,则可以随意)4.在SettingsforAndroid中修改Application标识下的ProductName(可选,用于在桌面上显示不同名称)然后分别打包两次,每次打包前修改这些设置。示例:第一个版本:BundleIdentifier:com.Company.MyApp1Version:1.0BundleVersionCode:1ProductName:MyApp1第二个版本:BundleIdentifier:com.Company.MyApp2Version:1.0BundleVersionCode:2ProductName:MyApp2这样,两个apk就可以同时安装在同一台Android设备上,并且显示为两个独立的应用。引用[1]中提到的“不相互覆盖”正是通过改变包名来实现的,这与我们的解决方案一致。[^1]注意:在Android中,包名(BundleIdentifier在Unity中对应Android的applicationId)是唯一标识,因此必须不同。另外,如果工程中使用了第三方SDK(例如登录、支付等),修改包名后可能需要重新配置相关SDK的key等信息,因为第三方平台常常以包名作为应用标识。另外,如果用户想要自动化这个过程,可以通过Unity命令行参数在构建时动态设置这些值,或者使用脚本在构建前修改PlayerSettings。生成相关问题:1.如何通过命令行或脚本自动化修改Unity的包名和版本信息?2.修改包名后,对Unity项目中的哪些功能会有影响?3.除了修改包名,还有哪些方法可以让多个APK共存?4.如果使用同一个包名,但修改BundleVersionCode,能否同时安装多个版本?注意:系统要求问题与当前主题相关,我们围绕Unity打包多APK共存的问题。</think> ### Unity打包两个版本APK在同一手机同时安装的配置方法 要在同一手机上同时安装两个版本的Unity APK,关键是通过修改以下配置让系统识别为**两个不同的应用**。以下是详细步骤: #### 📦 核心配置(在Player Settings中修改) 1. **修改包名(Bundle Identifier)**: - 位置:`File > Build Settings > Player Settings > Other Settings` - 为每个版本设置**完全不同的包名**(如: `com.company.app_v1` 和 `com.company.app_v2`)[^1] - *注意:这是核心标识,必须唯一* 2. **设置不同版本号**: ```markdown - 版本 1: • Bundle Version: `1.0.0` (用户可见版本号) • Bundle Version Code: `1` (整数,内部版本号) - 版本 2: • Bundle Version: `2.0.0` • Bundle Version Code: `2`(必须大于版本1的数值) ``` 3. **区分应用名称**(可选但推荐): - 位置:`Player Settings > Product Name` - 修改为不同名称(如:`MyApp_测试版` 和 `MyApp_正式版`) #### 🛠 完整操作流程 1. **打包版本1**: - 配置示例: ```markdown • Bundle ID: `com.yourstudio.app_test` • Version: `1.0` • Version Code: `1001` • Product Name: `App_Alpha` ``` - 生成APK:`File > Build Settings > Build` 2. **修改配置**: - 进入`Player Settings` - 修改Bundle ID(如:`com.yourstudio.app_release`) - 增加Version Code(至少+1) - 可选修改Product Name 3. **打包版本2**: - 使用新配置生成APK #### ⚠️ 关键注意事项 1. **签名证书**: - 需使用**相同的Keystore**签名两个APK - 位置:`Player Settings > Publishing Settings` - *不同签名会被视为完全不同的应用* 2. **安装顺序**: - 安装时系统会检查: - 包名不同 → 允许共存 ✅ - 包名相同但Version Code更高 → 覆盖安装 ❌ 3. **设备测试**: - 安装前需卸载旧版本(若包名相同) - 使用`adb install -r`命令强制覆盖时需谨慎 #### 💡 高级方案(自动化) 通过编辑`gradle.properties`实现动态配置: ```gradle // 版本1配置 applicationId="com.company.app_dev" versionName="1.0-dev" versionCode=1000 // 版本2配置(切换注释) //applicationId="com.company.app_prod" //versionName="1.0-prod" //versionCode=2000 ``` > 实测效果:完成配置后,手机将同时显示两个独立应用图标,数据存储路径分离(如: > `/data/data/com.company.app_v1` 和 `/data/data/com.company.app_v2`)[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值