用xcconfig文件配置iOS app環(huán)境變量

轉(zhuǎn)自: http://www.itdecent.cn/p/9b8bc8351223

app開(kāi)發(fā)中通常都會(huì)涉及到多個(gè)環(huán)境,Debug、Release等。環(huán)境切換時(shí)可能就會(huì)涉及到服務(wù)器url的切換,或者一些第三方sdk的appid的切換。最初我是通過(guò)在代碼中添加變量的方式來(lái)設(shè)置環(huán)境的:

static let isRelease = true
static let serverURL = isRelease ? "prod server url" : "dev server url"

然而這樣做的缺陷是,每一次要切換環(huán)境的時(shí)候都需要去更改這個(gè)變量,多次修改后還是會(huì)比較煩。并且通常開(kāi)發(fā)中可能會(huì)有不止兩個(gè)環(huán)境。所以,配置app環(huán)境變量能夠更好的解決環(huán)境切換的問(wèn)題。

配置app環(huán)境變量的方式有多種,我選擇了一種我感覺(jué)比較直觀的方式來(lái)配置——使用xcconfig文件。

需求

Xcode默認(rèn)會(huì)提供兩種配置環(huán)境:Debug 和 Release,這兩者的區(qū)別:

  • Debug 會(huì)多一些調(diào)試信息(網(wǎng)上很多人說(shuō)release,環(huán)境下不能斷點(diǎn)之類(lèi)的,自己測(cè)試后發(fā)現(xiàn)斷點(diǎn)什么的和debug、release沒(méi)有關(guān)系,后面會(huì)詳細(xì)說(shuō))
  • Release 運(yùn)行速度快很多,流暢。打的包大小可能要比debug小一些

在我的開(kāi)發(fā)中主要是會(huì)用到3種環(huán)境:

  • 測(cè)試服務(wù)器debug
  • 偶爾會(huì)切換到正式服務(wù)器debug
  • 上架(正式服務(wù)器,release)

默認(rèn)提供的兩種還不太夠用。。。

根據(jù)以上需求,操作步驟大致如下:

1、添加Build Configuration

打開(kāi)項(xiàng)目的workspace,進(jìn)入xcode的主界面。

選中主要工程的project -> info , 找到Configurations, 點(diǎn)擊下方的“+”

image

從圖中可以看到兩個(gè)已經(jīng)添加好的Configuration: Debug 和 Release

選擇“deplicate debug configuration”,添加一個(gè)新的configuration,命名為ReleaseTest:

image

從圖上可以看到,三個(gè)configuration都已經(jīng)有了默認(rèn)的configuration set(也就是xxconfig文件)。這是因?yàn)槲业墓こ讨幸呀?jīng)包含了cocoapods。默認(rèn)的configuration set是pods添加的。

這個(gè)時(shí)候新增加的build configuration并沒(méi)有對(duì)應(yīng)的pods的xcconfig,所以項(xiàng)目會(huì)報(bào)錯(cuò)。把新建的configuration 對(duì)應(yīng)的set 設(shè)置為none

image

命令行運(yùn)行

pod install

完成之后如下圖

image

2、新建并配置xcconfig文件

common + "n", 選擇 iOS -> Other -> Configuration settings file

image

新建4個(gè)xxconfig文件,我采用一下命名:

image

其中:

CommonConfig.xcconfig 文件中放一些通用的配置,例如build version等

其他三個(gè)文件分別對(duì)應(yīng)三個(gè)build configuration.

在CommonConfig中添加:

BUILD_VERSION = 1.0.0

DebugConfig:

/*
    導(dǎo)入公共 config
*/
#include "CommonConfig.xcconfig"
/*
    導(dǎo)入pods 對(duì)應(yīng)的 config
*/
#include "Pods/Target Support Files/Pods/Pods.debug.xcconfig"

APP_DISPLAY_NAME = 測(cè)試服
CONFIG_FLAG = DEBUG

ReleaseConfig:

#include "CommonConfig.xcconfig"
#include "Pods/Target Support Files/Pods/Pods.release.xcconfig"

APP_DISPLAY_NAME = 真名
CONFIG_FLAG = RELEASE

ReleaseTestConfig:

#include "CommonConfig.xcconfig"
#include "Pods/Target Support Files/Pods/Pods.releasetest.xcconfig"

APP_DISPLAY_NAME = 正式服
CONFIG_FLAG = RELEASE_TEST

其中:

#include "Pods/Target Support Files/Pods/Pods.releasetest.xcconfig"

可能會(huì)因?yàn)轫?xiàng)目名稱(chēng)的不同導(dǎo)致路徑不同,如果不太確定的可以再次pod install。pods會(huì)給出提示,其中包含了正確的路徑。

[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target configTest to Pods/Target Support Files/Pods/Pods.debug.xcconfig or include the Pods/Target Support Files/Pods/Pods.debug.xcconfig in your build configuration.

完成以上后,把build configuration切換成對(duì)應(yīng)的新建的文件:

image

2、設(shè)置環(huán)境變量

完成上面的步驟就已經(jīng)添加好了環(huán)境,剩下的就是設(shè)置環(huán)境變量

在Info.plist文件中,設(shè)置Bundle name 為

${APP_DISPLAY_NAME}

應(yīng)用的名稱(chēng)就會(huì)根據(jù)配置改變了。

image

然而在代碼中需要根據(jù)環(huán)境改變某些變量的值怎么辦呢?

1、設(shè)置預(yù)編譯頭參數(shù)

OC

Project -> Build settings -> Apple LLVM 7.1 - Preprocessing

在 preprocessor 中添加

${CONFIG_FLAG}=1

image

Swift

Project -> Build settings -> Swift Compiler - Custom Flags

在 other swift flags 中添加

-D ${CONFIG_FLAG}

image

然后

代碼中:

struct AppConfig {
    private enum AppConfigType {
        case Debug
        case Release
        case ReleaseTest
    }

    private static var currentConfig: AppConfigType {
        #if DEBUG = 1
            return .Debug
        #elseif RELEASE_TEST = 1
            return .ReleaseTest
        #else
            return .Release
        #endif
    }

    static var webServerURL: String {
        switch currentConfig {
        case .Debug:
            return "test url"
        default:
            return "release url"
        }
    }
}

其他變量也可以采用以上方式配置。

添加多個(gè)scheme,方便配置切換

image
image

在scheme中改變build configuration即可實(shí)現(xiàn)不同的環(huán)境切換,也可以添加多個(gè)scheme實(shí)現(xiàn)更方便的切換

image
image

添加的新scheme需要在manage scheme中勾選shared,git上的其他人才能看到新scheme

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容