iOS - 开发一套代码多个app展示不同图标和名称
引言
公司项目重构之后,有了相对比较完善的开发体系,首先git分支分为日常、预发、生产三个主要分支,开发阶段都在日常(daily)分支下开相应功能的feature分支,开发完再合并。
我的iOS工程需要满足这个开发体系,那么我必须能实现以下诉求:
构建不同的宏来方便切换相应的配置;
配置三种数据环境根据宏的切换进行切换;
三种图标/应用名称根据宏的切换进行切换显示;
至少两个类型的包能同时安装在手机上;
最好能使用脚本实现自动化打包放入bugly或者蒲公英等平台供内部测试人员下载;
网上已经有很多类似的讲解,但是我发现这其中还是会遇到一些意想不到的问题,比如pods工程的相应配置、应用名与'.strings'文件的冲突、使用命令行打包 等等问题,下面我将整个配置方法以及其过程中遇到的问题及解决方案分享出来,这也是本文的主要用意,以供大家参考和我自己温故。
Demo切换Configuration能同时安装在一个手机上三种版本:
勘误
因为日前iPhone 7的发布,题主提前下载了Xcode 8 beta版,将公司项目在iOS 10上面跑了一下,发现了很多的变动(例如:基本上所有的系统权限都需要在info.plist中声明、导航栏透明度动态设置问题),其中与本文相关的一个问题在此说明一下:
正文中的的五、配置不同的Bundle ID在使用User-Defined方式在Xcode 8 beta中设置无效,其实跟图标一样,在Target的Build Setting下的Packaging中同样有默认的设置项,我们可以根据自己的需要设置各种scheme下的配置不同的Bundle ID,如下图:
正文
首先,我们都知道iOS设备上的App是根据AppID也就是工程中的Bundle ID来识别App的。默认Xcode为每个target提供2个Build配置项(Build Configuration):Debug和Release。
一、创建多个Configuration
如下图,有两种方法可以用来创建我们需要新增的Build Configuration,这里新建一个名为Preform的配置项,是为了满足App的开发环境(Debug)、预发环境(Preform)、线上环境(Release)三套数据环境的切换。
二、数据环境的配置
上面新增了Preform配置项之后,可以在当前Target的Build Setting下搜索macros找到
Preprocessor Macros,可以看到我们刚刚Duplicate 'Release'生成的Preform的Multiple Value与Release的一模一样,这里我们需要新增PREFORM=1,来定义标示预发环境的宏变量PREFORM,主要是为了方便我们根据这里生成的宏在.pch文件中利用#ifdef来配置好相应的数据环境,这里同样可以将一些需要区分环境的第三方配置放进来,示意图及环境配置代码如下:
#ifdef DEBUG //开发环境 #define EMKEY @"emdevkey" //环信key
#define EMAPNS @"emdevapns" //环信secret
#define SERVER_HOST @""
#define WEB_HOST @"" #elif PREFORM //预发环境 #define EMKEY @"emdiskey"
#define EMAPNS @"emapns"
#define SERVER_HOST @""
#define WEB_HOST @"" #else //正式环境 #define EMKEY @"emdiskey"
#define EMAPNS @"emapns"
#define SERVER_HOST @""
#define WEB_HOST @"" #endif
需要注意的问题:
正常情况下,以上步骤完成之后,如上图选择Edit Scheme切换Build Configuration就能编译出相应环境下的App,但是如果你的App使用pods来管理第三方库,使用新建的配置项就会报错找不到第三方的库文件,错误信息类似如下:
原因是pods工程并未自动帮我们创建相应的pod配置项,发现这一点之后我手动创建了一个同样名为Preform的pod配置项,于是编译通过了,但是打ipa包的时候始终通不过,继续查找原因,原来xcconfig文件需要终端执行pod install进行全面配置,所以大家在新建完了之后记得要pod install一下,才能放心使用。
三、配置不同的AppIcon
配置AppIcon有两种必比较方便的方法。
第一种:
首先我们需要找UI设计师要三套不一样的图标,如下图这样取好对应的名称放入Assets.xcassets中:
然后再当前Target的Build Setting下搜索icon找到Asset Catalog App Icon Set Name,然后进行如下配置:
然后Edit Scheme选择相应的Configuration进行编译或者打包就能打出不同的图标了。
第二种
使用User-Defined配置三种Configuration下的变量,在info.plist中进行配置,配置方法与下面的应用名称配置类似,这里不做过多描述。
四、配置不同的AppName
配置不同的应用名称,这里需要使用到User-Defined加上info.plist来进行配置;
首先,我们需要新增一个User-Defined,如下图:
将三种Configuration下的应用名分别设置成:Demo开发版、Demo预发版、Demo。
然后在info.plist中加入Bundle display name,将其设置成我们刚刚新建的User-Defined:
需要注意的问题:
如果你的不小心引入了别的工程的InfoPlist.strings文件,它里面配置的bundle display name设置会覆盖掉你的User-Defined,使你的设置没有作用。
五、配置不同的Bundle ID
为了使打出来的三种包能够共同存在同一台手机上,我们需要像配置应用名称一样,新建一个User-Defined来根据不同的Configuration使用不同的Bundle ID打包。
配置方法与配置应用名称一致这里也过多描述。
配置完成之后,同一个App就能够在一台手机上面安装多个不同的包啦!
六、脚本打包
在这里推荐大伙儿一个工具,CLI for Building & Distributing iOS Apps (.ipa Files),类似的自动打包工具有很多,这个目前能满足我的需求,上手很快,安装之后一行代码即可打出想要的ipa包,后面再抽时间详细总结一下jenkins+这个工具的使用方法。
最后
分享就先到这里喽,欢迎各位看官的指正~
iOS - 开发一套代码多个app展示不同图标和名称的更多相关文章
- iOS开发关于Block代码错误
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html ,转载请注明出处. iOS开发关于Block代码错误 Incompatible bloc ...
- 【好程序员笔记分享】——iOS开发之纯代码键盘退出
-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单) iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...
- 【转】 iOS开发之打包上传到App Store——(一)各种证书的理解
OK,有日子没写iOS开发的相关文章啦,主要是最近的精力都没在这上面,不过既然产品已经快要出来了,就有必要了解一下各种证书啥的(众所周知iOS的一堆证书可是很让人头大呀),最近确实被这个搞得头大,然后 ...
- 《iOS开发实战 从入门到上架App Store(第2版)》书籍目录
第1章 开发准备 1.1 iOS 10新特性简述 1.1.1 新增触觉反馈编程接口 1.1.2 SiriKit框架的开放 1.1.3 引入Messages App 1.1.4 通知框架的整合与扩展 1 ...
- IOS开发 统计XCODE 代码行数
如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...
- iOS开发技巧 -- 复用代码片段
如果你是一位开发人员在开发过程中会发现有些代码无论是在同一个工程中还是在不同工程中使用率会很高,有经验的人会直接封装在一个类里,或者写成一个宏定义或者把这些代码收集起来,下次直接使用,或者放到xcod ...
- iOS开发之一句代码检测APP版本的更新
提示更新效果图如下,当然也是可以自定义类似与AlertView相似的自定义view,如京东.网易云音乐都是自定义了这种提示框的view.以下只展示,从App Store获取到app信息.并解析app信 ...
- iOS开发之企业发布无线安装APP
前提是注册成为企业开发者(¥299),申请到证书并安装到本地,可以正常使用Xcode在IOS移动设备上进行Debug. 首先build看是否报错.如无错 执行下一: 执行Product—Archive ...
- IOS 开发-- 常用-- 核心代码
网络请求 (包含block 和 delegate) 数据持久化技术 手势处理’ XML数据解析 多线程实现 核心动画编程 地图定位功能 CoreData数据持久化技术 本地通知和推送通知 常用宏定义 ...
随机推荐
- 4. Beego 框架之cookie与session
what is cookie? cookie是存储在客户端的,用于标识客户身份的! what is session session 是存储在服务端,也是用于客户身份标识,用于跟踪用户会话. BeeGo ...
- 详解MathType中如何更改公式颜色
在MathType数学公式编辑器中可以通过更改公式颜色,起到美化.标注公式的效果.本教程将详解MathType中如何更改公式颜色. 点击菜单栏中的样式->格式->颜色,用户就可以根据自己的 ...
- VSCode升级后启动不了~
之前安装了VSCode,一直用的好好的,每次启动后后下角总会提示自己有新版本可以更新,然后就手贱点击了更新,然后就出问题了,更新后VSCode无法启动,打不开了,哭死! 于是,我尝试了以下方法,均无济 ...
- c#直接调用ssis包实现Sql Server的数据导入功能
调用ssis包实现Sql Server的数据导入功能网上已经有很多人讨论过,自己参考后也动手实现了一下,上一次笔者的项目中还用了一下这个功能.思前想后,决定还是贴一下增强记忆,高手请54. 1.直接调 ...
- sql 理解
select b.*, b.model_ent_name+cast(m.year as varchar)as modelname, m.index_value as val into #tb fro ...
- [AX]AX2012 R2 采购订单的“Request change”
在采购订单List或者Detail窗口的操作面板上有一个叫做“Request change”的按钮,如果这个按钮是激活的,采购订单不能直接编辑,而必须先使用这个按钮请求修改后,采购订单才能进入编辑状态 ...
- 胡思乱想 & 胡言乱语
其大无外,其小无内,在数学上是不存在的,有无穷大,又有无限逼近于0而永远不等于0 现实中,人们对事物的认知局限于科学工艺的发展,往小的方面说,在没有显微镜之前,我们能看到的最小的东西莫过于尘埃,其后认 ...
- linux-友好显示文件大小
4850905319b / 1024 /1024/1024 = 4.6G ls -lh
- 深入理解tomcat9---源码构建
环境准备: tomcat9源码 maven(bin目录加入path系统环境变量) jdk8 idea 源码构建步骤: 1. 在解压缩的源码目录下新建pom.xml文件,内容如下: <?xml v ...
- 操作系统定期定时执行python脚本
1. Windows 控制面板 --> 管理工具 -->任务计划程序 --> 创建任务 接下来就是设置执行的时机以及脚本路径等 1>>常规 设置任务名称描述,以及是否执行 ...