Xcode构建基于JSON配置文件的动态设置版本

时间:2018-01-11 15:55:59

标签: ios json xcode plist

N.B。这是一个React Native项目。

使用Android和Gradle,我能够解析JSON文件并读取值,以便在构建期间动态地将版本应用到应用程序。

JSON文件如下所示:

{
  "name": "AwesomeApp",
  "displayName": "Awesome",
  "version": {
    "major": 3,
    "minor": 2,
    "patch": 1
  }
}

最简单的形式是Gradle文件:

def jsonFile = file('../../app.json')
def parsedJson = new groovy.json.JsonSlurper().parseText(jsonFile.text)
def versionMajor = parsedJson.version.major
def versionMinor = parsedJson.version.minor
def versionPatch = parsedJson.version.patch
def appVersionCode = versionMajor * 10000 + versionMinor * 100 + versionPatch
def appVersionName = "${versionMajor}.${versionMinor}.${versionPatch}"

然后在构建中,我可以将其设置为使用动态设置版本:

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.1'

    defaultConfig {
        applicationId "com.awesome.app"
        ...
        versionCode appVersionCode
        versionName appVersionName
        ...
    }
}

如何使用iOS和Xcode实现相同目标?我知道我们需要修改CFBundleShortVersionString构建阶段似乎是动态设置版本的最佳方式,但这些似乎都是某种CI工具的增量/部分而不是读取显式设置的JSON文件。

任何帮助都将不胜感激。

(注意如果我错过任何明显可能导致投票结果的事情让我知道,我可以相应地修改问题 - 群体点击否定并不能真正帮助那些提出有效问题的海报 - >对不起这是基于我之前问过的一个问题。)

1 个答案:

答案 0 :(得分:0)

通过Node脚本完成此操作,我在Xcode构建阶段的运行脚本中调用:

构建阶段脚本:

AppVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}")
APP_VERSION="$AppVersion" node ${PROJECT_DIR}/../iOSVersioning.js

<强> iOSVersioning.js:

const { exec } = require('child_process');
const APP_VERSION = process.env.APP_VERSION;
const version = require('../app.json').version;
const versionName = `${version.major}.${version.minor}.${version.patch}`;

if (APP_VERSION == versionName) {
    process.exit();
}

exec(
  `/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${versionName}" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"`,
  (err, stdout, stderr) => {
    if (err) {
      console.log('Failed to apply the app version.');
      process.exit(1);
    }

    console.log(`Applied app verion: ${versionName}`);
  }
);