需求说明

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

实现效果 https://img.gorpeln.cn/demo/GPAPIManager.gif

核心实现

GPAPIManager.h

#import <Foundation/Foundation.h>

#define     HOST_TYPE       0



#if HOST_TYPE == 0
#define kIsProduction       @"0" // 0 开发环境 1生产环境 可以用于极光推送等

#elif HOST_TYPE == 1
#define kIsProduction       @"1"

#elif HOST_TYPE == 2
#define kIsProduction       @"1"

#endif

typedef NS_ENUM(NSInteger, GPHostType) {
    GPHostTypeDev = 0,  // 开发
    GPHostTypeGray,     // 灰度
    GPHostTypeRelease,  // 正式
    GPHostTypeDIY       // 自定义
};

#define kHostUrl [GPAPIManager hostUrl]

NS_ASSUME_NONNULL_BEGIN

@interface GPAPIManager : NSObject

// 地址数组
+ (NSArray *)localServicePrefixs;
+ (NSArray *)localServiceTitlePrefixs;

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

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

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

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

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

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

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

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

@end

NS_ASSUME_NONNULL_END

GPAPIManager.m

#import "GPAPIManager.h"

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

@interface GPAPIManager ()

@end

@implementation GPAPIManager

+ (NSArray *)localServicePrefixs{
    return @[
        @"dev.api.com",
        @"test.api.com",
        @"api.com",
    ];
}

+ (NSArray *)localServiceTitlePrefixs{
    return @[
        @"测试地址",
        @"预发地址",
        @"正式地址",
        @"自定义地址"
    ];
}


+ (NSString *)hostUrl {
    NSArray *localHostArray = [self localServicePrefixs];
    if (HOST_TYPE == 2) { //正式环境
        return localHostArray[GPHostTypeRelease];
    }else{
        NSInteger type = [self hostType];
        if (type == GPHostTypeDev) {
            return localHostArray[0];
        } else if (type == GPHostTypeGray) {
            return localHostArray[1];
        } else if (type == GPHostTypeRelease) {
            return localHostArray[2];
        } else if (type == GPHostTypeDIY) {
            return [self diyHostUrl];
        }
    }
    return @"";
}

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

+ (GPHostType)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

如何使用

// 上线前切换至正式环境 不显示接口切换入口,不允许切换接口操作
if ([self isRelease]) {
    return;
}

if (HOST_TYPE == 2) {
    // 关闭环境,自定义参数
    [GPAPIManager saveEnabled:NO];
    return YES;
}else{
    [GPAPIManager saveEnabled:YES];
    return NO;
}