开发环境和发布环境切换以方便测试

Posted 黄增松的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发环境和发布环境切换以方便测试相关的知识,希望对你有一定的参考价值。

需求:点击某个地方触发事件,可以自由的切换测试、预生产、生产三种环境。

原理:用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];

}

 

以上是关于开发环境和发布环境切换以方便测试的主要内容,如果未能解决你的问题,请参考以下文章

使用env文件切换开发环境

springboot 多环境配置和切换

自动识别和切换开发环境测试环境生产环境Python代码模板

Vue多环境配置--切换生产环境、测试环境和开发环境

SwitchHosts高效切换host -- 让开发,测试,线上环境切换更容易

JUnit + DbUnit:在开发和测试环境之间切换数据库连接