cocoapods 中预定义宏

1.一般项目的scheme是Debug, Release分别对应debug模式、release模式
2.由于项目接口环境是区分环境的,所以在项目中设置了Debug_dev, Debug_uat, Debug_pro,删掉了默认的Debug模式

问题产生的背景

Debug_dev时, 通过cocoapods方式引入的MLeaksFinder并不生效,排查原因发现MLeaksFinder有如下代码定义。MLeaksFinder是根据DEBUG宏判断是否需要加载,但是在项目内部打印,Debug为1

//#define MEMORY_LEAKS_FINDER_ENABLED 0

#ifdef MEMORY_LEAKS_FINDER_ENABLED
#define _INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED
#else
#define _INTERNAL_MLF_ENABLED DEBUG
#endif

分析原因

  1. 分析原因:pod模块代码编译链接的时间要先于工程内代码,此时要么是获取不到DEBUG的值,要么是此时没有DEBUG

  2. 排查Project的Build Settings和Pods的Build Settings,发现有个Preprocessor Macros的宏,定义了DEBUG=1,看名字猜测这是一个预定义的宏,用来设置项目中编译前的一些值,这里也就是Debug值的由来之一

    cocopods_macro_1

    如图,找到问题所在,在Debug_dev模式下并没有所需要的DEBUG=1,那么我们就需要在这里加上去

  3. Proprocessor MacrosDebug_dev这里手动加上DEBUG=1是生效了,但是每次pod install之后又被重新覆盖没了。所以这个方法不是可靠的,我们需要在每次pod install触发之后写上DEBUG=1这个值

解决

  1. 搜索资料发现Podfile里面可以做自定义配置,如下:
    pod 'MLeaksFinder'
    
    post_install do |installer_representation|
        installer_representation.pods_project.targets.each do |target|
            puts "===================>target name #{target.name}"
            if target.name == 'MLeaksFinder'
                target.build_configurations.each do |config|
                    puts "===================>wxq #{config}"
                    if config.name == 'Debug_dev'
                        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
                    end
                end
            end
        end
    end
  1. 然后执行pod install命令,更新配置,效果如下,然后运行项目,OK


    cocopods_macro_2

参考

https://stackoverflow.com/questions/27133993/why-isnt-my-cocoapods-post-install-hook-updating-my-preprocessor-macros

你可能感兴趣的:(cocoapods 中预定义宏)