iOS多环境配置

由于项目需要为一个APP生成不同环境下的版本,例如Debug版本、Release版本、Test版本,于是研究了一下Build Configuration

本文是对本人学习iOS multi-environment
configuration这篇文章的简单记录总结,原文内容可查看
http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/

接下来进入正文哈~~

以下这个小例子将展示如何在你的Xcode项目中进行多环境配置。

  • 目标

在开发应用程序时,你可能需要在不同情况下做不同的事情。例如通过不同的URL连接到AdHoc分布与AppStore中发布。Xcode提供了一个非常容易使用的机制:Configurations

最终的目标是:

每个环境有一个单独的配置文件。如果我们每个环境中有一个或多个文件,例如我们可以改变URL从测试服务器到正式服务器。

每个环境中有不同的bundleID、bundleName和app图标。这样做可以确保您可以直接识别安装在设备上的不同版本。也许更重要的是,它能够使我们在设备上有多个不同的版本,因为在每个环境中都有自己的bundleID

有一个预处理宏以便能够根据不同的环境动态切换。当你需要切换环境的时候这可能是便利的。例如登录的开发版本,但是避免在AdHoc和AppStore中发布这些日志。

  • 在Xcode中添加配置

你可能知道也可能不知道,当你创建了一个新的项目时,Xcode已经提供了两种配置:DebugRelease

这种配置的好处是,你可以基于这些配置构建自己的配置,你还可以自定义脚本和自定义设置。通过这些技术我们可以提高我们的项目设置。我们在GitHub上的项目就是这种设置的结果。GitHub例子(https://github.com/appfoundry/ios-multi-env-configuration) ,接下来我们将引导您如何让这一切发生。

我们增加了一个额外的配置叫AdHoc

要添加这个配置,你需要选择你的Xcode项目,如下所示

1.png

然后点击+,选择Duplication "Release" Configuration ,添加一个新的配置

2.png

接下来,你需要告诉Xcode如何来使用它。

  • 设置配置构建方案

我们将创建一个新的方案能够发布在AdHoc中,要做到这一点,选择项目的Manage Schemes

3.png

4.png

选择当前的应用程序,点击左下角的小齿轮,然后点击Duplicate,该应用程序构建方案具有相同的名称并且作为项目默认设置

在新的对话框中,更改方案的名称,例如你的App名称+AdHoc,然后选择Archive选项并且设置Configuration为AdHoc,完成之后点击close按钮

41.png

如果你正与其他人一同在此项目中,他们将不会看到你的新方案,因为你没有分享它。如果你选择你的方案,并且点击share复选框,然后提交到你的源代码管理系统,其他人将能够使用这些方案了。

5.png
  • 为每个环境设置不同的配置文件

具体目录如下

未命名图片.png

请确保您是以下目录结构

<source root
folder>/config/<configuration>/Configuration.plist

source root folder.xcodeproj位于同一目录下。这些Configuration文件夹命名必须与你的项目配置名称匹配,显然这些是区分大小写的。

6.png
  • 为了确保我们为每个环境使用了正确的配置,让我们从应用程序中移除刚刚添加的文件。有以下几种不同的方法:

1、你可以在文件目录选择文件,并在Target Membership中取消勾选

7.png

2、你可以选择项目根目录,然后选择Build Phases,在Copy Bundle Resources中移除

71.png

3、你可以直接从目标中通过勾选复选框添加或移除文件

8.png

最后一步是当应用程序被编译的时候拷贝到应用程序中。要做到这一点,进入项目根目录,选择NewRun Script Phase,并命名为CopyConfiguration File(s)

RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/${CONFIGURATION}BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app echo "Copying all
files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"

将以上内容拷贝到script中,如下所示

9.png

该脚本将根据你的具体配置文件夹中的所有文件复制到构建应用程序包文件夹中。重要是保持CopyBundle Resources和添加文件的顺序。

继续构建你的项目,然后检查输出,应该能看到echo 消息和列表文件被打印出来

  • 使用配置的值

例如,在应用程序中获取配置文件的路径

- (NSString*) readValueFromConfigurationFile { 
    NSBundle*bundle = [NSBundlemainBundle];
    NSString *path =[bundle pathForResource:@"Configuration"ofType:@"plist"];
    NSDictionary*config = [NSDictionarydictionaryWithContentsOfFile:path];
    return config[@"configParameter"];
}

注:以上的代码片段是从示例代码中提供的,具体可查看DRYShowConfigurationViewController

请记住,你也可以从你的应用程序info.plist文件中查看,尤其是界面化的显示。

NSDictionary *infoDictionary= [[NSBundle mainBundle]infoDictionary];
NSString *bundleId =infoDictionary[@"CFBundleIdentifier"];
NSString *bundleVersion =infoDictionary[@"CFBundleVersion"];
  • 发布/构建不同的版本

虽然将每个环境的配置分离开是很好的,但真正有帮助的是同一时间发布多个版本。例如,它可以方便的让你的设备分别安装从AppStore下载的、AdHoc发布的和最近的开发版本。尤其是当有bug出现的时候,这是非常可喜的设置。

由于每个配置环境具有相同的AppID,新安装的应用将会覆盖当前安装的应用程序,我们需要为每个环境定义不同的AppID,这可以通过User-Defined来设置。

具体操作如下:
选中targets

10.png
11.png

重命名CustomAppBundleld

为不同的环境设置如下

//AdHoc
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION} 
//Debug 
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}.${CONFIGURATION} 
//Release 
com.yourcompany.${PRODUCT_NAME:rfc1034identifier}

