{"id":18881038,"url":"https://github.com/tylertemp/saintsbuild","last_synced_at":"2025-04-14T19:33:15.697Z","repository":{"id":205591414,"uuid":"714608943","full_name":"TylerTemp/SaintsBuild","owner":"TylerTemp","description":"a Unity build (packing) tool for Unity, mainly focused on android and ios.","archived":false,"fork":false,"pushed_at":"2024-04-06T13:53:00.000Z","size":66,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-05-21T10:40:10.512Z","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":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TylerTemp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2023-11-05T11:31:55.000Z","updated_at":"2024-03-08T06:45:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"dfeb85b5-8b57-4973-bd44-7d7a03c47fba","html_url":"https://github.com/TylerTemp/SaintsBuild","commit_stats":null,"previous_names":["tylertemp/saintsbuild"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2FSaintsBuild","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2FSaintsBuild/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2FSaintsBuild/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TylerTemp%2FSaintsBuild/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TylerTemp","download_url":"https://codeload.github.com/TylerTemp/SaintsBuild/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223644826,"owners_count":17178764,"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","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":"2024-11-08T06:47:07.168Z","updated_at":"2024-11-08T06:47:07.831Z","avatar_url":"https://github.com/TylerTemp.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SaintsBuild #\n\n[![openupm](https://img.shields.io/npm/v/today.comes.saintsbuild?label=openupm\u0026registry_uri=https://package.openupm.com)](https://openupm.com/packages/today.comes.saintsbuild/)\n[![openupm](https://img.shields.io/badge/dynamic/json?color=brightgreen\u0026label=downloads\u0026query=%24.downloads\u0026suffix=%2Fmonth\u0026url=https%3A%2F%2Fpackage.openupm.com%2Fdownloads%2Fpoint%2Flast-month%2Ftoday.comes.saintsbuild)](https://openupm.com/packages/today.comes.saintsbuild/)\n\n`SaintsBuild` is a Unity build (packing) tool for Unity, mainly focused on android and ios.\n\n## Installation ##\n\n*   Using [OpenUPM](https://openupm.com/packages/today.comes.saintsbuild/)\n\n    ```bash\n    openupm install today.comes.saintsbuild\n    ```\n\n*   Using git upm:\n\n    add to `Packages/manifest.json` in your project\n\n    ```javascript\n    {\n        \"dependencies\": {\n            \"today.comes.saintsbuild\": \"https://github.com/TylerTemp/SaintsBuild.git\",\n            // your other dependencies...\n        }\n    }\n    ```\n\n*   Using a `unitypackage`:\n\n    Go to the [Release Page](https://github.com/TylerTemp/SaintsBuild/releases) to download a desired version of `unitypackage` and import it to your project\n\n*   Using a git submodule:\n\n    ```bash\n    git submodule add https://github.com/TylerTemp/SaintsBuild.git Assets/SaintsBuild\n    ```\n    \n## Change Log##\n\n**1.0.4**\n\n1.  iOS: Rename `IosPlist.PListSetBoolean` to `IosPlist.SetBoolean`\n2.  Android: Rename `AndroidAppManifestBuild` to `AndroidManifest`\n3.  Android: Add `AndroidManifest.SetApplicationAttribute`\n4.  Android: Add `AndroidManifest.SetActivityWithLauncherIntentAttribute`\n\nSee [the full change log](https://github.com/TylerTemp/SaintsBuild/blob/master/CHANGELOG.md).\n\n## Usage ##\n\n### Android ###\n\n```csharp\n#if UNITY_ANDROID\nusing SaintsBuild.Editor;\nusing UnityEditor.Callbacks;\n\nnamespace SaintsBuild.Samples.Editor\n{\n    public static class BuildAndroid\n    {\n        [PostProcessBuild(1)]\n        public static void OnPostGenerateGradleAndroidProject(string path)\n        {\n            using AndroidManifest androidAppManifest = new AndroidManifest(path);\n            \n            // required for android 12 if you have activity alias etc:\n            androidManifest.SetActivityWithLauncherIntentAttribute(\"exported\", \"true\");\n\n            androidManifest.SetApplicationTheme(\"dark\");\n\n            androidManifest.SetStartingActivityName(\"CustomActivity\");\n\n            androidManifest.SetHardwareAcceleration();\n\n            androidManifest.SetBillingPermission();\n            androidManifest.SetVibratePermission();\n            // other you need\n            androidManifest.SetPermissionAttribute(\"WRITE_EXTERNAL_STORAGE\", 18);\n        }\n    }\n}\n#endif\n```\n\n\n### iOS ###\n\n```csharp\n#if UNITY_IOS\nusing UnityEditor;\nusing UnityEditor.Callbacks;\nusing UnityEditor.iOS.Xcode;\n\nnamespace SaintsBuild.Samples.Editor\n{\n    public static class BuildIos\n    {\n        [PostProcessBuild(1)]\n        public static void OnPostProcessBuildAttr(BuildTarget target, string path)\n        {\n            #region IosPBXProject\n            using (IosPBXProject iosPBXProject = new IosPBXProject(target, path)) {\n                // AddFramework\n                iosPBXProject.AddFrameworkCoreHaptics();\n                iosPBXProject.AddFrameworkAdServices();\n                iosPBXProject.AddFrameworkAppTrackingTransparency();\n                iosPBXProject.AddFrameworkAdSupport();\n                iosPBXProject.AddFrameworkCoreTelephony();\n                iosPBXProject.AddFrameworkSecurity();\n                iosPBXProject.AddFrameworkSystemConfiguration();\n                iosPBXProject.AddFrameworkLibCPP();\n                iosPBXProject.AddFrameworkLibZ();\n                iosPBXProject.AddFramework(\"YourFrameWorkName\");\n\n                // AddBuildProperty\n                iosPBXProject.AddBuildPropertyOtherLdFlags(\"-ObjC\");\n                iosPBXProject.AddBuildProperty(\"yourBuildName\", \"params\");\n\n                // AddInAppPurchase\n                iosPBXProject.ManagerAddInAppPurchase();\n                // use iosBuild.manager to add more you need\n\n                // BITCODE\n                // all target\n                iosPBXProject.SetAllBuildPropertyBitcode(\"NO\");\n                // or if you want to set for each target\n                iosPBXProject.SetBuildPropertyBitcode(iosPBXProject.project.GetUnityMainTargetGuid(), \"NO\");\n                iosPBXProject.SetBuildPropertyBitcode(iosPBXProject.project.TargetGuidByName(PBXProject.GetUnityTestTargetName()), \"NO\");\n                iosPBXProject.SetBuildPropertyBitcode(iosPBXProject.project.GetUnityFrameworkTargetGuid(), \"NO\");\n            }\n            #endregion\n\n            #region Plist\n            using (IosPlist iosPlist = new IosPlist(target, path)) {\n                // urlScheme\n                iosPlist.AddUrlSchemes(new[]\n                {\n                    new IosPlist.UrlScheme\n                    {\n                        CFBundleURLName = \"yourUrlName\",\n                        CFBundleTypeRole = \"Viewer\",\n                        CFBundleURLSchemes = new[] {\"yourSchemes\"},\n                    },\n                    new IosPlist.UrlScheme\n                    {\n                        CFBundleURLName = \"Another\",\n                        CFBundleTypeRole = \"Viewer\",\n                        CFBundleURLSchemes = new[] {\"anotherSchemes\"},\n                    },\n                });\n\n                // ITSAppUsesNonExemptEncryption\n                iosPlist.SetITSAppUsesNonExemptEncryption(false);\n\n                // if you manually installed the Facebook SDK (not Unity Package)\n                iosPlist.SetString(\"FacebookAppID\", \"123412341234\");\n                iosPlist.SetString(\"FacebookDisplayName\", \"fbAppName\");\n                iosPlist.SetString(\"FacebookClientToken\", \"token_1234\");\n                iosPlist.SetBoolean(\"FacebookAutoLogAppEventsEnabled\", true);\n                iosPlist.SetBoolean(\"FacebookAdvertiserIDCollectionEnabled\", true);\n            }\n            #endregion\n\n            #region IosAppIcon\n            using (IosAppIcon iosAppIcon = new IosAppIcon(target, path)) {\n                // set market icon as Unity will not process it\n                iosAppIcon.SetMarketIcon1024(\"Assets/Game/icon-1024x1024.png\");\n            }\n            #endregion\n        }\n    }\n}\n#endif\n```\n\n### IPostProcessScene ###\n\nGet a callback when building a scene or play a scene. Useful when you have some debug tools and want to clean it before playing or building.\n\n**Set Up**\n\nPut this in any of your editor script:\n\n```csharp\nusing UnityEditor.Callbacks;\n\n[PostProcessScene]\npublic static void OnPostProcessScene()\n{\n    Debug.Log(\"call SaintsBuild OnPostProcessScene\");\n    SaintsBuild.Editor.Callbacks.OnPostProcessScene();\n}\n```\n\n**Usage**\n\nClean Up:\n\n```csharp\npublic class CleanSlider: MonoBehaviour, IPostProcessScene\n{\n    public Slider slider;\n\n#if UNITY_EDITOR  // don't forget this\n    public void EditorOnPostProcessScene(bool isBuilding)\n    {\n        slider.value = 0;\n    }\n#endif\n}\n```\n\nAdvanced Usage:\n\n```csharp\npublic class TextContainer : MonoBehaviour, IPostProcessScene\n{\n    public GameObject prefab;\n    public Transform container;\n\n    private void Awake()\n    {\n#if UNITY_EDITOR\n        // in build, the clean process will happen before build\n        // but in play mode, we need to call it manually\n        CleanUpExample();\n#endif\n\n        // other works\n        foreach (int index in Enumerable.Range(0, 5))\n        {\n            GameObject example = Instantiate(prefab, container);\n            example.GetComponent\u003cText\u003e().text = $\"Runtime Awake created {index}\";\n        }\n    }\n\n#if UNITY_EDITOR\n    public void EditorOnPostProcessScene(bool isBuilding)\n    {\n        if (isBuilding)  // in building process, Unity will call this function and apply changes to build result\n        {\n            CleanUpExample();\n        }\n        else  // in play mode, unity will call Awake first, then call this function. Changes will be revoked after exiting play mode\n        {\n            // deal conflict with Awake\n        }\n    }\n\n    private void CleanUpExample()\n    {\n        foreach (Transform eachExample in container.Cast\u003cTransform\u003e().ToArray())\n        {\n            Debug.Log(eachExample.gameObject.name);\n            DestroyImmediate(eachExample.gameObject);\n        }\n    }\n#endif\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylertemp%2Fsaintsbuild","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftylertemp%2Fsaintsbuild","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftylertemp%2Fsaintsbuild/lists"}