美文网首页程序员
iOS App多环境配置Configuration(适用于有无c

iOS App多环境配置Configuration(适用于有无c

作者: 高雅的格调 | 来源:发表于2020-06-30 11:27 被阅读0次

    2020-06-30 更新:新增AppIcon多环境配置,见底部

            我们在日常开发中经常会遇到多个环境配置的情况,比如Debug、Test、Product、PreRelease、Release等等,各个环境对应一套host、key、token之类的,最简单的做法是在一个manager配置文件里通过if...elseif...elseif...等等去配置常量,每次打包时在再手动改环境,确实可以实现,少的话还好管理,多了就简直是噩梦,甚至有时要在Test或debug时可以摇一摇轻松切换任意环境时,这种方法就显得力不从心了。手动改环境还有其他隐患,比如忘改了时常会打错环境包,严重的甚至将错误的包发布到线上就造成了十分严重的bug。因此,app多环境配置就显得十分必要,它可以很好的隔离各环境的配置,能提供更方便灵活的的配置。

    本文最后又结合flutter打包时遇到的问题一并解决

    闲话少扯,直接跟着我撸(附Demo参考着DEMO效果更佳)

    新建工程AppConfiguration,比如新建个Test配置,按照图示1、2步骤

    选择 Duplicate "Debug" Configuration/Duplicate "Release" Configuration其中之一,我们在这路复制Debug的配置

    依次创建Release.xcconfig、Debug.xcconfig、Test.xcconfig三个config文件,它们三个依次对应上一步Configuration中的Release、Debug、Test,其实这些会在Edit Scheme中用到,待会会讲

    创建完成之后,再返回第2步中的窗口,按照如下依次对应选择刚刚创建的config文件(注意必须先创建,才能选择)

    配置预编译宏,这就相当于在pch文件当中去定义宏,可以在项目中做不同环境的区分,进而进行操作。

    进入工程的Build Setting ->Preprocessor Macros:

    你会发现这里Debug和Test栏里有个Debug=1而Release栏里没,没错,这就是我们项目里常用的#ifdef DEBUG,就是这里配置的生效的

    然后Edit Scheme->Run->选择Test,保存

    编译OK!

    至此,配置也就基本完成了!

    不对啊,多环境配置怎么没看到多环境在哪?

    是的,还没配置呢,睁大眼睛下面的才是重点...

    我们在上述config文件里创建了3个变量FLUTTER_BUILD_MODE、APP_DISPLAY_NAME、APP_CONFIG_FLAG,保存

    然后去AppConfiguration->TARGETS->Build Setting,滑动到最底部,会发现多了这三个User-Defined变量

    然后去AppConfiguration->TARGETS->Build Setting 搜索Preprocessor Macros:

    依次填上FLUTTER_BUILD_MODE和APP_CONFIG_FLAG对应的值

    这一步配置非常重要!!!

    也可以在Project-AppConfiguration-Preprocessor Macros和Targets-AppConfiguration-Preprocessor Macros中配置通过如下方式配置FLUTTER_BUILD_MODE和APP_CONFIG_FLAG:

    FLUTTER_BUILD_MODE=$(FLUTTER_BUILD_MODE)

    APP_CONFIG_FLAG=$(APP_CONFIG_FLAG)

    剩下的就是测试了,在AppDelegate里直接打印日志验证

    运行模拟器

    然后根据环境动态显示应用名,在info.plist中将Bundle display name栏替换成我们的APP_DISPLAY_NAME,运行完美!

    至此,app多环境配置基本一段落!不过还未完,既然搞了就好人做到底吧~

    下面说下工程使用cocoapods集成的配置。

    cd到工程根目录,pod init生成Podfile文件,编辑(我这里注释掉了use_frameworks!,先不用它)随便搞俩AFNetworking、SDWebImage,

    然后pod install

    最后发现一堆警告

    先不管它,编译下项目,不好~报错了!

    我们还是尝试处理一下警告吧!依次在config文件里include导入下面的Pods-....xcconfig,太长不想打,那就直接抓着文件拖过去,删除多余的路径

    在pod install 试下,那一坨警告没了

    重新 clean 下工程,编译->ok!完美

    别慌,还有...

    我们上面不是定义了个FLUTTER_BUILD_MODE,你会好奇为啥定义它,下面我们说说Flutter混合开发中遇到的另外一个问题。

    我们一镜到底直接撸!

    先说下各运行工具环境:

    Xcode: 11.3 (11C29)

    VSCode: 1.46.1

    Flutter:    1.12.13+hotfix.8

    Pod:      1.8.4

    我们就不用git submodule方式引入了,直接根目录创建(创建flutter module参见https://flutter.dev/docs/development/add-to-app/ios/project-setup)

    并按照文档指示在工程Podfile里新增如下:

    这时去pod install是会报错的!

    然后我们在根目录用VSCode(Andriod Studio)打开my_flutter文件,在VSCode自带的终端中执行flutter pub get

    指令会默认创建几个隐藏文件

    然后再根目录执行pod install

    不好意思又报错了,擦刚才Podfile文件里路径多了个(怪我直接拷贝).

    改成 flutter_application_path = './my_flutter'

    然后我们直接接入flutter的demo页面看看

    编译一下,报错了

    我们Scheme换成Release试试,Debug和Release编译运行都是ok的,我们把Test.xcconfig里的FLUTTER_BUILD_MODE = Debug试试

    也是好的,那么问题来了,到底要解决什么问题呢?

    我们试试Archive 一个Debug包

    报错了(Archive 一个Release是OK的),对了就是解决这个问题,上面说的很清楚:

    Flutter archive builds must be run in Release mode.

    Flutter build必须在Release模式下

    打Debug包别想们都没有,这时多环境就上场了,由于Test我刚才复制的Duplicate "Debug" Configuration

    所以我们快速新建个Product(Duplicate "Release" Configuration)用于测试

    记得在Build Setting ->Preprocessor Macros 里Product里将APP_CONFIG_FLAG=3,并重新执行下pod install

    然后Archive 一个Product包,ok

    然后将可以将项目里的

    #ifdef DEBUG

    统统换成如下愉快的玩耍了

    #if (APP_CONFIG_FLAG == 0)

    如果一下子改可能改不完,可以先临时在Build Setting ->Preprocessor Macros 的Product里将DEBUG=1加进去

    至此多环境配置告一段落!下次整下多环境配置AppIcon

    上面实现了Bundle display name 和环境配置,现在开始AppIcon动态配置,也很简单

    运行或打包对应的环境就行了

    相关文章

      网友评论

        本文标题:iOS App多环境配置Configuration(适用于有无c

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