在日常的App開發(fā)中,會有正式服務(wù)器與測試服務(wù)器兩種不同的環(huán)境,調(diào)試或測試時經(jīng)常需要在不同的環(huán)境中切換。
在使用Xcode調(diào)試時,可能需要運(yùn)行兩次以測試不同的服務(wù)器環(huán)境,而在打包測試時,則需要導(dǎo)出兩個不同的ipa包以進(jìn)行安裝測試。
對于想省事的我,想著能不能做個開關(guān)來進(jìn)行不同環(huán)境的切換。其實(shí)想想,是可以在App的某個頁面中添加一個開關(guān)、按鈕或其他方式來進(jìn)行不同環(huán)境的切換控制,但想想這種方式其實(shí)還是有點(diǎn)影響了App的顯示效果,因此就想通過其他方式來實(shí)現(xiàn)。
由于之前了解過iOS App的設(shè)置束 - iOS Settings Bundle ,因此就想著通過 Settings Bundle 來實(shí)現(xiàn)不同服務(wù)器環(huán)境的切換功能。
1. Demo演示

2. 實(shí)現(xiàn)流程
1. 添加 Settings.bundle


Settings.bundle 文件放在工程目錄下即可,放到自己在工程目錄下創(chuàng)建的文件夾中也可以。
2. Settings.bundle 的目錄結(jié)構(gòu)

其中
en.lproj是用來進(jìn)行國際化的,想要添加其他語言,可復(fù)制en.lproj文件夾,然后修改.lproj文件夾名稱為相應(yīng)語言的名稱即可。如添加簡體中文:
3. Root.plist 文件內(nèi)容
3.1 添加選項
先點(diǎn)擊 Root.plist 打開該文件,然后再點(diǎn)擊Preference Items條目的加號,進(jìn)行開關(guān)選項(Toggle Switch)的添加:

同理再添加多值選項(Multi Value),如下圖所示:

3.2 選項的配置
添加完成后,對兩個選項進(jìn)行配置,配置內(nèi)容如下:

其中選項的Title和Identifier可自己進(jìn)行修改。
-
Title可進(jìn)行國際化,只需在相應(yīng)的國際化文件夾.lproj中的Root.strings中進(jìn)行國際化文本的添加即可。 -
Identifier就是使用NSUserDefaults保存數(shù)據(jù)時的key值,在代碼中使用時,需要保持和此處填寫的一致。 -
Default Value可自己進(jìn)行修改。 - 多值選項的
Titles和Values根據(jù)需求自己進(jìn)行設(shè)置,Titles同樣可以進(jìn)行國際化,Values也相當(dāng)于key值。
4. 代碼實(shí)現(xiàn)
4.1 宏定義文件Common.h:
#ifndef Common_h
#define Common_h
#pragma mark - 文件引用
#import "BWConstant.h"
#pragma mark - 不同服務(wù)器環(huán)境的配置
#define URL_HEAD_PRODUCT @"http://www.google.cn"
#define URL_HEAD_DEVELOP @"https://www.baidu.com"
#define URL_HEAD_JIANSHU @"http://www.itdecent.cn"
#define URL_HEAD_BOKEYUAN @"https://www.cnblogs.com"
#define APP_URL_HEAD \
({ \
NSString *url = URL_HEAD_PRODUCT; \
if (APP_SETTINGS_DEBUG_ENABLE) { \
NSString *environment = [[NSUserDefaults standardUserDefaults] objectForKey:UserDefaultsAppServerKey]; \
if ([environment isEqualToString:ServerProductKey]) { \
url = URL_HEAD_PRODUCT; \
} else if ([environment isEqualToString:ServerDevelopKey]) { \
url = URL_HEAD_DEVELOP; \
} else if ([environment isEqualToString:ServerJianshuKey]) { \
url = URL_HEAD_JIANSHU; \
} else if ([environment isEqualToString:ServerBokeyuanKey]) { \
url = URL_HEAD_BOKEYUAN; \
} \
} \
(url); \
}) \
#pragma mark - 開發(fā)調(diào)試相關(guān)的宏定義
/// 是否在App設(shè)置中開啟了調(diào)試開關(guān)
#define APP_SETTINGS_DEBUG_ENABLE \
({ \
BOOL enable = [[NSUserDefaults standardUserDefaults] boolForKey:UserDefaultsAppDebugEnableKey]; \
(enable); \
}) \
#endif /* Common_h */
4.2 常量類BWConstant:
.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
UIKIT_EXTERN NSString *const UserDefaultsAppDebugEnableKey;
UIKIT_EXTERN NSString *const UserDefaultsAppServerKey;
UIKIT_EXTERN NSString *const ServerProductKey;
UIKIT_EXTERN NSString *const ServerDevelopKey;
UIKIT_EXTERN NSString *const ServerJianshuKey;
UIKIT_EXTERN NSString *const ServerBokeyuanKey;
.m
#import "BWConstant.h"
// 注意: key值要與Settings.bundle中Root.plist文件中相應(yīng)條目的Identifier保持一致
NSString *const UserDefaultsAppDebugEnableKey = @"AppDebugEnableIdentifier";
NSString *const UserDefaultsAppServerKey = @"AppServerEnvironmentIdentifier";
NSString *const ServerProductKey = @"ServerProductIdentifier";
NSString *const ServerDevelopKey = @"ServerDevelopIdentifier";
NSString *const ServerJianshuKey = @"ServerJianshuIdentifier";
NSString *const ServerBokeyuanKey = @"ServerBokeyuanIdentifier";
4.3 最終的使用
宏定義APP_URL_HEAD即對應(yīng)服務(wù)器地址,在代碼中進(jìn)行使用。
當(dāng)在App設(shè)置中進(jìn)行服務(wù)器環(huán)境切換后,代碼中APP_URL_HEAD對應(yīng)的值也會改變,因此就達(dá)到了不同服務(wù)器環(huán)境切換的效果。
3. Demo代碼
???????? Demo地址:BWSwitchServer