多环境配置的3种方式
- Project:包含了项目所有的代码,资源文件,所有信息。 workspace是多个project的合集
- Target:对指定代码和资源文件的具体构建方式。
- Scheme:对指定Target的环境配置。
② 多target
targets - 右键 - duplicate 就会新建一个target
选择新的target,同时需要修改bundleid, info.plist文件及其所对应的bundle setting配置info.plist file 对应的文件名,如下
如何使用?
OC下: buildsetting - preprocessor macros
Swift 下:other swift flags , 变量前需要添加-D, 比如-DEV
平时使用的宏定义DEBUG状态其实就是此处定义的DEBUG, 所以也可自己定义一个如DEV, 那么使用的时候直接使用这个DEV宏,在这个target下才会使用。
#if DEV
#import <LoginApp_Dev-Swift.h>
#else
#import <LoginApp-Swift.h>
#endif
缺点: 配置复杂 target 、build setting、 info.plist等多个地方配置
③scheme
在project里面配置configurations
添加之后可以看到scheme里面 build configurations里面就多了一个配置
添加scheme
然后将scheme 和 configurations 一一对应。
使用:一般生产环境和测试环境不一样,会对应不同的域名, 之前都是一个pch文件定义一个besturl, testurl进行切换, 那么显示使用不同scheme就可实现。
①、在build setting - user defined 自定义一个HOST_URL ,不同版本设置不同的url
②在info.plist文件里面添加HOST_URL键值对
③ 那么就可以从info.plist里面获取url的值了
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infodic = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"utl - %@", infodic[@"HOST_URL"]);
//不同版本输出不同结果不同
2021-12-15 15:30:04.018123+0800 LoginApp[29754:4261661] utl - www.baidu.com
2021-12-15 15:42:47.007850+0800 LoginApp[29795:4274616] utl - https:127.0.0.2
方法3 配置XConfig文件
1.command + n ,选择Configuration settings file, 分别设置2个xcconfig文件,Config-Debug.xcconfig和Config-Release.xcconfig文件。
2.然后2个config配置文件分别对应project
3.配置xcconfig文件内容:
比如分别设置URL_HOSTT,Config-Debug.xcconfig设置为URL_HOSTT = 127.0.0.1, Config-Release.xcconfig设置为URL_HOSTT = 127.0.0.3
4.设置info.plist文件参数,使用中括号{}
5.通过读取info.plist配置文件读取信息
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infodic = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"utl - %@", infodic[@"URL_HOSTT"]);
//输出结果
2021-12-26 12:39:20.166389+0800 LoginApp[58381:4219508] utl - 127.0.0.3
xcconfig文件配置build setting缩写xcodebuildsettings.com xcodebuildsettings.com 或 build setting右键 xcode help
xcconfig文件冲突
当有了cocopods文件,需要添加第三方库的时候可直接在Podfile文件里编辑 pod 'xxx',然后直接在终端当前文件目录下, 执行pod install命令。
- 当我们使用cocopos的同时也配置了自己的xcconfig文件,那么就会导致cocopos时冲突,那么在自己的xcconfig文件里面使用#include关键字导入cocopods的xcconfig文件即可。
当自己的xcconfig文件与cocopods里的配置关键字重复了,使用$(inherited) 关键字继承
在xcconfig中使用//时会变成注释, 那么可以定义一个变量,比如:
定义1个变量
A = /
HOST_URL = http:${A}/127.0.0.1
//为OTHER_ LDFLAGS添加添加2个条件: Debug iphonesimulator* x86_ 64,在此条件下才会编译生效
OTHER_ LDFLAGS[ config=Debug][ sdk=iphonesimulator*][ arch=x86_ 64]=- framework "Cat"
修改当前编译环境:
mach-o文件与xcode编译环境配置
Mach-O(Mach Object)是macOS、iOS、iPadOS存储程序和库的文件格式。对应系统通过应用二进制接口(application binary interface,缩写为(ABI)来运行该格式的文件。
Mach-O格式用来替代BSD系统的a.out格式。Mach-O文 件格式保存了在编译过程和链接过程中产生的机器代码和数据,从而为静态链接和动态链接的代码提供了单一文件格式。
查看macho文件
- 使用命令 objdump --macho --private-headers + 目标文件目录
Macintosh:~ johnson$ objdump --macho --private-headers /Users/johnson/Library/Developer/Xcode/DerivedData/LoginApp-bfvfmvvpqamjuuhdlkfhamgnnjqy/Build/Products/Debug-iphonesimulator/LoginApp.app/LoginApp
-
使用machoview.app
macho是可读可写,在ios上运行必须要签名的
应用启动过程其实就是链接过程
全局符号和本地符号