美文网首页iOS Developer
iOS开发当中优雅的管理多个环境下的差异化设置

iOS开发当中优雅的管理多个环境下的差异化设置

作者: Penn_Xu | 来源:发表于2022-06-08 00:53 被阅读0次

    问题陈述

    在开发当中我们常常会遇到的一点需求,对于不同的发布需求,需要切换不同的开发环境

    例如:

    • 对于开发或内部测试构建 - iOS应用商店之外的开发发行版
      Host - devapi.project-name.com
      API Key - development_key
    • 客户端测试构建 - iOS应用商店外的企业发行版
      Host - stgapi.project-name.com
      API Key - enterprise_key
    • 为生产构建 - App Store 中的分发
      Host - api.project-name.com
      API key - app_store_key

    最简单的,我们可以使用 DEBUG 管理两种设置

    #if DEBUG
        #define API_BASE_URL @"http://devapi.project-name.com/api/v1"
        #define API_KEY @"development_key"
    #else
        #define API_BASE_URL @"http://stgapi.project-name.com/api/v1"
        #define API_KEY @"enterprise_key"
    #endif
    

    于是我们会遇到这样的问题问题

    企业发行版(客户端测试)和iOS APP Store 分发(生产)切换时每次均需要修改代码。

    • For Enterprise distribution

    • #if DEBUG
          //debug setting
      #else
          //enterprise setting
          #define API_BASE_URL @"http://stgapi.project-name.com/api/v1"
          #define API_KEY @"enterprise_key"
      #endif
      
    • For App Store distribution

    • #if DEBUG
          //debug setting
      #else
          //app store setting
          #define API_BASE_URL @"http://api.project-name.com/api/v1"
          #define API_KEY @"app_store_key"
      #endif
      

    那么可不可以实现下面这样的方法呢

    #ifdef DEVELOPMENT
        #define API_BASE_URL @"http://devapi.project-name.com/api/v1"
        #define API_KEY @"development_key"
    #elif ENTERPRISE
        #define API_BASE_URL @"http://stgapi.project-name.com/api/v1"
        #define API_KEY @"enterprise_key"
    #elif APP_STORE
        #define API_BASE_URL @"http://api.project-name.com/api/v1"
        #define API_KEY @"app_store_key"
    #endif
    

    于是我们需要解决这个问题

    如何在不创建不同 target的情况下用不同名称创建三个构建?

    • ProductName - 用于 App Store
    • ProductName-Dev - 用户内部开发构建
    • ProductName-Stg - 用户客户端测试(企业)构建

    解决方案

    创建个人配置

    在项目设置(非target)中,创建以下配置:

    • Debug_Dev

    • Debug_Staging

    • Debug_Prod

    • Release_Dev

    • Release_Staging

    • Release_Prod

    create_config

    注意,如果使用Cocoapods,则需要将配置设置回none,删除项目中Pods文件夹的内容,然后重新运行 pod install

    接下来为每个环境创建方案

    创建以下内容(复制原始的),代替MyApp方案 :

    Create_Scheme
    • MyApp_Dev (Development)

    • MyApp_Stg (Staging)

    • MyApp (Production)

    在每个方案中,在适当的地方使用关联的 Debug_* and Release_* 配置。

    Assosiation_Env

    最终看起来像这样

    Created_Scheme

    然后让我们添加预处理器宏来标识环境

    添加一个额外的预处理器宏,以确定要构建的环境。

    在项目构建设置中, 点击 + 号,添加一个名字像 MYAPP_ENVIRONMENT 的用户自定义构建(User-Defined)设置. 然后, 在每一个不同的环境组中添加不同的预处理宏,例如 DEVELOPMENT=1, STAGING=1 and PRODUCTION=1.

    然后,在预处理器宏中(而且是在项目project级别,而不是目标targets级别)使用 $(MYAPP_ENVIRONMENT) 添加这个新的MYAPP_ENVIRONMENT设置。

    最终看起来如下图

    这样,就可以像下面这样确定开发环境的切换:

    #ifdef DEVELOPMENT
        NSString * const MyAppAPIBaseURL = @"https://api-dev.myapp.com/";
    #elif STAGING
        NSString * const MyAppAPIBaseURL = @"https://api-staging.myapp.com/";
    #elif PRODUCTION
        NSString * const MyAppAPIBaseURL = @"https://api.myapp.com/";
    #endif
    

    还可以创建不同的用户定义的构建设置来做不同的事情,比如更改应用程序的显示名称。

    可以通过创建一个名为 MYAPP_DISPLAY_NAME 的新设置 (与创建用于标识环境的预处理器宏相同),为每个配置设置正确的名称,然后在 info.plist 中设置正确的名称:$(MYAPP_DISPLAY_NAME)

    希望这篇文章对你有帮助,如果有什么问题欢迎评论区留言讨论

    完整项目 -

    https://github.com/vineetchoudhary/BuildManagement
    引用来源

    相关文章

      网友评论

        本文标题:iOS开发当中优雅的管理多个环境下的差异化设置

        本文链接:https://www.haomeiwen.com/subject/fsiymrtx.html