在日常的App開發(fā)中,會(huì)有正式服務(wù)器與測(cè)試服務(wù)器兩種不同的環(huán)境鸽捻,調(diào)試或測(cè)試時(shí)經(jīng)常需要在不同的環(huán)境中切換呼巴。
在使用Xcode調(diào)試時(shí)泽腮,可能需要運(yùn)行兩次以測(cè)試不同的服務(wù)器環(huán)境,而在打包測(cè)試時(shí)衣赶,則需要導(dǎo)出兩個(gè)不同的ipa包以進(jìn)行安裝測(cè)試诊赊。
對(duì)于想省事的我,想著能不能做個(gè)開關(guān)來進(jìn)行不同環(huán)境的切換府瞄。其實(shí)想想碧磅,是可以在App的某個(gè)頁面中添加一個(gè)開關(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)語言的名稱即可舒裤。如添加簡(jiǎn)體中文:3. Root.plist 文件內(nèi)容
3.1 添加選項(xiàng)
先點(diǎn)擊 Root.plist 打開該文件,然后再點(diǎn)擊Preference Items
條目的加號(hào)觉吭,進(jìn)行開關(guān)選項(xiàng)(Toggle Switch
)的添加:
同理再添加多值選項(xiàng)(Multi Value
)腾供,如下圖所示:
3.2 選項(xiàng)的配置
添加完成后,對(duì)兩個(gè)選項(xiàng)進(jìn)行配置鲜滩,配置內(nèi)容如下:
其中選項(xiàng)的Title
和Identifier
可自己進(jìn)行修改台腥。
-
Title
可進(jìn)行國際化,只需在相應(yīng)的國際化文件夾.lproj
中的Root.strings中進(jìn)行國際化文本的添加即可绒北。 -
Identifier
就是使用NSUserDefaults
保存數(shù)據(jù)時(shí)的key值黎侈,在代碼中使用時(shí),需要保持和此處填寫的一致闷游。 -
Default Value
可自己進(jìn)行修改峻汉。 - 多值選項(xiàng)的
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.reibang.com"
#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
即對(duì)應(yīng)服務(wù)器地址,在代碼中進(jìn)行使用业簿。
當(dāng)在App設(shè)置中進(jìn)行服務(wù)器環(huán)境切換后瘤礁,代碼中APP_URL_HEAD
對(duì)應(yīng)的值也會(huì)改變,因此就達(dá)到了不同服務(wù)器環(huán)境切換的效果梅尤。
3. Demo代碼
???????? Demo地址:BWSwitchServer