feature: dyld && LD 链接器

This commit is contained in:
杭城小刘
2024-06-29 16:00:34 +08:00
parent 1a8659e143
commit 13f7457be9
367 changed files with 12893 additions and 3049 deletions

142
Chapter1 - iOS/1.136.md Normal file
View File

@@ -0,0 +1,142 @@
## 多环境配置
多环境配置的3种方式
- 多 target 配置
- Scheme 多 target 进行环境配置
- xconfig 文件配置
QATarget、Scheme 的关系是什么?
- Project包含了项目所有的代码、资源文件所有信息
- Scheme对于指定 Target 的环境配置
- Target对于指定代码和资源文件的具体构建方式
## 多环境配置的不同方式
### 多 Target 的方式
针对需要多配置的项目,在 Xcode 中,对其进行复制,存在多个 Target。搭配不同的宏定义来实现控制逻辑的效果。
注意duplicate 之后target 虽然多了一份,但是代码和资源不变,所以
<img src="./../assets/MultipleTargetProjectConfig.png" style="zoom:30%" />
<img src="./../assets/XcodeMacroSupportedWithOCAndSwift.png" style="zoom:30%" />
- OCBuild Settings -> Preprocessor Macros 里面的 Debug/Release 模式下添加自定义宏。比如在 debug 模式下 `IsOCDebug = 1`
- SwiftBuild Settings -> Other Swift Flags 里的 Debug/Release 模式下添加自宏定义。注意命名有格式要求:`-D + 宏名称`
当对某个 Target “Duplicate” 之后,会产生一份新的 plist 文件
<img src="./../assets/MultiplePListAfterDuplicateTarget.png" style="zoom:30%" />
思考:该方式还是存在的问题:多个 info.plist、配置比较乱
### 多 Scheme 的方式
针对一个 Target 可以添加多个 Scheme步骤如下
<img src="./../assets/XcodeAddScheme.png" style="zoom:30%" />
这样的创建好之后,该 Target 存在3个 Scheme 了。有了 Scheme 有什么作用呢?设置宏定义的时候可以针对不同的 Scheme 进行设置。
<img src="./../assets/AddMacroForDifferentScheme.png" style="zoom:30%" />
针对 OC、Swift 分别设置了很多宏定义,接下去需要跑 Beta 配置的代码,怎么办?
<img src="./../assets/XcodeSwitchSchemeManually.png" style="zoom:30%" />
点击 Edit Scheme在 Run 里面选择对应的 Scheme。
但这样好像蛮烦的,每次运行不同配置的代码,都需要手动切换 Scheme。有没有什么办法解决切换问题呢。
创建实体 Scheme
创建 Scheme 步骤Xcode -> New Scheme再弹出的方框内选择对应的 Target然后输入需要创建的 Scheme 名称。此次我们创建了Debug、Beta 2个新的 Scheme。
<img src="./../assets/XcodeCreateScheme.png" style="zoom:40%" />
创建好之后,可以看到实体 Scheme 和虚拟 Scheme 存在多对多的关系。但我们可以基于此,选择实体的 Scheme然后在 Run 里面 “Build Configuration” 里面选择对应的 Scheme 与之对应。
<img src="./../assets/XcodeSchemeMatchWithConfigScheme.png" style="zoom:40%" />
创建之后就可以根据 Scheme 设置值,在 `Build Settings -> User-Defined` 下添加自定义的字段,同时可以根据 Scheme 设置不同的值。
设置后的值怎么使用?将自定义的变量用 plist 存储。之后读取再使用。
完整如下图:
<img src="./../assets/SetValueUseDifferentSchemeAndUseViaPlist.png" style="zoom:40%" />
切换不同的 Scheme可以运行不同的效果当前 case 下,选择 Debug Scheme输出不同结果 `HOST_URL: http://www.debug.baidu.com`
思考:目前的方案已经优雅不少,但是还是存在,自定义宏的时候需要选择不同的 Scheme过程繁琐。
### Xcconfig
Xcode 自带的 Configuration Settings File 可以支持自定义一些宏,还可以修改 Build Settings 里面的选项。
创建步骤如下:
<img src="./../assets/XcodeCreateXCConfig.png" style="zoom:30%" />
文件命名为:`文件夹名称-项目名称.scheme名称.xcconfig`,比如 `Config-Xcconfig.debug.xcconfig`
几个 Scheme 就创建几个对应的 Xcconfig 文件。
修改和完善创建的 Xcconfig 配置文件里的内容。之后在 Xcode 的 Project 选项下,找到 Configurations选择对应的 Scheme然后选择右边对应的 Xcconfig 文件。如下图
<img src="./../assets/XcodeSpecifySchemeWithConfig.png" style="zoom:30%" />
我们只在 `Config-Xcconfig.debug.xcconfig` 文件中添加了 `OTHER_LDFLAGS = -framework "AFNetworking"`Xcode 切换到 debug scheme 下,然后 Command + B 编译。
<img src="./../assets/XcodeDebugXcconfigSpecifyLDLinkFlags.png" style="zoom:30%" />
验证结果:
- 编译前切换到 Build Settings 后,查看 ”Other Linker Flags“ 的 Debug 项为空
- 编译后切换到 Build Settings 后,查看 ”Other Linker Flags“ 的 Debug 项为 `-framework ”AFNetworking“`
因为 Xcconfig 文件,具有操作和修改 Build Settings 的能力,所以用好 Xcconfig 文件,不只可以实现替代宏定义和切换繁琐的问题,还可以实现很多其他手动修改 Build Settings 的问题。
说明:在 Xcode Build Settings 手动配置的信息,和通过 Xcconfig 方式编写的信息,不会冲突。
对于 xcconfig 文件,我们其实并不陌生、因为在使用 Cocoapods 的时候就已经在使用这个文件了,只是很多人不知道其中变量的含义。