iOS & Android 一份代码区分配置信息

12. 二月 2020 感悟 0

最近在开发SDK,因为这个SDK是给到合作方的,里面有关于合作方的配置信息,而且由于种种原因,不能使用后台配置的方式来区分。所以,有了这个需求【一份代码,在本地区分合作方的配置信息】。

下面就分iOS和Android两个平台来说下我的处理方式

iOS使用xcconfig来区分

在iOS中,主要有两个方式可以进行区分,plist和xcconfig。使用时有几个考虑:

  1. 在代码中可以直接使用

  2. SDK打包后不会暴露文件(plist会直接暴露在framework里面)

  3. 编译之后的配置信息为合作方配置信息

使用xconfig区分配置信息

xcconfig来区分配置信息,主要是通过Apple Clang - Preprocessing -> Preprocessor Macros这个字段里预置。但是不能直接写配置信息在这一行里,因为我们是需要在编译后,不同的配置就在代码里了。所以,文件目录设置如下:

  • Config.h 是对接代码内使用的数据结构

  • Common.xcconfig存储的是对应文件中的键值,GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=0 appid='$(appid)' 比如说appid这个值,那么这个真实值,其实是在合作方的xcconfig

  • Partner.xcconfig是存储对应的真实值。需要引入#include "../Common.xcconfig"文件

 

配置设置好后,更改Scheme来使用

PROJECT->Configurations里配置对应的名字,在based on Configuration File选择刚才建好的xcconfig文件

运行测试的时候需要注意,因为生成的framework文件会在以对应的Configurations的name为文件夹名,比如,debug的对应frameworks就会在../debug/sdk.framework

所以,你的主工程项目也需要建立同样的Configurations,匹配起来使用,Edit Scheme -> Run -> Build Configurations

Android使用gradle来区分

Android其实我的想法应该是和iOS差不多,会有一个配置文件,以项目工程来选择,但是其实build.gradle里面的内容基本已经固定。Flavor的字段也是确定的,所以不太好更改。

因为需要在编译之后需要生成对应的可使用的代码,这很容易联想到Android工程自动生成的BuildConfig

buildConfigField添加配置信息

BuildConfig中添加配置信息需要在build.gradle中使用buildConfigField来在buildTypes->debug/release添加,例如:

  • config.gradle,扩展一个方法,通过传入的配置名称来获取同目录下的配置文件,通过转化为properties这种形式,来获取对应的配置信息

  • config_partner1.gradle,存放合作方1的配置信息

  • config_partner2.gradle,存放合作方2的配置信息

同时,因为我们需要正常展示文件信息在Project中,所以,有以下的文件配置

但是这样无法满足动态性,所以,需要使用gradle.ext来进行动态性的填充。

在build.gradle中使用拓展的获取配置信息方法

build.gradle 中,我们在android -> defaultConfig中调用扩展方法initProjectConfig("PartnerName")

🌟这些都是需要在SDK中不得已使用到的,希望大家永远不要接到类似的需求~