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

Posted

技术标签:

【中文标题】Xcode 构建基于 JSON 配置文件的动态设置版本【英文标题】:Xcode build dynamically set version based off JSON config file 【发布时间】:2018-01-11 15:55:58 【问题描述】:

注意这是一个 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 实现相同的目标?我知道我们需要修改 CFBundleShortVersionStringBuild Phases 似乎是动态设置版本的最佳方式,但是这些似乎都是增量/某种 CI 工具的一部分,而不是阅读一个明确设置的 JSON 文件。

任何帮助将不胜感激。

(注:如果我遗漏了任何会导致投反对票的明显内容,请告诉我,我可以相应地修改问题 - 大量点击否定并不能真正帮助提出有效问题的发帖人 -> 抱歉,这是基于我之前问过的一个问题)。

【问题讨论】:

【参考方案1】:

最终通过我在 Xcode Build Phases 的 Run Script 中调用的 Node 脚本执行此操作:

构建阶段脚本:

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`);
  
);

【讨论】:

以上是关于Xcode 构建基于 JSON 配置文件的动态设置版本的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建设置中从 xcode 7.2 中删除配置文件

ionic cordova xcode 9构建开发团队和冲突的配置文件

Xcode 4 - 专用配置设置:构建设置和方案定义

是否可以使用 Xcode 构建脚本将 JSON 文件下载到应用程序包?

无法从 Xcode 中的 JSON 获取最新值

Xcode 7.2 找不到匹配的配置文件