# mcordovaconfig
**Repository Path**: myappcloud/mcordovaconfig
## Basic Information
- **Project Name**: mcordovaconfig
- **Description**: No description available
- **Primary Language**: Objective-C
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-04-15
- **Last Updated**: 2022-01-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MCordovaConfig
Custom xcode config for Cordova iOS
## 背景
因Cordova官网参数配置并不能满足所有场景,导致现有项目中大量插件都需要通过hook去修改xcode配置满足特定场景,代码管理非常混乱,想通过一个专属插件去做专业的事,其他插件只要引入这个插件,在自己的plugin.xml中声明对应的配置参数即可。
### 实现思路
通过解析Staging虚拟目录下的config.xml文件,得到自定义配置参数,将配置参数写入xcode。
### 插件引入方式
>
> 因目前插件实现功能还比较少,后续功能变更快,故先不加在core插件中,后期功能丰富插件稳定了可将依赖移除,直接在core插件中引入js即可。因dependency只能依赖公有库,公司不能创建公有库,故在github上创建。
在core插件中Platform iOS下引入:
` `;
### 插件自定义配置方式
> 1. 在工程路径下的config.xml的``中写入配置参数,这样在插件被添加的时候会自动写入项目Staging虚拟目录下的config.xml文件;例如:
```
```
> 2. 在插件plugin.xml的``中写入配置参数,所有的配置都包含在Cordova官方节点`config-file`中,`target`指向`config.xml`,这样在插件被添加的时候会自动写入项目Staging虚拟目录下的config.xml文件,例如:
>
```
```
1. [使用``修改build settings](#custom-preference)
2. [使用`custom-config-file`修改项目plist(*-Info.plist、Entitlements-*.plist)](#custom-config-file)
3. [调用示例](#调用示例)
### 使用``修改build settings
* 插件当前支持
* 通过`XCBuildConfiguration`块键去修改`project.pbxproj`文件
* `xcodefunc`:通过[node-xcode](https://github.com/alunny/node-xcode)提供的接口,目前仅支持`addResourceFile`
#### XCBuildConfiguration
* `XCBuildConfiguration `是``目前唯一支持的块类型,用于修改`platforms/ios/{PROJECT_NAME}/{PROJECT_NAME}.xcodeproj/project.pbxproj`;
* ``元素属性`name`必须以`XCBuildConfiguration-`作为前缀;
例如: ``
* 如果在`XCBuildConfiguration`块中指定的键值没有存在,则会新增一个
* 如果在`XCBuildConfiguration`块中指定的键值已经存在,则会直接覆盖;
* 当`Build Settings`中键值的value是`Multiple values`这种多选类型时,可通过在``元素上添加属性`mode="merge"`,不会直接覆盖,会追加一个新值进末尾;
* 可通过在``元素上添加属性`quote`给键值和value添加双引号`""`;键值key=`GCC_NEW_KEY`,value=`10.0`,在 `project.pbxproj`中的表现如下:
* quote可选值:
* none : key 和 value都不会添加双引号;默认为none;
表现为:`GCC_NEW_KEY = 10.0`
* key : 只对key添加双引号;
表现为:`"GCC_NEW_KEY" = 10.0`
* value : 只对value添加双引号;
表现为:`GCC_NEW_KEY = "10.0"`
* both : key和value都添加双引号;
表现为:`"GCC_NEW_KEY" = "10.0"`
* 默认,会同时作用于`debug`与`release`构建模式,可通过``元素属性`buildType`指定构建模式;例如:
* ``
#### .xcconfig
* Cordova 通过`/platforms/ios/cordova/`目录下的`.xcconfig`文件覆盖Xcode项目`project.pbxproj`里的设置;
* `build.xcconfig`里的设置会在对应的构建模式下被`build-debug.xcconfig`和 `build-release.xcconfig`里的配置覆盖;
* 如果`buildType`为`"debug"`或者`"realease"`,插件将分别在`build-debug.xcconfig`或`build-release.xcconfig`查找;
* 如果`buildType`没有指定,或设置成`none`,插件将会在`build.xcconfig`中查找对应配置参数;
* 如果在对应的`.xcconfig`文件中找到了与Staging虚拟目录下`config.xml`中``属性`name`对应的键值,其value将会被属性`name`里的`value`替代;
* 如果``属性`name`键值在对应的`.xcconfig`文件中没有找到,可通过`xcconfigEnforce="true"`元素进行新增;
* 当`.xcconfig`中键值的value是`Multiple values`这种多选类型时,可通过在``元素上添加属性`mode="merge"`,不会直接覆盖,会追加一个新值进末尾;
* 例如:`GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1`
* 追加`value="DEFINITIONS_TEST"`后变成:`GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 DEFINITIONS_TES`
#### xcodefunc
* 目前仅支持`addResourceFile `,后续会根据需要丰富更多的功能;
* 函数参数应该使用子元素指定。它支持以下属性:
* value : 文件或者文件目录路径,文件后缀名仅支持`.jpg .png`,如:`resource/ios/appicon/image.png` or `resource/ios/appicon`
* type : 类型,目前仅支持`appIcon`:将图片添加进项目并引用的同时,将图片名写入`info.plist.CFBundleIcons`中,可直接调用图片名动态设置App角标.
### 使用``plist(*-Info.plist、Entitlements-*.plist)
调用示例:
```
debug_domains
release_domains
123
CFBundleTypeRole
Editor
CFBundleURLName
MCustomUri
CFBundleURLSchemes
test
```
#### 调用示例
plugin.xml
```
//resource目录与platforms同级,将resource/ios/appicon文件夹里所有图片添加进工程并添加引用
//resource目录与platforms同级,将resource/ios/appicon/image.png图片添加进工程并添加引用
```
config.xml
```
//resource目录与platforms同级,将resource/ios/appicon文件夹里所有图片添加进工程并添加引用
//resource目录与platforms同级,将resource/ios/appicon/image.png图片添加进工程并添加引用
```