美文网首页
iOS 多环境配置的三种方式

iOS 多环境配置的三种方式

作者: 顶级蜗牛 | 来源:发表于2022-04-15 14:45 被阅读0次

    概念:
    Project:包含项目所有代码、资源文件、所有信息。
    Target:对指定代码和资源文件的具体构建方式。
    Scheme:对指定的Target的环境配置。

    一、使用多targets配置环境

    这个章节请看我分享的文章:最详细 Xcode的Targets管理项目的公开版本、测试版本、预发布版本
    这里不多讲解

    弊端:
    1.生成多个info.plist文件
    2.配置繁琐且乱,容易配置遗忘其它targets
    3.通过声明宏的方式,容易写错
    4.真机测试需要的描述文件等比较多

    二、使用多Scheme配置环境

    正常情况下,选择Edit Scheme ... -> Run -> Info 只有两个Build Configuration可以选择(Debug/Release)

    这个Build Configuration是对应于 PROJECT 里的 Info -> Configuration

    于是乎可以自定义添加我们所需要的Configuration环境

    因为当前只有一个Scheme,当我们运行的时候,每次都来回点到Edit Scheme...切换环境,这无疑会导致容易操作疏漏的情况。

    于是乎可以创建另外的Scheme,来配对刚才的配置环境,那每次选择环境的时候,只需要选择对应的Scheme就可以了:

    此时就可以选择对应的Scheme去到Edit Scheme...配对它对应的配置环境了

    那如果要区分环境去定义不同的 主机hostUrl呢?我们通过Add User-Defined Setting,自定义一个参数我起名为HOST_URL,它自动会分配三个环境,依次填入自己的主机域名即可(下图我做举例用)。

    通过定义了这个自定义参数,要如何读取出来呢?通过在Info.plist去声明

    Info.plist

    访问HOST_URL就是读取Info.plist

    // Swift
    let mainBundle = Bundle.main
    let identifer = mainBundle.bundleIdentifier
    let info = mainBundle.infoDictionary
    let CFBundleName = mainBundle.object(forInfoDictionaryKey: "CFBundleName")
    let HOST_URL = mainBundle.object(forInfoDictionaryKey: "HOST_URL")
    print("[identifer]:\(identifer!)")
    print("[info]:\(info!)")
    print("[CFBundleName]:\(CFBundleName!)")
    print("[HOST_URL]: \(HOST_URL!)")
    
    // OC 
    NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
    NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:path];
    NSLog(@"%@", infoDic[@"HOST_URL"]);
    

    Building Settings里所有的参数都会分三个不同的环境,这就意味着可以设置不一样的Icons、图标、名称等等...

    弊端:在Building Settings里可能会不断地去找对应的配置然后三个环境不断地配置,不方便。

    三、使用 Scheme + Configurations 配置(推荐)

    本文仅做操作教学,对.xcconfig一点都不懂的同学可以看这里:Swift进阶-工程化实践(一)

    在上面demo的基础上,找到Build Settings -> User-Defined,将之前自定义个HOST_URL删掉
    接下来新建三个.xcconfig文件,命名规则 目录-项目名.环境.xcconfig

    Config-SchemeProject.Debug Config-SchemeProject.Office Config-SchemeProject.Release

    .xcconfig生效,配置到对应的Configuration

    生效后可以在Build Settings中看到这个配置了

    附上demo
    喜欢的老铁,点个⭐️

    适配好多环境工程后仍存在一些问题的

    问题一:

    在我们没有配置xcconfig文件的工程,通过Cocoapods导入第三方库 $ pod install 后,我们的工程会自动配置成默认生效是使用了Pods-ProjectName.Debug.xcconfigProjectName.Debug.xcconfig这两个环境的xcconfig,那我们自定义的xcconfig就没法生效了。
    解决问题一的方法:
    在我们自定义的xcconfig中去导入Pods-ProjectName.Debug.xcconfig

    xcconfig生效的地方设置成我们自定义的xcconfig文件即可。

    问题二:

    比如我们用Cocoapods导入第三方库AFNetworking,在自定义的Config-SchemeProject.Debug.xcconfig里有这样一句

    OTHER_LDFLAGS = -framework "AFNetworking"
    

    Cocoapods生成的xcconfig里也会有同一个设置值并且还有其它参数呢:

    最后生效的只有我们自定义的xcconfig (解决完问题一的情况),而CocoapodsOTHER_LDFLAGS的其它参数并没有生效了

    解决问题的的方法:
    在自定义的xcconfig声明参数钱加上 $(inherited) 即可。 $(inherited)是继承的意思。

    OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
    

    相关文章

      网友评论

          本文标题:iOS 多环境配置的三种方式

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