iOS 应用内切换环境(测试、预发、正式)

版本提测阶段每次都需要打各种环境的安装包,打一个包需要5~10分钟,更何况我们有测试、预发、正式三个环境,光打包就要浪费半个小时,于是就想在实现应用内环境切换功能让测试人员自助切换

常规环境切换,需要我们手动修改HOST_TYPE然后打包,代码如下

#define HOST_TYPE 0  //0开发  1灰度  2正式

#if HOST_TYPE == 0
#define kHOSTURL @"测试地址"
#elif HOST_TYPE == 1
#define kHOSTURL @"预发地址"
#elif HOST_TYPE == 2
#define kHOSTURL @"正式地址"
#endif

需求说明

  • 可以随意切换环境状态
  • 支持自定义环境地址
  • 支持关闭切换环境功能
  • 恢复默认设置

实现核心

WTAPIManager.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, WTHostType) {
    WTHostTypeDev = 0, // 开发
    WTHostTypeGrayscale, // 灰度
    WTHostTypeRelease, // 正式
    IRCHostTypeDIY // 自定义
};

#define HOST_TYPE 0  //0开发  1灰度  2正式

#define HOSTURLSTRING [WTAPIManager hostUrl]

NS_ASSUME_NONNULL_BEGIN

@interface WTAPIManager : NSObject

// 环境地址
+ (NSString *)hostUrl;

// 环境地址类型
+ (void)saveHostType:(WTHostType)type;

// 环境地址类型
+ (WTHostType)hostType;

// 保存自定义地址
+ (void)saveDiyHostUrl:(NSString *)hostUrl;

// 获取自定义地址
+ (NSString *)diyHostUrl;

// 自定义模式开关(开启定义后,切换请求地址才能使用)
+ (void)saveEnabled:(BOOL)on;

// 是否开启自定义(开启定义后,切换请求地址才能使用)
+ (BOOL)isEnabled;

// 恢复默认设置(关闭自定义功能)
+ (void)resetData;

@end

NS_ASSUME_NONNULL_END

WTAPIManager.m

#import "WTAPIManager.h"

static NSString* const kHostTypeKey = @"hostTypeKey";
static NSString* const kDiyUrlKey = @"diyUrlKey";
static NSString* const kEnabled = @"kEnabled";

@implementation WTAPIManager

+ (NSString *)hostUrl {
    NSInteger type = [self hostType];
    if (type == WTHostTypeDev) {
        return @"测试地址";
    } else if (type == WTHostTypeGrayscale) {
        return @"预发地址";
    } else if (type == WTHostTypeRelease) {
        return @"正式地址";
    } else if (type == IRCHostTypeDIY) {
        return [self diyHostUrl];
    }
    return @"";
}

+ (void)saveHostType:(WTHostType)type {
    [[NSUserDefaults standardUserDefaults] setInteger:type forKey:kHostTypeKey];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

+ (WTHostType)hostType {
   // 是否开启自定义切换
   if ([self isEnabled]) {
       return [[NSUserDefaults standardUserDefaults] integerForKey:kHostTypeKey];
   }
   return HOST_TYPE;
}

// 保存自定义地址
+ (void)saveDiyHostUrl:(NSString *)hostUrl {
    [[NSUserDefaults standardUserDefaults] setObject:hostUrl forKey:kDiyUrlKey];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

// 获取自定义地址
+ (NSString *)diyHostUrl {
    return [[NSUserDefaults standardUserDefaults] objectForKey:kDiyUrlKey];
}

// 恢复默认设置
+ (void)resetData {
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kEnabled];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kHostTypeKey];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kDiyUrlKey];
}

// 自定义模式开关
+ (void)saveEnabled:(BOOL)on {
    [[NSUserDefaults standardUserDefaults] setBool:on forKey:kEnabled];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

// 是否开启自定义
+ (BOOL)isEnabled {
    return [[NSUserDefaults standardUserDefaults] boolForKey:kEnabled];
}
@end


如何使用

// 打开切换环境开发
[WTAPIManager saveEnabled:YES];
    
// 切换为正式环境
[WTAPIManager saveHostType:WTHostTypeRelease];

// 获取环境地址
NSLog(@"当前环境地址:%@", HOSTURLSTRING);

// 切换为自定义环境地址
[WTAPIManager saveHostType:IRCHostTypeDIY];

// 设置自定义环境地址
[WTAPIManager saveDiyHostUrl:@"自定义url"];

// 获取环境地址
NSLog(@"当前环境地址:%@", HOSTURLSTRING);

// 恢复默认设置
[WTAPIManager resetData];

// 关闭环境,保留自定义参数
// [WTAPIManager saveEnabled:NO];

// 获取环境地址
NSLog(@"当前环境地址:%@", HOSTURLSTRING);

我的切换环境功能没有直接暴露出来,测试人员可以通过扫码进入我提前写好的页面切换环境,界面和扫码功能就不提供了自行补全即可

上线后关闭切换环境功能

为防止用户使用此功能,只有打包时HOST_TYPE为开发环境,才弹出切换环境界面,上线时我们会将HOST_TYPE设置为发布环境

if (HOST_TYPE == 0) {
   // 去处理切换环境代码
   [WTAPIManager saveHostType:WTHostTypeRelease];
}

总结

打一个测试包,就可以切换三种环境就是舒爽省事,再也不用担心下班前测试阿姨给我要正式环境安装包了(哇哈哈)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • 莫里斯・布朗肖 真正的写作是由一种焦虑感推动的写作, 是一种不得不写作而又无法停留于已经写下的文字痕迹。 思维的语...
    野体文心阅读 708评论 6 20
  • “弟弟怎么样?老大爷应该没什么问题吧?能自己走着上车……”“千万别出什么差错!”妈妈走的早,虽然我帮不上弟弟什么忙...
    快乐欣欣_a96c阅读 288评论 1 4
  • 子明小蜗阅读 135评论 0 0
  • 高考分数下来的那天,我一直等到晚上十一二点,虽然我设置了分数提醒,虽然消息会自动发送过来,可我还是睡不着,惴惴不安...
    抹茶懒猫阅读 323评论 0 3