{"id":30668247,"url":"https://github.com/gameframex/com.gameframex.unity.xcode","last_synced_at":"2026-05-09T15:01:35.075Z","repository":{"id":296661199,"uuid":"860747928","full_name":"GameFrameX/com.gameframex.unity.xcode","owner":"GameFrameX","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-12T08:40:44.000Z","size":59,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-12T10:26:48.246Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GameFrameX.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-21T04:27:34.000Z","updated_at":"2025-08-12T08:40:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"39e848cc-b273-49f8-953c-18525aac1c86","html_url":"https://github.com/GameFrameX/com.gameframex.unity.xcode","commit_stats":null,"previous_names":["gameframex/com.gameframex.unity.xcode"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/GameFrameX/com.gameframex.unity.xcode","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.xcode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.xcode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.xcode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.xcode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GameFrameX","download_url":"https://codeload.github.com/GameFrameX/com.gameframex.unity.xcode/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.xcode/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273056043,"owners_count":25037873,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-31T23:47:03.516Z","updated_at":"2026-05-09T15:01:35.046Z","avatar_url":"https://github.com/GameFrameX.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n![GameFrameX Logo](https://download.alianblank.com/gameframex/gameframex_logo_320.png)\n\n# GameFrameX Xcode Config\n\n[![Version](https://img.shields.io/github/v/release/gameframex/com.gameframex.unity.xcode?label=version\u0026color=green)](https://github.com/gameframex/com.gameframex.unity.xcode/releases)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE.md)\n[![Documentation](https://img.shields.io/badge/docs-gameframex-brightgreen.svg)](https://gameframex.doc.alianblank.com)\n\n**All-in-One Solution for Indie Game Development · Empowering Indie Developers' Dreams**\n\n[📖 Documentation](https://gameframex.doc.alianblank.com) • [🚀 Quick Start](#quick-start)\n\n---\n\n🌐 **Language**: **English** | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [한국어](README.ko.md)\n\n---\n\n\u003c/div\u003e\n\nAn editor tool that automatically configures Xcode projects after Unity iOS builds. Declaratively manage all Xcode settings — Info.plist, frameworks, libraries, build properties, Capabilities, CocoaPods sources, localizations, and more — through a JSON config file, with no manual Xcode operations needed.\n\n## Features\n\n- **Info.plist** — Supports string, boolean, integer, array, dictionary types with recursive writing\n- **System Frameworks/Libraries** — Automatically add or remove `.framework` / `.tbd`\n- **Build Properties** — Set, append, or remove Build Settings (e.g. `ENABLE_BITCODE`, `GCC_ENABLE_OBJC_EXCEPTIONS`)\n- **Capabilities** — In-App Purchase, Game Center, Push Notifications, Sign In with Apple, Background Modes, iCloud, App Groups, Associated Domains\n- **Localization** — Auto-generate `.lproj/InfoPlist.strings` with multi-language app name support\n- **CocoaPods** — Replace Podfile default source, support multiple mirror sources\n- **XcScheme** — Inject environment variables and launch arguments\n- **Files/Folders** — Auto-copy to Xcode project and add to compilation, recognize `.framework`/`.bundle`\n- **Compile Flags** — Set compile options for specific source files\n- **Linker Flags** — Configure `OTHER_LDFLAGS` etc.\n- **Run Path Search Paths** — Configure runtime search paths\n- **Code Signing** — Configure Team ID, bundle identifier, code sign identity, and provisioning profile\n- **Multi-Config Merge** — Support deep recursive merge of multiple `XCodeConfig.json` files for multi-module collaboration\n\n## Installation\n\nChoose one of the following methods:\n\n**Method 1: Edit manifest.json**\n\nAdd to `Packages/manifest.json` under `dependencies`:\n\n```json\n\"com.gameframex.unity.xcode\": \"https://github.com/gameframex/com.gameframex.unity.xcode.git\"\n```\n\n**Method 2: Package Manager Git URL**\n\nUnity Editor → Window → Package Manager → Add package from git URL, enter:\n\n```\nhttps://github.com/gameframex/com.gameframex.unity.xcode.git\n```\n\n**Method 3: Manual Download**\n\nClone or download this repository and place it in your Unity project's `Packages` directory. It will be recognized automatically.\n\n## Quick Start\n\n1. Copy `Editor/XCodeConfigDemo.json` from the package to any directory in your project\n2. Rename it to `XCodeConfig.json`\n3. Modify the configuration as needed (see Configuration Reference below)\n4. Build the iOS project — the tool will automatically apply all settings\n\n## Configuration Reference\n\nThe configuration file must be named `XCodeConfig.json`. It can be placed anywhere in the project, and multiple files are supported (they will be merged automatically).\n\n### Top-Level Structure\n\n```json\n{\n  \"signing\": {},\n  \"plist\": {},\n  \"environmentVariables\": {},\n  \"launcherArgs\": [],\n  \"podSource\": [],\n  \"localizations\": [],\n  \"capabilities\": {},\n  \"unityFramework\": {},\n  \"unityMain\": {}\n}\n```\n\n| Field | Type | Description |\n| :--- | :--- | :--- |\n| `signing` | object | Code signing configuration (see below) |\n| `plist` | object | Info.plist key-value pairs, values support any type |\n| `environmentVariables` | object | XcScheme environment variables, both keys and values are strings |\n| `launcherArgs` | string[] | XcScheme launch arguments list |\n| `podSource` | string[] | CocoaPods source URLs, replaces Podfile default source |\n| `localizations` | array | Localization configuration (see below) |\n| `capabilities` | object | iOS app capability configuration (see below) |\n| `unityFramework` | object | UnityFramework target configuration |\n| `unityMain` | object | Unity-iPhone target configuration |\n\n### unityFramework / unityMain\n\nBoth share the same structure, targeting UnityFramework and Unity-iPhone respectively:\n\n```json\n{\n  \"libs\": { \"+\": [], \"-\": [] },\n  \"frameworks\": { \"+\": [], \"-\": [] },\n  \"properties\": { \"=\": {}, \"+\": {}, \"-\": {} },\n  \"files\": {},\n  \"folders\": {},\n  \"filesCompileFlag\": {},\n  \"otherLinkerFlag\": {},\n  \"runPathSearchPaths\": {}\n}\n```\n\n#### libs — System Libraries\n\n```json\n{\n  \"libs\": {\n    \"+\": [\"libz.tbd\", \"libicucore.tbd\"],\n    \"-\": [\"libstdc++.tbd\"]\n  }\n}\n```\n\n- `+` Library names to add\n- `-` Library names to remove\n\n#### frameworks — System Frameworks\n\n```json\n{\n  \"frameworks\": {\n    \"+\": [\"WebKit.framework\", \"UserNotifications.framework\"],\n    \"-\": []\n  }\n}\n```\n\n- `+` Framework names to add\n- `-` Framework names to remove\n\n#### properties — Build Properties\n\n```json\n{\n  \"properties\": {\n    \"=\": { \"ENABLE_BITCODE\": \"NO\" },\n    \"+\": { \"OTHER_CFLAGS\": [\"-flag1\", \"-flag2\"] },\n    \"-\": { \"UNUSED_FLAG\": [\"\"] }\n  }\n}\n```\n\n- `=` Set properties (key-value pairs, overwrites existing values)\n- `+` Append properties (array values are appended to existing list)\n- `-` Remove properties\n\n#### files — File Copy\n\n```json\n{\n  \"files\": {\n    \"ios_libs.txt\": \"Classes/ios_libs.txt\"\n  }\n}\n```\n\n- Key: File path in the Unity project (same level as `Assets`)\n- Value: Relative path to copy to in the Xcode project\n- If the destination exists, it will be deleted before copying\n\n#### folders — Folder Copy\n\n```json\n{\n  \"folders\": {\n    \"XC\": \"Classes/XC\"\n  }\n}\n```\n\n- Key: Folder path in the Unity project\n- Value: Relative path to copy to in the Xcode project\n- Automatically recognizes `.framework` and `.bundle`\n- An error is raised if the destination already exists\n\n#### filesCompileFlag — File Compile Flags\n\n```json\n{\n  \"filesCompileFlag\": {\n    \"Classes/PluginBase/UnityViewControllerListener.mm\": \"-fobjc-arc\"\n  }\n}\n```\n\n- Key: File path in the Xcode project\n- Value: Compile flags to set\n\n#### otherLinkerFlag — Linker Flags\n\n```json\n{\n  \"otherLinkerFlag\": {\n    \"OTHER_LDFLAGS\": \"-ObjC\"\n  }\n}\n```\n\n#### runPathSearchPaths — Runtime Search Paths\n\n```json\n{\n  \"runPathSearchPaths\": {\n    \"LD_RUNPATH_SEARCH_PATHS\": \"@executable_path/Frameworks\"\n  }\n}\n```\n\n### signing — Code Signing\n\nApplied to the Unity-iPhone (main) target only. All fields are optional.\n\n```json\n{\n  \"signing\": {\n    \"teamId\": \"XXXXXXXXXX\",\n    \"bundleId\": \"com.company.app\",\n    \"codeSignIdentity\": \"Apple Development\",\n    \"codeSignStyle\": \"Automatic\",\n    \"provisioningProfileSpecifier\": \"\"\n  }\n}\n```\n\n| Field | Type | Description |\n| :--- | :--- | :--- |\n| `teamId` | string | Apple Developer Team ID (`DEVELOPMENT_TEAM`) |\n| `bundleId` | string | App bundle identifier (`PRODUCT_BUNDLE_IDENTIFIER`) |\n| `codeSignIdentity` | string | Code signing identity, options: `Apple Development`, `Apple Distribution`, `iPhone Developer`, `iPhone Distribution` |\n| `codeSignStyle` | string | Signing style: `Automatic` or `Manual` |\n| `provisioningProfileSpecifier` | string | Provisioning profile name (required for Manual mode) |\n\n### capabilities — App Capabilities\n\n```json\n{\n  \"capabilities\": {\n    \"inAppPurchase\": true,\n    \"gameCenter\": false,\n    \"pushNotifications\": false,\n    \"signInWithApple\": false,\n    \"backgroundModes\": [\"audio\", \"remote-notification\"],\n    \"iCloud\": {\n      \"keyValueStorage\": false,\n      \"iCloudDocument\": false,\n      \"customContainers\": []\n    },\n    \"appGroups\": [],\n    \"associatedDomains\": []\n  }\n}\n```\n\n| Field | Type | Description |\n| :--- | :--- | :--- |\n| `inAppPurchase` | bool | In-App Purchase |\n| `gameCenter` | bool | Game Center |\n| `pushNotifications` | bool | Push Notifications |\n| `signInWithApple` | bool | Sign In with Apple |\n| `backgroundModes` | string[] | Background modes, options: `audio`, `location`, `voip`, `newsstand`, `external`, `bluetooth`, `bluetooth-peripheral`, `fetch`, `remote-notification` |\n| `iCloud.keyValueStorage` | bool | iCloud Key-Value Storage |\n| `iCloud.iCloudDocument` | bool | iCloud Document Storage |\n| `iCloud.customContainers` | string[] | iCloud custom containers |\n| `appGroups` | string[] | App Group identifiers |\n| `associatedDomains` | string[] | Associated domains (Universal Links) |\n\n### localizations — Localization\n\n```json\n{\n  \"localizations\": [\n    {\n      \"languageCode\": \"en\",\n      \"validMap\": [\n        { \"key\": \"CFBundleDisplayName\", \"value\": \"My Game\" }\n      ]\n    },\n    {\n      \"languageCode\": \"zh-Hans\",\n      \"validMap\": [\n        { \"key\": \"CFBundleDisplayName\", \"value\": \"我的游戏\" }\n      ]\n    }\n  ]\n}\n```\n\n- `languageCode` — ISO 639-1 language code (use `zh-Hans` for Simplified Chinese / `zh-Hant` for Traditional Chinese)\n- `validMap` — Key-value pairs, each with `key` and `value`\n- Automatically generates `.lproj/InfoPlist.strings` and adds them to the project\n\n### plist — Info.plist Configuration\n\nSupports arbitrary nested levels. Common configuration:\n\n```json\n{\n  \"plist\": {\n    \"CFBundleURLTypes\": [\n      {\n        \"CFBundleTypeRole\": \"Editor\",\n        \"CFBundleURLSchemes\": [\"myapp\"],\n        \"CFBundleURLName\": \"com.example.myapp\"\n      }\n    ],\n    \"NSAppTransportSecurity\": {\n      \"NSAllowsArbitraryLoads\": true\n    },\n    \"NSCameraUsageDescription\": \"Camera access is required for QR scanning\",\n    \"ITSAppUsesNonExemptEncryption\": false\n  }\n}\n```\n\n## Multi-Config Merging\n\nYou can place multiple `XCodeConfig.json` files in the project (e.g., each module maintains its own). During build, they are automatically discovered and deep-merged:\n\n- **Objects**: Recursively merged (child keys merged layer by layer)\n- **Arrays**: Union-merged (deduplicated)\n- **Scalars**: Latter overwrites former\n\nThis allows Xcode configurations from multiple SDKs / modules to be managed independently without conflicts.\n\n## Full Example\n\n```json\n{\n  \"signing\": {\n    \"teamId\": \"XXXXXXXXXX\",\n    \"bundleId\": \"com.company.app\",\n    \"codeSignIdentity\": \"Apple Development\",\n    \"codeSignStyle\": \"Automatic\",\n    \"provisioningProfileSpecifier\": \"\"\n  },\n  \"plist\": {\n    \"CFBundleURLTypes\": [\n      {\n        \"CFBundleTypeRole\": \"Editor\",\n        \"CFBundleURLSchemes\": [\"bbqgame\"],\n        \"CFBundleURLName\": \"com.smartdogx.bbq\"\n      },\n      {\n        \"CFBundleTypeRole\": \"Editor\",\n        \"CFBundleURLSchemes\": [\"wx5dfe430e96b395a6\"]\n      }\n    ],\n    \"LSApplicationQueriesSchemes\": [\n      \"weixin\", \"wechat\", \"mqqapi\"\n    ],\n    \"NSAppTransportSecurity\": {\n      \"NSAllowsArbitraryLoads\": true,\n      \"NSExceptionDomains\": {\n        \"qq.com\": {\n          \"NSIncludesSubdomains\": true,\n          \"NSThirdPartyExceptionAllowsInsecureHTTPLoads\": true,\n          \"NSThirdPartyExceptionRequiresForwardSecrecy\": false\n        }\n      }\n    },\n    \"NSCameraUsageDescription\": \"Camera access is required\",\n    \"NSMicrophoneUsageDescription\": \"Microphone access is required\",\n    \"NSPhotoLibraryUsageDescription\": \"Photo library access is required\",\n    \"ITSAppUsesNonExemptEncryption\": false,\n    \"NSUserTrackingUsageDescription\": \"This identifier will be used to deliver personalized ads\"\n  },\n  \"environmentVariables\": {\n    \"IDEPreferLogStreaming\": \"YES\",\n    \"OS_ACTIVITY_MODE\": \"disable\"\n  },\n  \"launcherArgs\": [\"-debug\"],\n  \"localizations\": [\n    {\n      \"languageCode\": \"en\",\n      \"validMap\": [\n        { \"key\": \"CFBundleDisplayName\", \"value\": \"My Game\" }\n      ]\n    },\n    {\n      \"languageCode\": \"zh-Hans\",\n      \"validMap\": [\n        { \"key\": \"CFBundleDisplayName\", \"value\": \"我的游戏\" }\n      ]\n    }\n  ],\n  \"podSource\": [\n    \"https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git\"\n  ],\n  \"capabilities\": {\n    \"inAppPurchase\": true,\n    \"gameCenter\": false,\n    \"pushNotifications\": false,\n    \"signInWithApple\": false,\n    \"backgroundModes\": [],\n    \"iCloud\": {\n      \"keyValueStorage\": false,\n      \"iCloudDocument\": false,\n      \"customContainers\": []\n    },\n    \"appGroups\": [],\n    \"associatedDomains\": []\n  },\n  \"unityFramework\": {\n    \"libs\": {\n      \"+\": [\"libicucore.tbd\", \"libz.tbd\"],\n      \"-\": []\n    },\n    \"frameworks\": {\n      \"+\": [\"WebKit.framework\", \"Security.framework\"],\n      \"-\": []\n    },\n    \"properties\": {\n      \"=\": {\n        \"ENABLE_BITCODE\": \"NO\",\n        \"GCC_ENABLE_OBJC_EXCEPTIONS\": true,\n        \"CLANG_ENABLE_OBJC_ARC\": true\n      },\n      \"+\": {},\n      \"-\": {}\n    },\n    \"filesCompileFlag\": {},\n    \"otherLinkerFlag\": {\n      \"OTHER_LDFLAGS\": \"-ObjC\"\n    },\n    \"files\": {},\n    \"folders\": {}\n  },\n  \"unityMain\": {\n    \"libs\": {\n      \"+\": [\"libz.tbd\"],\n      \"-\": []\n    },\n    \"frameworks\": {\n      \"+\": [\"WebKit.framework\"],\n      \"-\": []\n    },\n    \"properties\": {\n      \"=\": { \"ENABLE_BITCODE\": \"NO\" },\n      \"+\": {},\n      \"-\": {}\n    },\n    \"otherLinkerFlag\": {\n      \"OTHER_LDFLAGS\": \"-ObjC\"\n    },\n    \"files\": {},\n    \"folders\": {}\n  }\n}\n```\n\n## Notes\n\n- The configuration file must be named `XCodeConfig.json`, otherwise it will not be recognized\n- All code is under `#if UNITY_IOS` conditional compilation, no impact on other platforms\n- The tool runs at `[PostProcessBuild(ushort.MaxValue)]` priority, executing after all other post-processing\n- Folder copy raises an error if the destination exists; file copy deletes the existing destination first\n\n## Requirements\n\n- Unity 2017.1 or later\n- iOS build target\n- Xcode (automatically required when Unity exports iOS project)\n\n## License\n\n[Apache License 2.0](LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.xcode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.xcode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.xcode/lists"}