创建时间:2022年 03月18号
适用范围:iOS项目
这篇文章都说了什么?
在iOS中快速的进行环境切换
效果:
场景:
我们日常开发至少有两套环境(开发+正式),好一点的就是三四套(开发、测试、预发、正式),这就必不可少的有一个需求,就是如何在各个环境之间快速的切换,甚至热切换。
出于安全考虑,一般正式环境和其他环境不能互相切换。曾经看到一个大厂app的个人中某处连续点击若干次后,会出现一个环境切换页面,能切换和配置一些mock数据。
实现思路
1、增加多个scheme,这种方法做起来,区分的比较清晰,但是配置多,容易出错
2、使用宏定义,缺点
1)需要编译的文件太多,很慢,
2)不支持热切换,每次都得重新打包
3、单例,解决了编译慢和无法热切换的问题,会多消耗一点内存。是本文将要分享的做法
具体实现:
1、建一个类来管理环境相关的配置,通过单例来获取。
H 文件
static NSString *debug_host_index = @"test.host.debug.index";
@interface APPEnv : NSObject
+ (instancetype)share;
/** DEBUG */
@property (nonatomic, assign, readonly) BOOL debug;
@end
M文件
#import "APPEnv.h"
@interface APPEnv ()
/** DEBUG */
@property (nonatomic, assign) BOOL debugIn;
@end
@implementation APPEnv
+ (instancetype)share {
static dispatch_once_t onceToken;
static hpdm *instance = nil;
dispatch_once(&onceToken, ^{
instance = [[hpdm alloc] init];
instance.debugIn = YES;
});
return instance;
}
- (BOOL)debug {
return _debugIn;
}
@end
这里每次打包的时候,我们通过debugIn来控制就可以啦,如控制我们主要的接口
+ (NSString *)host {
if ([hpdm share].debug) {
NSInteger index = [TRUserDefaultsUtil getLocalDataInt:debug_host_index];
// 包含地址和描述的自定义类
HDebugModel *debugModel = [hpdm share].debugList[index];
NSString *host = debugModel.host;
return host;
} else {
return @"https://app.com/release/api";
}
}
2、如何控制测试环境和开发环境的切换
我们可以把需要切换的环境写在一个数组里面,然后每次选择的时候,存一下对应的标记
- (NSArray *)debugList {
NSMutableArray *list = [[NSMutableArray alloc] init];
{
NSString *host = @"http:app.com/test/api";
HDebugModel *model = [HDebugModel modelWithHost:host desc:@"测试环境(test)"];
[list addObject:model];
}
{
NSString *host = @"http:app.com/dev/api";
HDebugModel *model = [HDebugModel modelWithHost:host desc:@"开发环境(dev)"];
[list addObject:model];
}
{
HDebugModel *model = [HDebugModel modelWithHost:@"http://10.10.11.12:8888" desc:@"张电脑(dev)"];
[list addObject:model];
}
return list;
}
总结:
思路其实比较简单,这里只写一部分示例代码,大家可以自己改进。比如要把接口验证也加进来,那就通过我们保存的环境标记,来判断该用什么验证规则。
这样测试的时候,我们打包,测试同学就可以自己在多个环境中来回的切换,或者我们调试问题时可以连接某个开发者的本地环境,方便快速。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)