using System.Collections.Generic; using System.IO; using System.Linq; using UnityEditor; using UnityEditor.PackageManager; using UnityEngine; #if UNITY_IOS using System; using UnityEditor.iOS.Xcode; #endif namespace TapTap.Common.Editor { public static class TapCommonCompile { #if UNITY_IOS public static string GetProjPath(string path) { return PBXProject.GetPBXProjectPath(path); } public static PBXProject ParseProjPath(string path) { var proj = new PBXProject(); proj.ReadFromString(File.ReadAllText(path)); return proj; } public static string GetUnityFrameworkTarget(PBXProject proj) { #if UNITY_2019_3_OR_NEWER string target = proj.GetUnityFrameworkTargetGuid(); return target; #endif var unityPhoneTarget = proj.TargetGuidByName("Unity-iPhone"); return unityPhoneTarget; } public static string GetUnityTarget(PBXProject proj) { #if UNITY_2019_3_OR_NEWER string target = proj.GetUnityMainTargetGuid(); return target; #endif var unityPhoneTarget = proj.TargetGuidByName("Unity-iPhone"); return unityPhoneTarget; } public static bool CheckTarget(string target) { return string.IsNullOrEmpty(target); } public static string GetUnityPackagePath(string unityPackageName) { var request = Client.List(true); while(request.IsCompleted == false) { System.Threading.Thread.Sleep(100); } var pkgs = request.Result; if (pkgs == null) return ""; foreach (var pkg in pkgs) { if (pkg.name == unityPackageName) { if (pkg.source == PackageSource.Local) return pkg.resolvedPath; else if (pkg.source == PackageSource.Embedded) return pkg.resolvedPath; else { var remotePackagePath = TapFileHelper.FilterFileByPrefix(Application.dataPath + "/Library/PackageCache/", $"{unityPackageName}@"); return remotePackagePath; } } } return ""; } public static bool HandlerIOSSetting(string path, string appDataPath, string resourceName, string modulePackageName, string moduleName, string[] bundleNames, string target, string projPath, PBXProject proj) { var resourcePath = Path.Combine(path, resourceName); var parentFolder = Directory.GetParent(appDataPath).FullName; Debug.Log($"ProjectFolder path:{parentFolder}"); if (Directory.Exists(resourcePath)) { Directory.Delete(resourcePath, true); } Directory.CreateDirectory(resourcePath); var remotePackagePath = GetUnityPackagePath(modulePackageName); var assetLocalPackagePath = TapFileHelper.FilterFileByPrefix(parentFolder + "/Assets/TapTap/", moduleName); var localPackagePath = TapFileHelper.FilterFileByPrefix(parentFolder, moduleName); var tdsResourcePath = ""; if (!string.IsNullOrEmpty(remotePackagePath)) { tdsResourcePath = remotePackagePath; } else if (!string.IsNullOrEmpty(assetLocalPackagePath)) { tdsResourcePath = assetLocalPackagePath; } else if (!string.IsNullOrEmpty(localPackagePath)) { tdsResourcePath = localPackagePath; } if (string.IsNullOrEmpty(tdsResourcePath)) { Debug.LogError("tdsResourcePath is NUll"); return false; } tdsResourcePath = $"{tdsResourcePath}/Plugins/iOS/Resource"; Debug.Log($"Find {moduleName} path:{tdsResourcePath}"); if (!Directory.Exists(tdsResourcePath)) { Debug.LogError($"Can't Find {bundleNames}"); return false; } TapFileHelper.CopyAndReplaceDirectory(tdsResourcePath, resourcePath); foreach (var name in bundleNames) { var relativePath = GetRelativePath(Path.Combine(resourcePath, name), path); var fileGuid = proj.AddFile(relativePath, relativePath, PBXSourceTree.Source); proj.AddFileToBuild(target, fileGuid); } File.WriteAllText(projPath, proj.WriteToString()); return true; } private static string GetRelativePath(string absolutePath, string rootPath) { Uri aboslutePathUri = new Uri(absolutePath); Uri rootPathUri = new Uri(rootPath); var relateivePath = rootPathUri.MakeRelativeUri(aboslutePathUri).ToString(); var index = relateivePath.IndexOf('/'); if (index > 0) { relateivePath = relateivePath.Substring(index + 1); Debug.LogFormat($"[TapCommonCompile] GetRelativePath absolutePath:{absolutePath} rootPath:{rootPath} relateivePath:{relateivePath}"); } else { relateivePath = absolutePath; Debug.LogWarningFormat($"[TapCommonCompile] Can not GetRelativePath!absolutePath:{absolutePath} rootPath:{rootPath}"); } return relateivePath; } public static bool HandlerPlist(string pathToBuildProject, string infoPlistPath, bool macos = false) { // #if UNITY_2020_1_OR_NEWER // var macosXCodePlistPath = // $"{pathToBuildProject}/{PlayerSettings.productName}/Info.plist"; // #elif UNITY_2019_1_OR_NEWER // var macosXCodePlistPath = // $"{Path.GetDirectoryName(pathToBuildProject)}/{PlayerSettings.productName}/Info.plist"; // #endif string plistPath; if (pathToBuildProject.EndsWith(".app")) { plistPath = $"{pathToBuildProject}/Contents/Info.plist"; } else { var macosXCodePlistPath = $"{Path.GetDirectoryName(pathToBuildProject)}/{PlayerSettings.productName}/Info.plist"; if (!File.Exists(macosXCodePlistPath)) { macosXCodePlistPath = $"{pathToBuildProject}/{PlayerSettings.productName}/Info.plist"; } plistPath = !macos ? pathToBuildProject + "/Info.plist" : macosXCodePlistPath; } Debug.Log($"plist path:{plistPath}"); var plist = new PlistDocument(); plist.ReadFromString(File.ReadAllText(plistPath)); var rootDic = plist.root; var items = new List { "tapsdk", "tapiosdk", }; if (!(rootDic["LSApplicationQueriesSchemes"] is PlistElementArray plistElementList)) { plistElementList = rootDic.CreateArray("LSApplicationQueriesSchemes"); } foreach (var t in items) { plistElementList.AddString(t); } if (string.IsNullOrEmpty(infoPlistPath)) return false; var dic = (Dictionary) Plist.readPlist(infoPlistPath); var taptapId = ""; foreach (var item in dic) { if (item.Key.Equals("taptap")) { var taptapDic = (Dictionary) item.Value; foreach (var taptapItem in taptapDic.Where(taptapItem => taptapItem.Key.Equals("client_id"))) { taptapId = (string) taptapItem.Value; } } else { rootDic.SetString(item.Key, item.Value.ToString()); } } //添加url var dict = plist.root.AsDict(); if (!(dict["CFBundleURLTypes"] is PlistElementArray array)) { array = dict.CreateArray("CFBundleURLTypes"); } if (!macos) { var dict2 = array.AddDict(); dict2.SetString("CFBundleURLName", "TapTap"); var array2 = dict2.CreateArray("CFBundleURLSchemes"); array2.AddString($"tt{taptapId}"); } else { var dict2 = array.AddDict(); dict2.SetString("CFBundleURLName", "TapWeb"); var array2 = dict2.CreateArray("CFBundleURLSchemes"); array2.AddString($"open-taptap-{taptapId}"); } Debug.Log("TapSDK change plist Success"); File.WriteAllText(plistPath, plist.WriteToString()); return true; } public static string GetValueFromPlist(string infoPlistPath, string key) { if (infoPlistPath == null) { return null; } var dic = (Dictionary) Plist.readPlist(infoPlistPath); return (from item in dic where item.Key.Equals(key) select (string) item.Value).FirstOrDefault(); } #endif } }