iOS如何实现API环境自动部署

栏目: IOS · 发布时间: 4年前

内容简介:通常我们在使用Git管理代码的时候都会创建不同的分支进行管理,而不同分支一般又对应了不同的环境,如master(预发布或生产),develop(开发测试),staging(预发布),feature等等。对iOS来说,每次提测不同环境的安装包的时候,总需要手动进行切换环境(相信对大部分人来说是这样的??),如何解决这个痛点(我就想偷个懒....)目标:实现类似前端打包一样的配置,与git分支做匹配,自动化部署环境,同时提供接口支持应用内切换环境最终实现:发布测试/预发布/生产,只需将代码合并到master,s

通常我们在使用Git管理代码的时候都会创建不同的分支进行管理,而不同分支一般又对应了不同的环境,如master(预发布或生产),develop(开发测试),staging(预发布),feature等等。对iOS来说,每次提测不同环境的安装包的时候,总需要手动进行切换环境(相信对大部分人来说是这样的??),如何解决这个痛点(我就想偷个懒....)

目标:实现类似前端打包一样的配置,与git分支做匹配,自动化部署环境,同时提供接口支持应用内切换环境

最终实现:发布测试/预发布/生产,只需将代码合并到master,staging等分支,无需手动切换环境,而配合jenkins将能实现不同环境的自动化构建发布

API环境自动部署

示例代码 AutoDemo

注意配置好之后,需要Clean一遍项目,不然会报错GitCommitBranch不存在

在项目中获取git信息

  1. 在Info.plist增加GitCommitBranch(名字自定,表达清晰即可)项,用于记录分支名称
  2. 在 Xcode(TARGETS项目target) - Build Phases - New Run Script Phase,增加脚本配置,用于获取git信息并更新到Info.plist中, 脚本代码如下
#当前的分支
git_branch=$(git symbolic-ref --short -q HEAD)

#获取App安装包下的info.plist文件路径
info_plist="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_FOLDER_PATH}/Info.plist"

#利用PlistBuddy改变info.plist的值
/usr/libexec/PlistBuddy -c "Set :'GitCommitBranch'    '${git_branch}'"                 "${info_plist}"

复制代码

创建配置文件,实现API环境自动部署

创建AutoConfig单例,实现自动化部署逻辑,提供一切受环境影响的接口供外部调用,从此只需关注功能开发,打包发布再也不用去切换环境! AutoConfig.h:

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, AutoEnvironmentType) {
    AutoEnvironmentTypeDevelop = 1, //开发/测试环境
    AutoEnvironmentTypeStaging, //预发布环境
    AutoEnvironmentTypeProduction, //生产环境
};

NS_ASSUME_NONNULL_BEGIN

@interface AutoConfig : NSObject


+ (NSString *)baseURL;

/**
 自定义环境,一步实现应用内环境切换 及 方便开发调试

 @param env 要切换到的环境
 */
+ (void)setEnviroment:(AutoEnvironmentType)env;

@end

复制代码

AutoConfig.m实现

#import "AutoConfig.h"

const static NSString *kDevelopRegx = @"^(develop|feature)_.*$";
const static NSString *kStagingRegx = @"^master";
const static NSString *kProductionRegx = @"^production";

@interface AutoConfig()

@property (nonatomic, copy) NSString *baseURL;

@property (nonatomic, assign) AutoEnvironmentType env;

@property (nonatomic, strong) NSPredicate *developPredicate;
@property (nonatomic, strong) NSPredicate *stagingPredicate;
@property (nonatomic, strong) NSPredicate *productionPredicate;

@end

@implementation AutoConfig

#pragma mark -Public Methods

+ (NSString *)baseURL {
    return [AutoConfig shared].baseURL;
}

+ (void)setEnviroment:(AutoEnvironmentType)env {
    [AutoConfig shared].env = env;
    [[AutoConfig shared] updateConfig];
}

#pragma mark -life cycle

+ (AutoConfig *)shared {
    
    static AutoConfig *_config = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _config = [[AutoConfig alloc] init];
        [_config commonInit];
    });
    return _config;
}

- (void)commonInit {
    _developPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", kDevelopRegx];
    _stagingPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",kStagingRegx];
    _productionPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",kProductionRegx];

    [self envForCurrentBranch];
    [self updateConfig];
}

/**
 根据分支名称,进行正则匹配,指定环境
 */
- (void)envForCurrentBranch {
    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
    NSString * branch = infoDict[@"GitCommitBranch"];
    
    if ([self.developPredicate evaluateWithObject:branch]) {
        //测试
        self.env = AutoEnvironmentTypeDevelop;
    }
    else if ([self.stagingPredicate evaluateWithObject:branch]) {
        //预发布
        self.env = AutoEnvironmentTypeStaging;
    }
    else {
        //生产环境
        self.env = AutoEnvironmentTypeProduction;
    }
}


- (void)updateConfig {
    /**
     * 对根据环境变化的参数进行配置
     */
    switch (self.env) {
        case AutoEnvironmentTypeDevelop:
            self.baseURL = @"http://test.com.cn";
            break;
            
        case AutoEnvironmentTypeStaging:
            self.baseURL = @"https://staging.com.cn";
            break;
            
        case AutoEnvironmentTypeProduction:
            self.baseURL = @"https://production.com.cn";
            break;
            
        default:
            self.baseURL = @"http://test.com.cn";
            break;
    }
}

@end
复制代码

以上所述就是小编给大家介绍的《iOS如何实现API环境自动部署》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出Rust

深入浅出Rust

范长春 / 机械工业出版社 / 2018-8-21 / 89.00元

本书详细描述了Rust语言的基本语法,穿插讲解一部分高级使用技巧,并以更容易理解的方式解释其背后的设计思想。全书总共分五个部分。 第一部分介绍Rust基本语法,因为对任何程序设计语言来说,语法都是基础,学习这部分是理解其他部分的前提。 第二部分介绍属于Rust独一无二的内存管理方式。它设计了一组全新的机制,既保证了安全性,又保持了强大的内存布局控制力,而且没有额外性能损失。这部分是本书......一起来看看 《深入浅出Rust》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具