2025-09-06 05:39:03 +00:00
using System.IO ;
using UnityEditor ;
using UnityEditor.Callbacks ;
#if UNITY_ANDROID
#elif UNITY_IOS
using UnityEditor.iOS.Xcode ;
using UnityEditor.iOS.Xcode.Extensions ;
using Facebook.Unity.Settings ;
#endif
using UnityEngine ;
public static class AutoBuild
{
static void Common ( BuildTargetGroup _btg , BuildTarget _bt )
{
PlayerSettings . applicationIdentifier = "com.fgb.randomgfgostop" ;
EditorUserBuildSettings . SwitchActiveBuildTarget ( _btg , _bt ) ;
if ( _bt = = BuildTarget . Android )
{
PlayerSettings . Android . splitApplicationBinary = false ;
File . WriteAllText ( "Assets/Resources/VersionCode.txt" , PlayerSettings . Android . bundleVersionCode . ToString ( ) ) ;
PlayerSettings . Android . targetArchitectures = AndroidArchitecture . ARMv7 | AndroidArchitecture . ARM64 ;
}
else
{
File . WriteAllText ( "Assets/Resources/VersionCode.txt" , PlayerSettings . iOS . buildNumber ) ;
PlayerSettings . iOS . appleDeveloperTeamID = "788PYWMPC6" ; // 필굿밴디츠
//PlayerSettings.iOS.appleDeveloperTeamID = "A9997B8HR5"; // 나인탭
PlayerSettings . iOS . appleEnableAutomaticSigning = true ;
PlayerSettings . iOS . sdkVersion = iOSSdkVersion . DeviceSDK ;
}
EditorUserBuildSettings . SwitchActiveBuildTargetAsync ( _btg , _bt ) ;
}
static void Show_BuildFolder ( BuildTarget _bt )
{
if ( _bt = = BuildTarget . Android ) System . Diagnostics . Process . Start ( "AndroidData" ) ;
else System . Diagnostics . Process . Start ( "IOSData" ) ;
}
static void BuildStart ( string path , BuildTarget _bt )
{
BuildPipeline . BuildPlayer ( EditorBuildSettings . scenes , path , _bt , BuildOptions . None ) ;
Show_BuildFolder ( _bt ) ;
}
#if UNITY_ANDROID
[MenuItem("AutoBuild/EmptySymbol")]
static void EmptySymbol ( )
{
2025-09-07 06:59:30 +00:00
PlayerSettings . SetScriptingDefineSymbols ( UnityEditor . Build . NamedBuildTarget . Android , "" ) ;
2025-09-06 05:39:03 +00:00
}
[MenuItem("AutoBuild/Set_AndroidKeyStore")]
static void Set_AndroidKeyStore ( )
{
PlayerSettings . Android . useCustomKeystore = true ;
PlayerSettings . Android . keystoreName = "AndroidData/RandomGFGoStop.keystore" ;
PlayerSettings . Android . keyaliasName = "fgb" ;
PlayerSettings . Android . keystorePass = PlayerSettings . Android . keyaliasPass = "fgb123!!" ;
}
2025-09-07 23:05:01 +00:00
[MenuItem("AutoBuild/Set_OneStoreKeyStore")]
static void Set_OneStoreKeyStore ( )
{
PlayerSettings . Android . useCustomKeystore = true ;
PlayerSettings . Android . keystoreName = "AndroidData/RandomGFGoStop_One.keystore" ;
PlayerSettings . Android . keyaliasName = "fgb" ;
PlayerSettings . Android . keystorePass = PlayerSettings . Android . keyaliasPass = "fgb123!!" ;
}
2025-09-06 05:39:03 +00:00
[MenuItem("AutoBuild/Build APK with KeyStore")]
static void Build_APK_with_KeyStore ( )
{
Common ( BuildTargetGroup . Android , BuildTarget . Android ) ;
2025-09-07 23:05:01 +00:00
Set_AndroidKeyStore ( ) ;
2025-09-06 05:39:03 +00:00
//PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel23;
var curVer = PlayerSettings . bundleVersion ;
PlayerSettings . bundleVersion = "9.9.9" ;
EditorUserBuildSettings . buildAppBundle = false ;
BuildStart ( "AndroidData/GoStop_Test_" + Application . version + "_(" + PlayerSettings . Android . bundleVersionCode + ").apk" , BuildTarget . Android ) ;
PlayerSettings . bundleVersion = curVer ;
}
2025-09-07 23:05:01 +00:00
[MenuItem("AutoBuild/Build APK with KeyStore (OneStore)")]
2025-09-07 06:59:30 +00:00
static void Build_APK_OneStore ( )
{
Common ( BuildTargetGroup . Android , BuildTarget . Android ) ;
2025-09-07 23:05:01 +00:00
Set_OneStoreKeyStore ( ) ;
2025-09-07 06:59:30 +00:00
//PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel23;
PlayerSettings . SetScriptingDefineSymbols ( UnityEditor . Build . NamedBuildTarget . Android , "OneStore" ) ;
EditorUserBuildSettings . buildAppBundle = false ;
BuildStart ( "AndroidData/GoStop_Test_" + Application . version + "_(" + PlayerSettings . Android . bundleVersionCode + ").apk" , BuildTarget . Android ) ;
EmptySymbol ( ) ;
}
2025-09-06 05:39:03 +00:00
[MenuItem("AutoBuild/Build Live AAB")]
static void Build_AAB ( )
{
+ + PlayerSettings . Android . bundleVersionCode ;
Common ( BuildTargetGroup . Android , BuildTarget . Android ) ;
2025-09-07 23:05:01 +00:00
Set_AndroidKeyStore ( ) ;
2025-09-06 05:39:03 +00:00
2025-09-07 06:59:30 +00:00
PlayerSettings . SetScriptingDefineSymbols ( UnityEditor . Build . NamedBuildTarget . Android , "" ) ;
2025-09-06 05:39:03 +00:00
EditorUserBuildSettings . buildAppBundle = true ;
BuildStart ( "AndroidData/GoStop_Live_" + Application . version + "_(" + PlayerSettings . Android . bundleVersionCode + ").aab" , BuildTarget . Android ) ;
EmptySymbol ( ) ;
//if (EditorUtility.DisplayDialog("라이브 빌드", "현재 버전 : " + PlayerSettings.bundleVersion + " " + PlayerSettings.Android.bundleVersionCode.ToString(), "OK", "Not Build"))
// AppBundlePublisher.Build();
}
2025-09-07 23:05:01 +00:00
[MenuItem("AutoBuild/Build Live AAB (OneStore)")]
static void Build_AAB_OneStore ( )
{
+ + PlayerSettings . Android . bundleVersionCode ;
Common ( BuildTargetGroup . Android , BuildTarget . Android ) ;
Set_OneStoreKeyStore ( ) ;
PlayerSettings . SetScriptingDefineSymbols ( UnityEditor . Build . NamedBuildTarget . Android , "" ) ;
EditorUserBuildSettings . buildAppBundle = true ;
BuildStart ( "AndroidData/GoStop_Live_OneStore" + Application . version + "_(" + PlayerSettings . Android . bundleVersionCode + ").aab" , BuildTarget . Android ) ;
EmptySymbol ( ) ;
//if (EditorUtility.DisplayDialog("라이브 빌드", "현재 버전 : " + PlayerSettings.bundleVersion + " " + PlayerSettings.Android.bundleVersionCode.ToString(), "OK", "Not Build"))
// AppBundlePublisher.Build();
}
2025-09-06 05:39:03 +00:00
#endif
#if UNITY_IOS
[MenuItem("AutoBuild/IOS Xcode")]
static void Build_IOS_Xcode ( )
{
PlayerSettings . iOS . buildNumber = ( int . Parse ( PlayerSettings . iOS . buildNumber ) + 1 ) . ToString ( ) ;
PlayerSettings . SetScriptingDefineSymbolsForGroup ( BuildTargetGroup . iOS , "FGB_LIVE" ) ;
Common ( BuildTargetGroup . iOS , BuildTarget . iOS ) ;
BuildStart ( "IOSData/IOSXcodeLive_" + Application . version + "_" + PlayerSettings . iOS . buildNumber , BuildTarget . iOS ) ;
PlayerSettings . SetScriptingDefineSymbolsForGroup ( BuildTargetGroup . iOS , "" ) ;
}
[MenuItem("AutoBuild/IOS Xcode Test")]
static void Build_IOS_Xcode_Test ( )
{
PlayerSettings . iOS . buildNumber = ( int . Parse ( PlayerSettings . iOS . buildNumber ) + 1 ) . ToString ( ) ;
Common ( BuildTargetGroup . iOS , BuildTarget . iOS ) ;
BuildStart ( "IOSData/IOSSRDebugOn_" + Application . version + "_" + PlayerSettings . iOS . buildNumber , BuildTarget . iOS ) ;
}
[MenuItem("AutoBuild/Test IOS Simulator")]
static void Build_Test_IOS_Simulator ( )
{
Common ( BuildTargetGroup . iOS , BuildTarget . iOS ) ;
PlayerSettings . iOS . sdkVersion = iOSSdkVersion . SimulatorSDK ;
BuildStart ( "IOSData/IOSTestBuild_" + Application . version + "_" + PlayerSettings . iOS . buildNumber , BuildTarget . iOS ) ;
}
#endif
[PostProcessBuild(1)]
static void OnPostProcessBuild ( BuildTarget buildTarget , string path )
{
if ( buildTarget = = BuildTarget . iOS )
{
#if UNITY_IOS
Debug . Log ( "OnPostProcessBuild : " + path ) ;
var plistPath = Path . Combine ( path , "Info.plist" ) ;
var plist = new PlistDocument ( ) ;
plist . ReadFromFile ( plistPath ) ;
PlistElementDict allowsDict = plist . root . CreateDict ( "NSAppTransportSecurity" ) ;
allowsDict . SetBoolean ( "NSAllowsArbitraryLoads" , true ) ;
PlistElementDict exceptionsDict = allowsDict . CreateDict ( "NSExceptionDomains" ) ;
PlistElementDict domainDict = exceptionsDict . CreateDict ( "amazonaws.com" ) ;
domainDict . SetBoolean ( "NSExceptionAllowsInsecureHTTPLoads" , true ) ;
domainDict . SetBoolean ( "NSIncludesSubdomains" , true ) ;
domainDict = exceptionsDict . CreateDict ( "inonotebook.iptime.org" ) ;
domainDict . SetBoolean ( "NSExceptionAllowsInsecureHTTPLoads" , true ) ;
domainDict . SetBoolean ( "NSIncludesSubdomains" , true ) ;
plist . root . SetBoolean ( "GADIsAdManagerApp" , true ) ;
plist . root . SetBoolean ( "FirebaseMessagingAutoInitEnabled" , false ) ;
plist . root . SetBoolean ( "FirebaseAppStoreReceiptURLCheckEnabled" , false ) ;
plist . root . SetBoolean ( "ITSAppUsesNonExemptEncryption" , false ) ;
plist . root . SetString ( "NSAdvertisingAttributionReportEndpoint" , "https://appsflyer-skadnetwork.com/" ) ;
// Add string setting
// SKAdNetwork IDs integration(for iOS14+)
var arraySKAdNetworkItems = plist . root . CreateArray ( "SKAdNetworkItems" ) ;
foreach ( string id in SKAdNetworkIdentifiers )
{
var dict = arraySKAdNetworkItems . AddDict ( ) ;
dict . SetString ( "SKAdNetworkIdentifier" , id ) ;
}
plist . root . SetString ( "FacebookAppID" , FacebookSettings . AppId ) ;
plist . root . SetString ( "FacebookDisplayName" , Application . productName ) ;
// Add URL Scheme
var array = plist . root . CreateArray ( "CFBundleURLTypes" ) ;
var urlDict = array . AddDict ( ) ;
urlDict . SetString ( "CFBundleURLName" , Application . identifier ) ;
var urlInnerArray = urlDict . CreateArray ( "CFBundleURLSchemes" ) ;
urlInnerArray . AddString ( "fb" + FacebookSettings . AppId ) ;
var googleiosurlscheme = urlDict . CreateArray ( "CFBundleURLSchemes" ) ;
googleiosurlscheme . AddString ( "com.googleusercontent.apps.107333004578-n74n1eaap2bgtg2od6ia1vk4ls5c139j" ) ;
var fbArray = plist . root . CreateArray ( "LSApplicationQueriesSchemes" ) ;
fbArray . AddString ( "fbapi" ) ;
fbArray . AddString ( "fb-messenger-api" ) ;
fbArray . AddString ( "fbauth2" ) ;
fbArray . AddString ( "fbshareextension" ) ;
plist . WriteToFile ( plistPath ) ;
// get project info
string pbxPath = PBXProject . GetPBXProjectPath ( path ) ;
var proj = new PBXProject ( ) ;
proj . ReadFromFile ( pbxPath ) ;
var guid = proj . GetUnityMainTargetGuid ( ) ;
var unitytest = proj . TargetGuidByName ( PBXProject . GetUnityTestTargetName ( ) ) ;
var unityframework = proj . GetUnityFrameworkTargetGuid ( ) ;
proj . AddBuildProperty ( guid , "OTHER_LDFLAGS" , "-lc++" ) ;
proj . SetBuildProperty ( guid , "ENABLE_BITCODE" , "NO" ) ;
proj . SetBuildProperty ( guid , "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES" , "YES" ) ;
proj . SetBuildProperty ( unitytest , "ENABLE_BITCODE" , "NO" ) ;
proj . SetBuildProperty ( unityframework , "ENABLE_BITCODE" , "NO" ) ;
proj . SetBuildProperty ( unityframework , "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES" , "NO" ) ;
// Add Push framework
proj . AddFrameworkToProject ( guid , "UserNotifications.framework" , false ) ;
proj . WriteToFile ( pbxPath ) ;
// get entitlements path
string [ ] idArray = Application . identifier . Split ( '.' ) ;
var entitlementsPath = $"Unity-iPhone/{idArray[idArray.Length - 1]}.entitlements" ;
// create capabilities manager
var capManager = new ProjectCapabilityManager ( pbxPath , entitlementsPath , null , guid ) ;
// Add necessary capabilities
capManager . AddPushNotifications ( true ) ;
capManager . AddSignInWithApple ( ) ;
capManager . AddBackgroundModes ( BackgroundModesOptions . RemoteNotifications ) ;
// Write to file
capManager . WriteToFile ( ) ;
Debug . Log ( "OnPostProcessBuild end" ) ;
#endif
}
}
[PostProcessBuild(45)] //must be between 40 and 50 to ensure that it's not overriden by Podfile generation (40) and that it's added before "pod install" (50)
public static void FixPodFile ( BuildTarget buildTarget , string buildPath )
{
if ( buildTarget ! = BuildTarget . iOS )
{
return ;
}
Debug . Log ( "FixPodFile" ) ;
using ( StreamWriter sw = File . AppendText ( buildPath + "/Podfile" ) )
{
sw . WriteLine ( "post_install do |installer|" ) ;
sw . WriteLine ( "installer.generated_projects.each do |project|" ) ;
sw . WriteLine ( "project.targets.each do |target|" ) ;
sw . WriteLine ( "target.build_configurations.each do |config|" ) ;
sw . WriteLine ( "config.build_settings[\"DEVELOPMENT_TEAM\"] = \"788PYWMPC6\"" ) ;
sw . WriteLine ( "end\nend\nend\nend" ) ;
}
//string podfilePath = Path.Combine(buildPath, "Podfile");
//if (File.Exists(podfilePath))
//{
// string[] lines = File.ReadAllLines(podfilePath);
// for (int i = 0; i < lines.Length; i++)
// {
// if (lines[i].Contains("Firebase/Auth"))
// lines[i] = " pod 'Firebase/Auth', '10.28.1'";
// else if (lines[i].Contains("GoogleSignIn"))
// lines[i] = " pod 'GoogleSignIn', '5.0.0'";
// else if (lines[i].Contains("GTMSessionFetcher/Core'"))
// lines[i] = " pod 'GTMSessionFetcher/Core'', '2.1'";
// }
// File.WriteAllLines(podfilePath, lines);
//}
}
private static readonly string [ ] SKAdNetworkIdentifiers = new string [ ]
{
"v9wttpbfk9.skadnetwork" ,
"n38lu8286q.skadnetwork" ,
"su67r6k2v3.skadnetwork" ,
"9t245vhmpl.skadnetwork" ,
"m8dbw4sv7c.skadnetwork" ,
"tl55sbb4fm.skadnetwork" ,
"wzmmz9fp6w.skadnetwork" ,
"4fzdc2evr5.skadnetwork" ,
"294l99pt4k.skadnetwork" ,
"4w7y6s5ca2.skadnetwork" ,
"7ug5zh24hu.skadnetwork" ,
"5l3tpt7t6e.skadnetwork" ,
"t38b2kh725.skadnetwork" ,
"c6k4g5qg8m.skadnetwork" ,
"wg4vff78zm.skadnetwork" ,
"v72qych5uu.skadnetwork" ,
"mp6xlyr22a.skadnetwork" ,
"cstr6suwn9.skadnetwork" ,
"4pfyvq9l8r.skadnetwork" ,
"w9q455wk68.skadnetwork" ,
"44jx6755aq.skadnetwork" ,
"k6y4y55b64.skadnetwork" ,
"8s468mfl3y.skadnetwork" ,
"mlmmfzh3r3.skadnetwork" ,
"4dzt52r2t5.skadnetwork" ,
"ydx93a7ass.skadnetwork" ,
"3qy4746246.skadnetwork" ,
"prcb7njmu6.skadnetwork" ,
"v79kvwwj4g.skadnetwork" ,
"glqzh8vgby.skadnetwork" ,
"s39g8k73mm.skadnetwork" ,
"238da6jt44.skadnetwork" ,
"424m5254lk.skadnetwork" ,
"5a6flpkh64.skadnetwork" ,
"hs6bdukanm.skadnetwork" ,
"x44k69ngh6.skadnetwork" ,
"a8cz6cu7e5.skadnetwork" ,
"488r3q3dtq.skadnetwork" ,
"32z4fx6l9h.skadnetwork" ,
"22mmun2rn5.skadnetwork" ,
"3rd42ekr43.skadnetwork" ,
"6yxyv74ff7.skadnetwork" ,
"ppxm28t8ap.skadnetwork" ,
"lr83yxwka7.skadnetwork" ,
"578prtvx9j.skadnetwork" ,
"a2p9lx4jpn.skadnetwork" ,
"av6w8kgt66.skadnetwork" ,
"4468km3ulz.skadnetwork" ,
"9rd848q2bz.skadnetwork" ,
"5lm9lj6jb7.skadnetwork" ,
"f7s53z58qe.skadnetwork" ,
"k674qkevps.skadnetwork" ,
"kbd757ywx3.skadnetwork" ,
"yclnxrl5pm.skadnetwork" ,
"zq492l623r.skadnetwork" ,
"zmvfpc5aq8.skadnetwork" ,
"f73kdq92p3.skadnetwork" ,
"f38h382jlk.skadnetwork" ,
"2u9pt9hc89.skadnetwork" ,
"5tjdwbrq8w.skadnetwork" ,
"3sh42y64q3.skadnetwork" ,
"9nlqeag3gk.skadnetwork"
} ;
}