有的項(xiàng)目每次切換Debug、Release時(shí)切油,手動(dòng)修改某個(gè)環(huán)境變量蝙斜,比如服務(wù)器地址,SDK的key澎胡,id...之類的孕荠。如何在Debug、Release等模式下各自設(shè)置不同的環(huán)境變量值攻谁,可以使用xcconfig文件:
步驟:
1.創(chuàng)建Configs文件夾稚伍,cmd + N創(chuàng)建xcconfig文件(文件名可以隨便取):
創(chuàng)建xcconfig文件:New File ->iOS(Other) ->Configration Settings File
2.xcode配置
打開(kāi)項(xiàng)目的workspace,進(jìn)入xcode的主界面戚宦。選中主要工程的project -> info , 找到Configurations个曙,如下配置:
如果項(xiàng)目中有用到單元測(cè)試,這里把test的config文件設(shè)置為none:
3.xcconfig文件內(nèi)容怎么寫(xiě):
DefaultConfig.xcconfig:
//因?yàn)轫?xiàng)目中可能有多個(gè)Target受楼,每個(gè)Target都需要?jiǎng)?chuàng)建多個(gè)環(huán)境垦搬;有時(shí)候他們都需要有個(gè)默認(rèn)的配置,若在其他xcconfig文件不重寫(xiě)變量值艳汽,默認(rèn)使用此文件的值
APP_NAME = ******
APP_VERSION = 1.2.6
APP_BUILD_VERSION = 25
APP_SLOGAN = ******
BrokerCommonConfig.xcconfig:
//注意要用#include導(dǎo)入頭文件
#include "DefaultConfig.xcconfig"
BrokerDebugConfig.xcconfig:
//設(shè)置在Debug模式下使用的變量
#include "BrokerCommonConfig.xcconfig"
#include "Pods/Target Support Files/Pods-SofangBroker/Pods-SofangBroker.debug.xcconfig"
APP_NAME = APP名debug
APP_SLOGAN = sloganDebug
BrokerReleaseConfig.xcconfig:
//設(shè)置在Release模式下使用的變量
#include "BrokerCommonConfig.xcconfig"
#include "Pods/Target Support Files/Pods-SofangBroker/Pods-SofangBroker.release.xcconfig"
APP_NAME = APP名release
APP_SLOGAN = sloganRelease
這樣編譯一下悼沿,在Build Setting ->User-Defined中就有了(僅以Debug Release舉例):
另外例如服務(wù)器地址有兩套以上,(如測(cè)試-模擬-線上)可以添加其他新的Debug模式骚灸,并創(chuàng)建新的xcconfig文件,如下:
創(chuàng)建BrokerReleaseTestConfig.xcconfig文件慌植,寫(xiě)好內(nèi)容并且創(chuàng)建新的ReleaseTest模式甚牲,配置此文件:
//設(shè)置在ReleaseTest模擬模式下使用的變量
#include "BrokerCommonConfig.xcconfig"
#include "Pods/Target Support Files/Pods-SofangBroker/Pods-SofangBroker.debug.xcconfig"
APP_NAME = APP名releaseTest
APP_SLOGAN = sloganReleaseTest
好啦,Edit Scheme中就會(huì)有Run->ReleaseTest模式了蝶柿,可以任意切換:
命令行運(yùn)行:
//坑!!!:不能用 pod install --verbose --no-repo-update
pod install
4.設(shè)置環(huán)境變量
把環(huán)境變量添加到Target->Info.plist文件中丈钙,例如設(shè)置:(注意$(...)
格式)
Bundle name 為$(APP_NAME)
AppSlogan 為$(APP_SLOGAN)
這樣就可以使用NSBundle從info.plist中獲得此變量值了,不同模式下會(huì)從不同文件中取到不同值:
- (NSString *)getValueWithInfoKey:(NSString *)key{
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *value = [infoDictionary objectForKey:key];
return value ? value : @"";
}
...
NSLog(@"AppSlogan:%@",[self getValueWithInfoKey:@"AppSlogan"]);
//注意此處取AppName不能用@"AppName"交汤,因?yàn)樯厦嬖O(shè)置的value對(duì)應(yīng)key是Bundle name雏赦!所以用系統(tǒng)的kCFBundleNameKey
NSLog(@"AppSlogan:%@",[self getValueWithInfoKey:(NSString *)kCFBundleNameKey]);
需要注意的:修改xcconfig文件時(shí)劫笙,需要clean一下工程,可能有緩存星岗。
另外說(shuō)說(shuō)定義全局宏的方式:
Project -> Build settings -> Apple LLVM 7.1 - Preprocessing 在 Preprocessor Macros中設(shè)置key=value填大,key即為全局宏,通常在此設(shè)置DEBUG=1