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

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

内容简介:通常我们在使用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环境自动部署》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

1024·人与机器共同进化

1024·人与机器共同进化

东西文库 / 译言·东西文库/电子工业出版社 / 2013-12-20 / 55元

《1024》:国内第一本专注于科技文化的mook。 本期创刊号将目光定焦在“人与机器”这个超热点领域。 如果把机器获得思维能力看作是一种进化, 那人类具备不朽之躯同样也是一种进化。 这是一个野心勃勃但又充满不确定性的未来。 在我们一厢情愿地猜测机器将在不远的将来赶超自己而惶惶不可终日时,人类其实还有一个机会——变得更像机器。这并非科幻小说,而是正在发生的现实。人类创造......一起来看看 《1024·人与机器共同进化》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具