• iOS 实现动态切换网络请求Host 域名


    背景

    今天在群里发现有个同学在问一个问题,如图:
    在这里插入图片描述
    这位同学是想知道如何快速又方便的可以随时切换Release 与 Test服务器域名,方便APP的测试。正好,我们也有相同的场景。那么我们是怎么做的呢?

    实现

    流程图

    1、创建一个网络请求Host管理的工具类,我们暂且叫它CNChangeHostManager。并且定义Host属性与初始化方法。

    @interface CNChangeHostManager : NSObject
    @property (nonatomic, copy) NSString *kCNPassPortHost;
    +(instancetype)sharedChangeHostObject;
    @end
    
    • 1
    • 2
    • 3
    • 4

    2、定义枚举配置,来区分Host环境

    //PassPort
    typedef NS_ENUM(NSUInteger, CNPassPortHostType) {
        CNPassPortHostTypeRelease,//正式
        CNPassPortHostTypeTest,//测试
        CNPassPortHostTypeBeta,//预发布
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、实现本地缓存配置与读取配置的方法

    //保存配置到沙盒
    + (void)savePassPortHostType:(CNPassPortHostType)passPortHostType
    {
        NSUserDefaults *userdefault = [NSUserDefaults standardUserDefaults];
        [userdefault setInteger:passPortHostType forKey:@"passPortHostType"];
        [userdefault synchronize];
    }
    
    //从沙盒中读取配置
    + (CNPassPortHostType)passPortHostType
    {
        return [[NSUserDefaults standardUserDefaults] integerForKey:@"passPortHostType"];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、设置单例初始化方法,并设置Host默认值

    + (instancetype)sharedChangeHostObject{
        
        static dispatch_once_t onceToken;
        
        dispatch_once(&onceToken, ^{
            
            changeURLObject = [[super allocWithZone:NULL] init];
            
            [changeURLObject defaultHost];
            
        });
        
        return changeURLObject;
        
    }
    
    -(void)defaultHost
    {
        [self passPortHostWithPassPortHostType:[CNChangeHostManager passPortHostType]];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    5、注册通知监听,用于接收改变Host的通知

    //注册通知监听,用于接收改变Host
    - (instancetype)init{
        if (self = [super init]) {
            //注册通知监听,用于接收改变Host
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changePassPortHost:) name:ChangePassPortHostNotification object:nil];
        }
        return self;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6、实现监听通知方法,读取本地缓存的配置。

    - (void)changePassPortHost:(NSNotification *)notification
    {
        [self passPortHostWithPassPortHostType:[CNChangeHostManager passPortHostType]];
    }
    
    -(void)passPortHostWithPassPortHostType:(CNPassPortHostType)passPortHostType
    {
        switch (passPortHostType) {
            case CNPassPortHostTypeRelease:
                self.kCNPassPortHost = @"https://passport.com";
                break;
                
            case CNPassPortHostTypeTest:
                self.kCNPassPortHost = @"https://test-passport.com";
                break;
                
            case CNPassPortHostTypeBeta:
                self.kCNPassPortHost = @"https://pre-passport.com";
                break;
                
            default:
                self.kCNPassPortHost = @"https://passport.com";
                break;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    7、设置中修改Host 方法

    switch (index) {
        case 0:
            [CNChangeHostManager savePassPortHostType:(CNPassPortHostTypeRelease)];
            break;
        case 1:
            [CNChangeHostManager savePassPortHostType:(CNPassPortHostTypeTest)];
            break;
        case 2:
            [CNChangeHostManager savePassPortHostType:(CNPassPortHostTypeBeta)];
            break;
            
        default:
            break;
    }
    [[NSNotificationCenter defaultCenter] postNotificationName:ChangePassPortHostNotification object:nil];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    8、Host 读取方式

    [NSString stringWithFormat:@"/login",[CNChangeHostManager sharedChangeHostObject].kCNPassPortHost]
    
    • 1

    这样就可以随时切换Host环境配置了。

  • 相关阅读:
    但凡项目团队有个“二舅”,项目交付哪用得着又焦又愁
    基于SpringBoot的在线题库管理系统的设计与实现(源码+lw+部署文档+讲解等)
    linux|奇怪的知识---linux权限管理之数字权限和字母权限
    程序员都不知道的代码
    【网络安全】XXE漏洞详细解析
    kubectl 资源管理命令-陈述式
    Mini-Tokio 的精简实现代码
    【Linux】23. 线程封装
    微信小程序涉嫌通过中断用户体验、限制用户操作的方式,收集与服务无关的用户个人信息,包括但不限于,手机号、
    HyperLynx仿真(一)LineSim简单介绍
  • 原文地址:https://blog.csdn.net/weixin_36162680/article/details/126785798