最近在做一個 sdk 接入的工作,將 sdk 接入到另外一個 App 中,但是接入時需要改寫 App 使用的某個庫 L,而 L 庫同時被多個 App 引用,所以,我的改寫必須對其他 App 不產生影響,所以想到了通過預編譯宏的方式,保留原有類和接口的同時,讓定義了宏的 App 端可以使用新的 sdk。現在的問題就是,如何添加宏定義,讓當前 App 端滿足
日常工作中,預編譯宏我們常常遇到,比如下面幾個,你一定遇到過:
#ifdef __OBJC__
#import "xxxxx.h"
#endif
or
#ifdef DEBUG
#define REMOTE_API_URL @"xxxxxxxxxxx"
#endif
or
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
預編譯指令
預編譯階段預編譯器能識別的指令,一般以#開頭。
常用的如:
// 文件包含
#include
#import
// 宏定義
#define
// 條件編譯
#if #else #endif
#ifdef #else #endif
#ifndef #else #endif
// 錯誤、警告處理
#error
#warning
// 編譯器控制
#pragma
// 其他
#line
條件編譯預編譯指令完全可以滿足控制代碼是否生效的需求,但是,如何設置預編譯宏定義呢?下面研討幾個方法。
修改 Target 的Build Setting
最先想到的方法,可以對整個 App 生效,如果你從網上搜索,會搜出一頓文章講述這樣的步驟。設置位置如下圖:
但是,對于通過 CocoaPods 管理的項目,這一步驟只會對主工程生效,而對于 Pods 下的自工程,是不會生效的。所以,并不能解決本人上面提出的問題。
添加 pch 文件
prefix compile header文件,即我們常說的 pch 文件,預編譯器會自動查找這樣的文件并預處理加入到配置中的 pch 文件,實現一些預處理工作。
可以嘗試一下,同樣,
Podfile Hook
這個方法是在同事的提醒下操作完成的,完美解決了本人的問題。
通過 Podfile 的 Hook 功能,給 Pods 項目下的某個 target 預定義宏
http://stackoverflow.com/questions/27133993/why-isnt-my-cocoapods-post-install-hook-updating-my-preprocessor-macros
在Podfile末尾添加下面語法,給XXXXXX這個pod下的target預定義全局宏HELLO_MACRO
// ...
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
puts "===================>target name #{target.name}"
if target.name == 'XXXXXX'
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','HELLO_MACRO']
puts "===================>target build configure #{config.build_settings}"
end
end
end
end
最后,Enjoy yourself!