Cocoapods 應用——設置子Pod全局宏

最近在做一個 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 生效,如果你從網上搜索,會搜出一頓文章講述這樣的步驟。設置位置如下圖:


Target 設置

但是,對于通過 CocoaPods 管理的項目,這一步驟只會對主工程生效,而對于 Pods 下的自工程,是不會生效的。所以,并不能解決本人上面提出的問題。

添加 pch 文件

prefix compile header文件,即我們常說的 pch 文件,預編譯器會自動查找這樣的文件并預處理加入到配置中的 pch 文件,實現一些預處理工作。

prefix header

可以嘗試一下,同樣,

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!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容