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;
}
}
}