开发环境和发布环境切换以方便测试
需求:点击某个地方触发事件,可以自由的切换测试、预生产、生产三种环境。
原理:用NSUserDefault或者Singleton去维护环境变量集合。
宏定义配置
/***************单例模式宏**************/ #define MACRO_SHARED_INSTANCE_INTERFACE +(instancetype)sharedInstance;
#define MACRO_SHARED_INSTANCE_IMPLEMENTATION(CLASS) \ +(instancetype)sharedInstance \ { \ static CLASS * sharedInstance = nil; \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ sharedInstance = [[CLASS alloc] init]; \ }); \ return sharedInstance; \ }
#define APPDelegate ((AppDelegate*)[UIApplication sharedApplication].delegate) |
FBChangeEnvironment.h类
#import <Foundation/Foundation.h>
@interface FBChangeEnvironment : NSObject MACRO_SHARED_INSTANCE_INTERFACE //切换环境 - (void)changeEnvironment; //获得当前环境 - (NSString *)currentEnvironment; @end |
FBChangeEnvironment.m
备注:下面devConfig、prodConfig、prodConfig1改为自己服务器3种环境的地址
#import "FBChangeEnvironment.h" //UAT static NSString *const devConfig = @"0"; //预生产 static NSString *const prodConfig = @"1"; //生产 static NSString *const prodConfig1 = @"2";
@implementation FBChangeEnvironment
MACRO_SHARED_INSTANCE_IMPLEMENTATION(FBChangeEnvironment) //切换环境 - (void)changeEnvironment{ NSLog(@"change environment start");
NSString *title=@"切换环境"; NSString *subTitle=@"重启后生效, 非测试人员请点击cancel"; UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:subTitle preferredStyle:UIAlertControllerStyleActionSheet];
//修改title NSMutableAttributedString *alertControllerStr = [[NSMutableAttributedString alloc] initWithString:title]; // [alertControllerStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, alertControllerStr.length)]; [alertControllerStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20] range:NSMakeRange(0, alertControllerStr.length)]; [alert setValue:alertControllerStr forKey:@"attributedTitle"];
//修改message NSMutableAttributedString *alertControllerMessageStr = [[NSMutableAttributedString alloc] initWithString:subTitle]; // [alertControllerMessageStr addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(0, alertControllerMessageStr.length)]; [alertControllerMessageStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:16] range:NSMakeRange(0, alertControllerMessageStr.length)]; [alert setValue:alertControllerMessageStr forKey:@"attributedMessage"];
NSString *currentEnvironment=@""; if ([[self currentEnvironment] isEqualToString:devConfig]) { currentEnvironment=@"当前环境为 UAT";
[alert addAction:[UIAlertAction actionWithTitle:@"UAT" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { //测试环境 [[NSUserDefaults standardUserDefaults] setObject:devConfig forKey:@"serverFB"]; }]]; [alert addAction:[UIAlertAction actionWithTitle:@"预生产" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //预生产环境 [[NSUserDefaults standardUserDefaults] setObject:prodConfig forKey:@"serverFB"]; }]]; [alert addAction:[UIAlertAction actionWithTitle:@"生产" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //生产环境 [[NSUserDefaults standardUserDefaults] setObject:prodConfig1 forKey:@"serverFB"]; }]];
} else if ([[self currentEnvironment] isEqualToString:prodConfig]) { currentEnvironment=@"当前环境为 预生产";
[alert addAction:[UIAlertAction actionWithTitle:@"UAT" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //测试环境 [[NSUserDefaults standardUserDefaults] setObject:devConfig forKey:@"serverFB"]; }]]; [alert addAction:[UIAlertAction actionWithTitle:@"预生产" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { //预生产环境 [[NSUserDefaults standardUserDefaults] setObject:prodConfig forKey:@"serverFB"]; }]]; [alert addAction:[UIAlertAction actionWithTitle:@"生产" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //生产环境 [[NSUserDefaults standardUserDefaults] setObject:prodConfig1 forKey:@"serverFB"]; }]]; } else if ([[self currentEnvironment] isEqualToString:prodConfig1]) { currentEnvironment=@"当前环境为 生产";
[alert addAction:[UIAlertAction actionWithTitle:@"UAT" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //测试环境 [[NSUserDefaults standardUserDefaults] setObject:devConfig forKey:@"serverFB"]; }]]; [alert addAction:[UIAlertAction actionWithTitle:@"预生产" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { //预生产环境 [[NSUserDefaults standardUserDefaults] setObject:prodConfig forKey:@"serverFB"]; }]]; [alert addAction:[UIAlertAction actionWithTitle:@"生产" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { //生产环境 [[NSUserDefaults standardUserDefaults] setObject:prodConfig1 forKey:@"serverFB"]; }]]; }
[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { // }]]; //当前选择的视图控制器需要自己赋值,比如tabbar的didSelectViewController里 [APPDelegate.currentSelectedVC.navigationController presentViewController:alert animated:YES completion:^{ // }]; } //获得当前环境 - (NSString *)currentEnvironment{ //默认生产环境 NSString *currentEnvironment=prodConfig1; if ([[NSUserDefaults standardUserDefaults] objectForKey:@"serverFB"]) { currentEnvironment=[[NSUserDefaults standardUserDefaults] objectForKey:@"serverFB"]; } return currentEnvironment; }
@end |
某个地方需要调用事件时,调用以下方法即可
- (void)changeEnvironment { [[FBChangeEnvironment sharedInstance]changeEnvironment]; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性