Latest 1.2.0
License MIT
Platforms ios 10.0, osx 10.9, watchos 3.0, tvos 10.0, requires ARC

Build Status
GitHub release
Swift Package Manager
GitHub license

ConfigurationPlist is a tool to generate configuration files by merging yamls or jsons.

By splitting the file for each type of setting, it is possible to prevent conflicts of configuration files.

Also, by splitting the file for environment configurations, it will be easier to overwrite configurations for each environment.


Base JSON file

    "API": {
        "domain": "http://localhost",
        "path": {
            "login": {
                "method": "POST",
                "path": "/login"
            "getList": {
                "method": "GET",
                "path": "/list"

Call above configuration


let file = Bundle.main.path(forResource: "Base", ofType: "json")!
let data = try! Data(contentsOf: URL(fileURLWithPath: filePath))
let config = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
let api = config["API"] as! [String: Any]
let domain = api.domain as! String // "http://localhost"
let loginPath = (api.path as! [String: Any])["login"] as! [String: Any]
let path = loginPath.path // "/login"
let method = loginPath.method // "POST"

Using ConfigurationPlist

let config = AppConfig.default
let domain = config.API.domain // "http://localhost"
let path = config.API.path.login.path // "/login"
let method = config.API.path.login.method // "POST"



  • Create directory for splitted configuration files, e.g. $PROJECT/Resources/Config.
  • If you use different settings for each environment, create .env into above directory.
  • You don’t have to add above directory into project.


  • Add the following line to your test target in your Podfile:
pod 'ConfigurationPlist'
  • Add the following Run script build phase to your test target’s Build Phases:
if [ "${CONFIGURATION}" = 'Release' ]; then

"${PODS_ROOT}/ConfigurationPlist/configurationPlist" -e $ENVIRONMENT "$SRCROOT/$PROJECT/Resources/Config"

You can replace "$SRCROOT/$PROJECT/Resources/Config" to the relative path from project to the directory you created.

Also, you can add -o option with output path to specify where Config.plist and AppConfig.generated.swift will be created.

  • Add $(TEMP_DIR)/configurationplist-lastrun into Input Files in above Run script build phase.
  • Add $(SRCROOT)/Config.plist and $(SRCROOT)/AppConfig.generated.swift into Output Files in above Run script build phase.

    • If you set a path to output generated files by -o option, you have to change Output Files to those paths.
  • Drag the new Run Script phase above the Compile Sources phase and below Check Pods Manifest.lock
    If you are using R.swift, drag the new Run Script above the Run Script phase for R.swift and you can load with R.file.configPlist.
  • Build your project, in Finder you will now see a Config.plist and AppConfig.generated.swift in $SRCROOT or a path you set with -o option in above Run script build phase.
  • Drag them into your project.

Tip: Add the Config.plist pattern and the *.generated.swift pattern to your .gitignore file to prevent unnecessary conflicts.


TODO: Future support.

What is ConfigurationPlist doing?

  • Detect all yml/json files in $SRCROOT/$PROJECT/Resources/Config, exclude .env.
  • If the -e option is set and a file with the same name as that option exists in $SRCROOT/$PROJECT/Resources/Config/.env, only that file is read.
    For example, -e staging option means to read $SRCROOT/$PROJECT/Resources/Config/.env/staging.{yml/yaml/json}.
  • Parse above files as Swift.Dictionary.
  • Deep merge the above dictionaries.
  • Output merged dictionary as a plist file.



Available under the MIT License.

Latest podspec

    "name": "ConfigurationPlist",
    "version": "1.2.0",
    "summary": "Generate Config.plist for macOS/iOS",
    "description": "ConfigurationPlist is a tool to get strong typed configuration from yamls/jsons.",
    "homepage": "",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    "authors": {
        "417.72KI": "[email protected]"
    "social_media_url": "",
    "platforms": {
        "ios": "10.0",
        "osx": "10.9",
        "watchos": "3.0",
        "tvos": "10.0"
    "requires_arc": true,
    "source": {
        "http": ""
    "preserve_paths": "configurationPlist"

Pin It on Pinterest

Share This