0%

在本地 pod 里修改工程和 pod 的预编译标记

前言

起因是公司项目出了点问题,经排查发现是工程的预编译配置项错误造成一些动态的代码没有被引入,然后经搜索学习到怎么在 pod 里对主项目和本地的 pod 进行配置。

错误重现

首先一个本地的 pod 定义了一个 service,假设预编译标记为 DEFSB ,然后 .podspec 里是这么写的:

1
2
3
4
ss.user_target_xcconfig = {
"GCC_PREPROCESSOR_DEFINITIONS" => "DEFSB=1",
"SWIFT_ACTIVE_COMPILATION_CONDITIONS" => "DEFSB"
}

pod install 后发现在主项目-> Targets -> Build Settings, Apple Clang - Preprocessing 里添加了 DEFSB=1Swift Compiler - Custom Flags 里添加了 DEFSB ,然后在主项目里如下正常使用:

swift 文件里:

1
2
3
#if DEFSB
//...
#endif

OC 文件里:

1
2
3
#if DEFSB==1
//...
#endif

但是在本地的 pod 如下使用时就会出现问题,并没有加载实现方法, 意思就是运行时没有走 Manager-A.swift 中的方法实现:

首先是一个 dynamic 方法:public dynamic static func doSomething() , 然后在扩展中进行具体的实现:

public static func doSomething() 。假如这个 service 的预编译标记为 DEFSB , 代码如下:

1
2
3
4
// Manager.swift
public dynamic static func doSomething() {
//...
}
1
2
3
4
5
6
7
8
// Manager-A.swift
#if DEFSB
extension Manager {
public static func doSomething() {
//....
}
}
#endif

错误原因

根据 cocoapods 文档.user_target_xcconfig 是对主项目进行配置的,所以导致我在 Pods 下面库的 target 的 Build Settings 里没有添加这个标记。

解决办法

.podspec 中添加如下:

1
2
3
4
ss.pod_target_xcconfig = {
"GCC_PREPROCESSOR_DEFINITIONS" => "DEFSB=1",
"SWIFT_ACTIVE_COMPILATION_CONDITIONS" => "DEFSB"
}

pod install 后就可以在 pod 里正常使用了。