using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using UnityEditor; using UnityEngine; namespace AppleAuth.Editor { public static class AppleAuthMacosPostprocessorHelper { /// /// Use this script to change the bundle identifier of the plugin's library bundle to replace it with a personalized one for your product. /// This should avoid CFBundleIdentifier Collision errors when uploading the app to the macOS App Store /// /// Basically this should replace the plugin's bundle identifier from "com.lupidan.MacOSAppleAuthManager" to "{your.project.application.identifier}.MacOSAppleAuthManager" /// The current build target, so it's only executed when building for MacOS /// The path of the built .app file public static void FixManagerBundleIdentifier(BuildTarget target, string path) { if (target != BuildTarget.StandaloneOSX) { throw new Exception(GetMessage("FixManagerBundleIdentifier should only be called when building for macOS")); } try { var macosAppleAuthManagerInfoPlistPath = GetInfoPlistPath(path); var macosAppleAuthManagerInfoPlist = File.ReadAllText(macosAppleAuthManagerInfoPlistPath); var regex = new Regex(@"\CFBundleIdentifier\<\/key\>\s*\(com\.lupidan)\.MacOSAppleAuthManager\<\/string\>"); var match = regex.Match(macosAppleAuthManagerInfoPlist); if (!match.Success) { throw new Exception(GetMessage("Can't locate CFBundleIdentifier in MacOSAppleAuthManager's Info.plist")); } var modifiedMacosAppleAuthManagerInfoPlist = macosAppleAuthManagerInfoPlist .Remove(match.Groups[1].Index, match.Groups[1].Length) .Insert(match.Groups[1].Index, PlayerSettings.applicationIdentifier); File.WriteAllText(macosAppleAuthManagerInfoPlistPath, modifiedMacosAppleAuthManagerInfoPlist); Debug.Log(GetMessage($"Renamed MacOSAppleAuthManager.bundle bundle identifier from \"com.lupidan.MacOSAppleAuthManager\" -> \"{PlayerSettings.applicationIdentifier}.MacOSAppleAuthManager\"")); } catch (Exception exception) { throw new Exception(GetMessage( $"Error while fixing MacOSAppleAuthManager.bundle bundle identifier :: {exception.Message}")); } } private static string GetMessage(string message) => $"{nameof(AppleAuthMacosPostprocessorHelper)}: {message}"; private static string GetInfoPlistPath(string path) { const string bundleName = "MacOSAppleAuthManager.bundle"; var possibleRootPaths = new List(); if (Directory.Exists(path)) { possibleRootPaths.Add(path); } if (Directory.Exists($"{path}.app")) { possibleRootPaths.Add($"{path}.app"); } var bundleDirectories = possibleRootPaths .SelectMany(possibleRootPath => Directory.GetDirectories( possibleRootPath, bundleName, SearchOption.AllDirectories)) .ToArray(); if (bundleDirectories.Length == 0) { throw new Exception(GetMessage($"Can't locate any {bundleName}")); } if (bundleDirectories.Length > 1) { var allPaths = string.Join("\n", bundleDirectories); throw new Exception(GetMessage($"Located multiple {bundleName}!\n{allPaths}")); } var bundlePath = bundleDirectories[0]; Debug.Log(GetMessage($"Located {bundleName} at {bundlePath}")); var infoPlistPath = Path.Combine( bundlePath, "Contents", "Info.plist"); if (!File.Exists(infoPlistPath)) { throw new Exception(GetMessage("Can't locate MacOSAppleAuthManager's Info.plist")); } Debug.Log(GetMessage($"Located Info.plist at {infoPlistPath}")); return infoPlistPath; } } }