本项目的配置如下


12.png

Xcode中解决了使用变量的正确方式并展示了具体的使用值,我们为不同的配置添加了后缀为Debug和AdHoc,而Release则不使用Release后缀。

我们仍然需要为应用程序设置bundleId,将Bundle identifier的值改为${CustomAppBundleId},设置如下

13.png

有了这个设置,你现在就可以在你的设备上安装多个版本。由于所有的版本仍具有相同的名称和图标,很难区分不同的版本。让我们继续寻求更完美的为不同的应用程序更改名称和图标。

  • 为每个环境设置正式的名称
    仍然通过User-Defined进行设置,给新添加的usedefined命名为CustomProductName
14.png
//AdHoc
ConApp AH
//Debug
ConApp DE
//Release
${PRODUCT_NAME}

正如你看到的,我们为Release命名为应用程序的名称,其他两项使用自定义值。接下来修改Bundle nameBundle display name的值为${CustomProductName}

15.png

  • 为每个环境设置不同的图标
    为了让每一个环境都有自己的图标,我们将使用的是默认情况下为每个项目创建的目录。Xcode默认会在应用程序下创建 Images.xcassets文件目录,里边包含了AppIconLaunchImage集。
    注意:在Xcode5之前是没有此目录的,你可以通过info.plist文件中改变Icon files值。

我们将需要两个额外的App Icon。点击Editor->New App Icon,分别重命名为AppStoreIcon-DebugAppIcon-AdHoc,并将默认的AppIcon更改为AppIcon-Release,为每个图标集拖拽合适的图标,如下所示

16.png

现在我们已经把所有的图标准备完毕,我们需要告诉Xcode来如何显示它们。具体操作如下:
17.png

命名规范如下

AppIcon-${CONFIGURATION}

至此,你的应用程序为不同的环境已经配置完毕,现在你要做的就是测试它们。运行在Xcode上,看看Debug配置。切换到AdHoc下看看,最后在切换到发布版本看看,如果均能正常工作,那么我们的配置即是成功的。

部署完应用程序,你也可以通过以下检查是否正常,如果正常,那么每个环境中BundleName 、Bundle Display Name、BundleID、AppIcon均显示正常


171.png
  • 奖励:功能开关与宏

为了使代码根据当前环境的某些部分,可以使用预处理宏。或许你现在可能已经猜到了,你可以在Build
Settings中设置这些宏。


18.png

具体设置如下:

CONFIGURATION_${CONFIGURATION}

这样做后,你可以使用宏在你代码中监测某种环境,使用如下:

#if defined (CONFIGURATION_AdHoc) || defined (CONFIGURATION_Debug) 
//Code placed here
will only be compiled and thus 
//included at runtime in AdHoc and Debug releases.
#endif

备注:
本文主要是我本人记录使用的,由于英语水平及其有限,翻译内容有什么错误还请大家及时指出,将不胜感激~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容