ATPostProcessBuildiOS.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #if UNITY_IOS || UNITY_IPHONE
  2. using AnyThink.Scripts.IntegrationManager.Editor;
  3. #if UNITY_2019_3_OR_NEWER
  4. using UnityEditor.iOS.Xcode.Extensions;
  5. #endif
  6. using UnityEngine.Networking;
  7. using System;
  8. using System.Linq;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using UnityEditor;
  12. using UnityEditor.Callbacks;
  13. using UnityEditor.iOS.Xcode;
  14. using UnityEngine;
  15. namespace AnyThink.Scripts.Editor
  16. {
  17. [Serializable]
  18. public class SkAdNetworkData
  19. {
  20. [SerializeField] public string[] SkAdNetworkIds;
  21. }
  22. public class TopOnPostProcessBuildiOS
  23. {
  24. private static string mBuildPath;
  25. private static readonly List<string> AtsRequiringNetworks = new List<string>
  26. {
  27. "AdColony",
  28. "ByteDance",
  29. "Fyber",
  30. "Google",
  31. "GoogleAdManager",
  32. "HyprMX",
  33. "InMobi",
  34. "IronSource",
  35. "Smaato"
  36. };
  37. private static List<string> DynamicLibraryPathsToEmbed
  38. {
  39. get
  40. {
  41. var dynamicLibraryPathsToEmbed = new List<string>();
  42. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "KSAdSDK/KSAdSDK.xcframework"));
  43. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "StartAppSDK/StartApp.xcframework"));
  44. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "BigoADS/BigoADS/BigoADS.xcframework"));
  45. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "BigoADS/BigoADS/OMSDK_Bigosg.xcframework"));
  46. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "Fyber_Marketplace_SDK/IASDKCore/IASDKCore.xcframework"));
  47. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "InMobiSDK/InMobiSDK.xcframework"));
  48. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "GDTMobSDK/GDTFramework/GDTMobSDK.xcframework"));
  49. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "GDTMobSDK/GDTFramework/Tquic.xcframework"));
  50. //pubnative
  51. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "ATOM-Standalone/ATOM.xcframework"));
  52. string pubNativePath = Path.Combine(mBuildPath, "Pods/HyBid/PubnativeLite/PubnativeLite");
  53. if (Directory.Exists(pubNativePath)) {
  54. // 获取所有以"OMSDK-"开头的子目录
  55. string[] subDirectories = Directory.GetDirectories(pubNativePath, "OMSDK-*");
  56. if (subDirectories.Length > 0) {
  57. string versionDirectory= subDirectories[0];
  58. string versionDirectoryName = Path.GetFileName(versionDirectory);
  59. // ATLog.logError("DynamicLibraryPathsToEmbed() >>> pubNative versionDirectoryName: " + versionDirectoryName);
  60. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "HyBid/PubnativeLite/PubnativeLite/" + versionDirectoryName + "/OMSDK_Pubnativenet.xcframework"));
  61. }
  62. }
  63. //applovin
  64. string applovinPath = Path.Combine(mBuildPath, "Pods/AppLovinSDK");
  65. if (Directory.Exists(applovinPath)) {
  66. // 获取所有以"applovin-ios-sdk-"开头的子目录
  67. string[] applovinSubDirectories = Directory.GetDirectories(applovinPath, "applovin-ios-sdk-*");
  68. if (applovinSubDirectories.Length > 0) {
  69. string applovinVersionDirectory = applovinSubDirectories[0];
  70. string applovinVersionDirectoryName = Path.GetFileName(applovinVersionDirectory);
  71. // ATLog.logError("DynamicLibraryPathsToEmbed() >>> applovinVersionDirectoryName: " + applovinVersionDirectoryName);
  72. dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "AppLovinSDK/" + applovinVersionDirectoryName + "/AppLovinSDK.xcframework"));
  73. }
  74. }
  75. return dynamicLibraryPathsToEmbed;
  76. }
  77. }
  78. //读取本地已安装network的版本号:network_data.json
  79. // private static string getNetworkVersion(string networkDataJsonFilePath)
  80. // {
  81. // if (!File.Exists(networkDataJsonFilePath)) {
  82. // return "";
  83. // }
  84. // string jsonData = File.ReadAllText(networkDataJsonFilePath);
  85. // var networkLocalData = JsonUtility.FromJson<NetworkLocalData>(a_json);
  86. // if (networkLocalData != null) {
  87. // return networkLocalData.version;
  88. // }
  89. // retrun "";
  90. // }
  91. private static List<string> BunldePathsToAdd {
  92. get {
  93. var bunldePathsToAdd = new List<string>();
  94. bunldePathsToAdd.Add(Path.Combine("Pods/", "BigoADS/BigoADS/BigoADSRes.bundle"));
  95. bunldePathsToAdd.Add(Path.Combine("Pods/", "Ads-Global/SDK/PAGAdSDK.bundle"));
  96. bunldePathsToAdd.Add(Path.Combine("Pods/", "Ads-CN/SDK/CSJAdSDK.bundle"));
  97. bunldePathsToAdd.Add(Path.Combine("Pods/", "Ads-CN-Beta/SDK/CSJAdSDK.bundle"));
  98. return bunldePathsToAdd;
  99. }
  100. }
  101. private static readonly List<string> SwiftLanguageNetworks = new List<string>
  102. {
  103. "MoPub"
  104. };
  105. private static readonly List<string> EmbedSwiftStandardLibrariesNetworks = new List<string>
  106. {
  107. "Facebook",
  108. "MoPub"
  109. };
  110. [PostProcessBuildAttribute(int.MaxValue)]
  111. public static void TopOnPostProcessPbxProject(BuildTarget buildTarget, string buildPath)
  112. {
  113. var projectPath = PBXProject.GetPBXProjectPath(buildPath);
  114. var project = new PBXProject();
  115. project.ReadFromFile(projectPath);
  116. #if UNITY_2019_3_OR_NEWER
  117. var unityMainTargetGuid = project.GetUnityMainTargetGuid();
  118. var unityFrameworkTargetGuid = project.GetUnityFrameworkTargetGuid();
  119. #else
  120. var unityMainTargetGuid = project.TargetGuidByName(UnityMainTargetName);
  121. var unityFrameworkTargetGuid = project.TargetGuidByName(UnityMainTargetName);
  122. #endif
  123. project.SetBuildProperty(unityMainTargetGuid, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES");
  124. project.SetBuildProperty(unityMainTargetGuid, "ENABLE_BITCODE", "NO");
  125. project.SetBuildProperty(unityFrameworkTargetGuid, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES");
  126. project.SetBuildProperty(unityFrameworkTargetGuid, "ENABLE_BITCODE", "NO");
  127. EmbedDynamicLibrariesIfNeeded(buildPath, project, unityMainTargetGuid);
  128. AddBunleIfNeeded(buildPath, project, unityMainTargetGuid);
  129. project.WriteToFile(projectPath);
  130. }
  131. [PostProcessBuildAttribute(int.MaxValue)]
  132. public static void TopOnPostProcessPlist(BuildTarget buildTarget, string path)
  133. {
  134. var plistPath = Path.Combine(path, "Info.plist");
  135. var plist = new PlistDocument();
  136. plist.ReadFromFile(plistPath);
  137. #if UNITY_2018_2_OR_NEWER
  138. AddGoogleApplicationIdIfNeeded(plist);
  139. #endif
  140. plist.WriteToFile(plistPath);
  141. }
  142. private static void AddBunleIfNeeded(string buildPath, PBXProject project, string targetGuid)
  143. {
  144. var bunldePathsPresentInProject = BunldePathsToAdd.Where(bunldePath => Directory.Exists(Path.Combine(buildPath, bunldePath))).ToList();
  145. if (bunldePathsPresentInProject.Count <= 0) return;
  146. ATLog.log("AddBunleIfNeeded");
  147. #if UNITY_2019_3_OR_NEWER
  148. foreach (var bunldePath in bunldePathsPresentInProject)
  149. {
  150. var fileGuid = project.AddFile(bunldePath, bunldePath, PBXSourceTree.Source);
  151. project.AddFileToBuild(targetGuid, fileGuid);
  152. }
  153. #endif
  154. }
  155. private static void EmbedDynamicLibrariesIfNeeded(string buildPath, PBXProject project, string targetGuid)
  156. {
  157. mBuildPath = buildPath;
  158. ATLog.log("EmbedDynamicLibrariesIfNeeded() >>> buildPath: " + buildPath);
  159. var dynamicLibraryPathsPresentInProject = DynamicLibraryPathsToEmbed.Where(dynamicLibraryPath => Directory.Exists(Path.Combine(buildPath, dynamicLibraryPath))).ToList();
  160. if (dynamicLibraryPathsPresentInProject.Count <= 0) return;
  161. #if UNITY_2019_3_OR_NEWER
  162. foreach (var dynamicLibraryPath in dynamicLibraryPathsPresentInProject)
  163. {
  164. var fileGuid = project.AddFile(dynamicLibraryPath, dynamicLibraryPath);
  165. project.AddFileToEmbedFrameworks(targetGuid, fileGuid);
  166. }
  167. #else
  168. string runpathSearchPaths;
  169. #if UNITY_2018_2_OR_NEWER
  170. runpathSearchPaths = project.GetBuildPropertyForAnyConfig(targetGuid, "LD_RUNPATH_SEARCH_PATHS");
  171. #else
  172. runpathSearchPaths = "$(inherited)";
  173. #endif
  174. runpathSearchPaths += string.IsNullOrEmpty(runpathSearchPaths) ? "" : " ";
  175. // Check if runtime search paths already contains the required search paths for dynamic libraries.
  176. if (runpathSearchPaths.Contains("@executable_path/Frameworks")) return;
  177. runpathSearchPaths += "@executable_path/Frameworks";
  178. project.SetBuildProperty(targetGuid, "LD_RUNPATH_SEARCH_PATHS", runpathSearchPaths);
  179. #endif
  180. }
  181. #if UNITY_2018_2_OR_NEWER
  182. private static void AddGoogleApplicationIdIfNeeded(PlistDocument plist)
  183. {
  184. if (!ATConfig.isNetworkInstalledByName("Admob", ATConfig.OS_IOS))
  185. {
  186. ATLog.log("addGoogleApplicationIdIfNeeded() >>> Admob not install.");
  187. return;
  188. }
  189. //获取admob app id
  190. var appId = ATConfig.getAdmobAppIdByOs(ATConfig.OS_IOS);
  191. if (string.IsNullOrEmpty(appId) || !appId.StartsWith("ca-app-pub-"))
  192. {
  193. ATLog.logError("AdMob App ID is not set. Please enter a valid app ID within the AnyThink Integration Manager window.");
  194. return;
  195. }
  196. const string googleApplicationIdentifier = "GADApplicationIdentifier";
  197. plist.root.SetString(googleApplicationIdentifier, appId);
  198. }
  199. #endif
  200. }
  201. }
  202. #endif