在日常的App开发中,会有正式服务器与测试服务器两种不同的环境,调试或测试时经常需要在不同的环境中切换。
在使用Xcode调试时,可能需要运行两次以测试不同的服务器环境,而在打包测试时,则需要导出两个不同的ipa包以进行安装测试。
对于想省事的我,想着能不能做个开关来进行不同环境的切换。其实想想,是可以在App的某个页面中添加一个开关、按钮或其他方式来进行不同环境的切换控制,但想想这种方式其实还是有点影响了App的显示效果,因此就想通过其他方式来实现。
由于之前了解过iOS App的设置束 - iOS Settings Bundle ,因此就想着通过 Settings Bundle 来实现不同服务器环境的切换功能。
1. Demo演示
Demo演示
2. 实现流程
1. 添加 Settings.bundle
选择 Settings Bundle
创建 Settings Bundle
Settings.bundle 文件放在工程目录下即可,放到自己在工程目录下创建的文件夹中也可以。
2. Settings.bundle 的目录结构
目录结构
其中
en.lproj
是用来进行国际化的,想要添加其他语言,可复制en.lproj
文件夹,然后修改.lproj
文件夹名称为相应语言的名称即可。如添加简体中文:简体中文:zh-Hans.lproj
3. Root.plist 文件内容
3.1 添加选项
先点击 Root.plist 打开该文件,然后再点击Preference Items
条目的加号,进行开关选项(Toggle Switch
)的添加:
添加开关项
同理再添加多值选项(Multi Value
),如下图所示:
添加多值项
3.2 选项的配置
添加完成后,对两个选项进行配置,配置内容如下:
两个选项的配置内容
其中选项的Title
和Identifier
可自己进行修改。
-
Title
可进行国际化,只需在相应的国际化文件夹.lproj
中的Root.strings中进行国际化文本的添加即可。 -
Identifier
就是使用NSUserDefaults
保存数据时的key值,在代码中使用时,需要保持和此处填写的一致。 -
Default Value
可自己进行修改。 - 多值选项的
Titles
和Values
根据需求自己进行设置,Titles同样可以进行国际化,Values也相当于key值。
4. 代码实现
4.1 宏定义文件Common.h
:
#ifndef Common_h
#define Common_h
#pragma mark - 文件引用
#import "BWConstant.h"
#pragma mark - 不同服务器环境的配置
#define URL_HEAD_PRODUCT @"http://www.google.cn"
#define URL_HEAD_DEVELOP @"https://www.baidu.com"
#define URL_HEAD_JIANSHU @"https://www.jianshu.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 - 开发调试相关的宏定义
/// 是否在App设置中开启了调试开关
#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文件中相应条目的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
即对应服务器地址,在代码中进行使用。
当在App设置中进行服务器环境切换后,代码中APP_URL_HEAD
对应的值也会改变,因此就达到了不同服务器环境切换的效果。
3. Demo代码
👉👉👉👉 Demo地址:BWSwitchServer