有时候,我们的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

参考:

整合上面实践的开源项目:

 
 

Xcode 运行时配置的更多相关文章

  1. (转载)让XCode运行时自动更新资源

    转自http://goldlion.blog.51cto.com/4127613/1351616 用过XCode的人都知道,XCode有一个臭名昭著的bug——除非你修改了源代码造成了重新编译,否则游 ...

  2. Laravel 使用 Provider 为程序提供运行时配置服务

    需求: 配置参数存在数据库中,Model 是 aah,需要在每次运行时,程序可以在任何地方采用 config("aah.name") 的方式访问配置信息. 思路: 采用 Provi ...

  3. opcache运行时配置参数详解

    PHP的opcode缓存又出 了新成员(说新不新,也有一段日子了),那就是opcache.新浪微博等都在使用,惠新宸老师强力推荐.本人最近根据官网地址 (http://www.php.net/manu ...

  4. Xcode 运行时找不到xib资源文件

    调试运行时候,提示找不到xib(或者其他)资源文件,在工程中确实看的到该资源文件,到具体运行的资源目录([[NSBundlemainBundle] resourcePath]),没有看到该文件,而其他 ...

  5. Xcode 运行时异常

    一:unable to boot the ios simulator:模拟器异常 1.在添加了新的xcode版本调试包时,出现旧版模拟器不支持的情况,关闭旧版模拟器,重新运行 二:Could not ...

  6. fn project 运行时配置选项

    Env Variables Description Default values DB_URL The database URL to use in URL format. SeeDatabases  ...

  7. ETCD:运行时重新配置

    原文地址:runtime reconfiguration etcd带有增量运行时重新配置的支持.允许我们在集群运行的时候更新集群成员关系. 仅当大多数集群成员都在运行时,才能处理重新配置请求,强烈建议 ...

  8. ETCD:运行时重新配置设计

    原文地址:the runtime configuration design 运行时重新配置是分布式系统中最难,最容易出错的部分,尤其是在基于共识(像etcd)的系统中. 阅读并学习关于etcd的运行时 ...

  9. DevExpres表格控件运行时动态设置表格列

    本文是系列文章,陆续发表于电脑编程技巧与维护杂志. DevExpres产品是全球享有极高声誉的一流控件套包产品!国内典型用户包括:用友.金蝶.神州数码.工信部.中国石化.汉王科技等众多大中型科技型企业 ...

随机推荐

  1. Sanic

    基础 厉害了我的 Sanic hello word, Sanic

  2. 【题解】Luogu P2766 最长不下降子序列问题

    原题传送门 实际还是比较套路的建图 先暴力dp一下反正数据很小 第一小问的答案即珂以求出数列的最长不下降子序列的长度s 考虑第二问如何做: 将每个点拆点 从前向后连一条流量为1的边 如果以它为终点的最 ...

  3. Linux统计系统文件类型出现的次数

    awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab /^UUID/ 匹配确定行范围

  4. container(容器),injection(注入)

    1.container为什么会出现? 在书写程序的时候,我们常常需要对大量的对象引用进行管理.为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中.由于数据容器中存放了我们随时可能需要使用 ...

  5. Java基础学习-常用的dos命令

    打开控制台(win+R,然后cmd回车)   常用命令:         d:回车    盘符切换         dir(directory):列出当前目录下的文件以及文件夹         cd( ...

  6. 【BZOJ4031】小Z的房间

    Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...

  7. 【C++】10.18日的C++笔记

    使用memset初始化一个类会导致类中的指针和虚函数表出现问题.相关链接 使用memset(a,1,sizeof(a))初始化a数组不会达到预期的效果,因为memset会把每个字节赋值为1就会变成16 ...

  8. [转载]C++之路起航——标准模板库(deque)

    转自:https://www.cnblogs.com/grhyxzc/p/5074061.html deque(双端队列):http://baike.baidu.com/link?url=JTvA2c ...

  9. Vue 兼容 IE9 全功能正常使用的全面解决方案

    https://blog.csdn.net/VhWfR2u02Q/article/details/80863626

  10. npm 是干什么的

    网上的 npm 教程主要都在讲怎么安装.配置和使用 npm,却不告诉新人「为什么要使用 npm」.今天我就来讲讲这个话题. 本文目标读者是「不太了解 npm 的新人」,大神您别看了,不然又说我啰嗦了 ...