Xcode 运行时配置
有时候,我们的app在测试时需要连接到一个testing服务器,在打包为企业证书的app时又需要连接到另一个ad hoc 服务器,或者我们想企业证书打包的app和debug模式打包的app有不同的APP Bundle Identifier,以在一个测试机上同时安装....等等这些与App开发没有实际连接的需求,如果我们手动改,非常麻烦,如果分工程管理更麻烦。
下面介绍一些Xcode中的运行时配置,希望有所启发:
一个很好地实现上面的需求的方式是使用build configuration 构建配置和C 宏定义,这避免了为不同的配置创建不同的target。首先你需要在工程级别开始配置:

可以看到,上面有三个配置:Debug,Release,adhoc。而且,前面两个配置里都有两个xcconfig文件:

这些xcconfig文件内容类似这样:

接下来,您可以将被传递到编译器的每个配置定义了一些宏标志。然后,您可以在编译时检查这些标志。在target级别中找到"Preprocessor flags"(在Xcode 6中是"Preprocessor Macros")构建设置,你可以在这里定义 KEY=VALUE 或者 只是 KEY 形式的宏定义:

在你的代码中,你可以检查这些宏定义是否存在,例如:

你也可以传入字符串类型,只不过必须用单引号括起来:
DEFAULT_LOCALIZATION_NAME='@"en"'
你也可以使用Schemes 编辑器,为Debug 和Archive时指定不同的配置:

如果你需要在Info.plist 文件里使用自定义的参数,你可以添加一个自定义的构建设置:

然后对不同的配置,设置合适的值:

然后,你在Info.plist文件中,就可以使用这个自定义的参数:

甚至,我们在命令行下构建项目时,还可以直接设置这个参数的值:
xcodebuild … BUNDLE_ID_SUFFIX=justTest build
自动根据当前git项目的提交次数来在构建时,修改Info.plist的构建版本号
首先创建一个shell 脚本 buildNumber.sh ,主要是获取当前git项目的提交次数,作为build version,修改Info.plist文件对应的build verison:
#!/bin/sh
git=`sh /etc/profile; which git`
build_num=`"$git" rev-list --all |wc -l`
branch=`"$git" rev-parse --abbrev-ref HEAD`
commit=`"$git" rev-parse --short HEAD`
version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_FILE}"`
if [ $CONFIGURATION = "Debug" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_num-$branch" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
else
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_num" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
fi
echo "Updated ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
然后在 target级别中,在Build Phases菜单的最后面添加一个shell:

指定这个shell的文件路径:

注意,修改的这个Info.plist文件不会影响工程目录下的Info.plist文件,因为修改的是构建目录下的app里面的Info.plist,例如,我这里修改的是 ./Build/Products/Debug-iphonesimulator/yooke.app/Info.plist
参考:
- http://stackoverflow.com/questions/10497552/how-to-configure-independent-sets-of-runtime-settings-in-xcode
- http://blog.manbolo.com/2013/05/17/passing-user-variable-to-xcodebuild
- http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build
整合上面实践的开源项目:
Xcode 运行时配置的更多相关文章
- (转载)让XCode运行时自动更新资源
转自http://goldlion.blog.51cto.com/4127613/1351616 用过XCode的人都知道,XCode有一个臭名昭著的bug——除非你修改了源代码造成了重新编译,否则游 ...
- Laravel 使用 Provider 为程序提供运行时配置服务
需求: 配置参数存在数据库中,Model 是 aah,需要在每次运行时,程序可以在任何地方采用 config("aah.name") 的方式访问配置信息. 思路: 采用 Provi ...
- opcache运行时配置参数详解
PHP的opcode缓存又出 了新成员(说新不新,也有一段日子了),那就是opcache.新浪微博等都在使用,惠新宸老师强力推荐.本人最近根据官网地址 (http://www.php.net/manu ...
- Xcode 运行时找不到xib资源文件
调试运行时候,提示找不到xib(或者其他)资源文件,在工程中确实看的到该资源文件,到具体运行的资源目录([[NSBundlemainBundle] resourcePath]),没有看到该文件,而其他 ...
- Xcode 运行时异常
一:unable to boot the ios simulator:模拟器异常 1.在添加了新的xcode版本调试包时,出现旧版模拟器不支持的情况,关闭旧版模拟器,重新运行 二:Could not ...
- fn project 运行时配置选项
Env Variables Description Default values DB_URL The database URL to use in URL format. SeeDatabases ...
- ETCD:运行时重新配置
原文地址:runtime reconfiguration etcd带有增量运行时重新配置的支持.允许我们在集群运行的时候更新集群成员关系. 仅当大多数集群成员都在运行时,才能处理重新配置请求,强烈建议 ...
- ETCD:运行时重新配置设计
原文地址:the runtime configuration design 运行时重新配置是分布式系统中最难,最容易出错的部分,尤其是在基于共识(像etcd)的系统中. 阅读并学习关于etcd的运行时 ...
- DevExpres表格控件运行时动态设置表格列
本文是系列文章,陆续发表于电脑编程技巧与维护杂志. DevExpres产品是全球享有极高声誉的一流控件套包产品!国内典型用户包括:用友.金蝶.神州数码.工信部.中国石化.汉王科技等众多大中型科技型企业 ...
随机推荐
- 5、Spring-Kafka3
3. Introduction This first part of the reference documentation is a high-level overview of Spring fo ...
- Python socket粘包解决
socket粘包: socket 交互send时,连续处理多个send时会出现粘包,soket会把两条send作为一条send强制发送,会粘在一起. send发送会根据recv定义的数值发送一个固定的 ...
- 使用pm2-zabbix监控node工程
环境 centos 7 zabbix 3.2.6 node 4.4.3 安装 # wget http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix ...
- 【常见错误】Quartz常见错误
1.集群之后把其中一个Quartz服务停了,其他的也不接手工作 问题描述 集群之后,A节点执行了大多数任务,B节点大部分时间处于空闲,停掉A节点,B节点也不会接手工作. 解决方式 修改Quartz的配 ...
- 为虚拟机配置固定ip地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改BOOTPROTO为static 新增IPADDR即可 如下图所示
- HADOOP HA 踩坑 - 所有 namenode 都是standby
报错: 无明显报错 状况: 所有namenode都是standby,即ZK服务未生效 尝试一:手动强制转化某个namenode为active 操作:在某台namenode上,执行 hdfs haadm ...
- jquery将表单序列化
在工作中经常要将表单数据通过ajax提交,所以需要将表单序列化为json对象. 已经有大神提供了,以前一直百度,现在决定抄过来收藏一下,方便以后自己用,尊重原创,文章转载自:http://www.cn ...
- [Hibernate] 分页查询
@Test public void test9(){ //根据部门编号进行分组,再根据每个部门总工资>5000 Session ss=HibernateUtil.getSession(); St ...
- Geoserver+Postgresql+PostGIS 进行数据发布
1.postgressql+postgis安装 由于我已经安装了,因此没法进行截图,给出下载地址 下载地址:https://www.postgresql.org/ 记得一定要下载edu的版本 因为这个 ...
- hdu6133 Army Formations 线段树合并
给你一棵有n个节点的二叉树,每个节点有一个权值,对于一棵子树u,将u的子树中的节点权值从大到小排序,令sz[u]为子树u的大小, 则ans[u] = 1 * a[1] + 2 * a[2] + ... ...