#if UNITY_IOS && UNITY_EDITOR using UnityEditor; using UnityEditor.Build; using UnityEditor.Build.Reporting; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; using UnityEngine; using System.IO; public class GoogleSignInIOSBuildPatch { [PostProcessBuild(100)] public static void OnPostProcessBuild(BuildTarget buildTarget, string pathToBuiltProject) { if (buildTarget != BuildTarget.iOS) return; string plistPath = Path.Combine(pathToBuiltProject, "Info.plist"); // === Modify Info.plist === PlistDocument plist = new PlistDocument(); plist.ReadFromFile(plistPath); PlistElementDict rootDict = plist.root; // 1. Set GIDClientID rootDict.SetString("GIDClientID", GameConstants.iOS_ClientID); // 2. Add CFBundleURLSchemes PlistElementArray urlTypes = rootDict.CreateArray("CFBundleURLTypes"); PlistElementDict urlDict = urlTypes.AddDict(); PlistElementArray schemes = urlDict.CreateArray("CFBundleURLSchemes"); schemes.AddString(GameConstants.iOS_URL_Scheme); plist.WriteToFile(plistPath); Debug.Log("✅ Info.plist patched with GIDClientID and CFBundleURLSchemes."); // === Modify UnityAppController.mm === string appControllerPath = Path.Combine(pathToBuiltProject, "Classes", "UnityAppController.mm"); if (!File.Exists(appControllerPath)) { Debug.LogWarning("⚠️ UnityAppController.mm not found."); return; } string content = File.ReadAllText(appControllerPath); string injection = $"[GIDSignIn sharedInstance].clientID = @\"{GameConstants.iOS_ClientID}\";"; if (!content.Contains(injection)) { string marker = "didFinishLaunchingWithOptions:(NSDictionary*)launchOptions"; int index = content.IndexOf(marker); if (index > -1) { int braceIndex = content.IndexOf("{", index); if (braceIndex > -1) { content = content.Insert(braceIndex + 1, "\n " + injection); File.WriteAllText(appControllerPath, content); Debug.Log("✅ UnityAppController.mm patched with GIDClientID."); } } } } } #endif