From c5851880c13368793d7bf506733bfa648ba9f208 Mon Sep 17 00:00:00 2001 From: huyufei Date: Wed, 13 Mar 2024 17:43:29 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E6=B7=BB=E5=8A=A0=E4=B8=AD=E5=8F=B0?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=20iOS=20=E6=9E=84=E5=BB=BA=E7=AE=A1?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...stBuildProcess.meta => GuruBuildSuit.meta} | 2 +- .../AND_POST_PROGUARD.meta | 0 .../AND_POST_PROGUARD/UserProguardHelper.cs | 0 .../UserProguardHelper.cs.meta | 0 Editor/GuruBuildSuit/IOS_POST_AD.meta | 8 + .../IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs | 74 ++ .../IOSPostBuild_SKAdNetwork.cs.meta | 3 + .../IOS_POST_AD/SKADNetwork.plist | 925 ++++++++++++++++++ .../IOS_POST_AD/SKADNetwork.plist.meta | 7 + Editor/GuruBuildSuit/IOS_POST_FIREBASE.meta | 3 + .../IOSPostBuild.Firebase.DebugView.cs | 110 +++ .../IOSPostBuild.Firebase.DebugView.cs.meta | 3 + Editor/GuruBuildSuit/IOS_POST_IPM.meta | 8 + .../IOS_POST_IPM/IOSPostProcessBuild.IPM.cs | 215 ++++ .../IOSPostProcessBuild.IPM.cs.meta | 3 + Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist | 31 + .../IOS_POST_IPM/Info.plist.meta | 7 + .../IOS_POST_IPM/NotificationService.h | 12 + .../IOS_POST_IPM/NotificationService.h.meta | 27 + .../IOS_POST_IPM/NotificationService.m | 122 +++ .../IOS_POST_IPM/NotificationService.m.meta | 27 + Editor/GuruBuildSuit/IOS_POST_POD.meta | 8 + .../IOSPostProcessBuild.PodFix.cs | 71 ++ .../IOSPostProcessBuild.PodFix.cs.meta | 11 + Editor/GuruBuildSuit/IOS_POST_SWIFT.meta | 8 + .../IOS_POST_SWIFT/IOSPostBuild.Swift.cs | 53 + .../IOS_POST_SWIFT/IOSPostBuild.Swift.cs.meta | 3 + Editor/GuruBuildSuit/SDK_Tracker.meta | 3 + .../SDK_Tracker/AndroidGradleOutputDeps.cs | 28 + .../AndroidGradleOutputDeps.cs.meta | 3 + .../SDK_Tracker/DepsOutputHelper.cs | 142 +++ .../SDK_Tracker/DepsOutputHelper.cs.meta | 3 + .../SDK_Tracker/IOSXcodeOutputDeps.cs | 36 + .../SDK_Tracker/IOSXcodeOutputDeps.cs.meta | 3 + Editor/GuruBuildSuit/SDK_Tracker/files.meta | 3 + .../GuruBuildSuit/SDK_Tracker/files/deps.sh | 40 + .../SDK_Tracker/files/deps.sh.meta | 7 + 37 files changed, 2008 insertions(+), 1 deletion(-) rename Editor/{PostBuildProcess.meta => GuruBuildSuit.meta} (77%) rename Editor/{PostBuildProcess => GuruBuildSuit}/AND_POST_PROGUARD.meta (100%) rename Editor/{PostBuildProcess => GuruBuildSuit}/AND_POST_PROGUARD/UserProguardHelper.cs (100%) rename Editor/{PostBuildProcess => GuruBuildSuit}/AND_POST_PROGUARD/UserProguardHelper.cs.meta (100%) create mode 100644 Editor/GuruBuildSuit/IOS_POST_AD.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs create mode 100644 Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist create mode 100644 Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_FIREBASE.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs create mode 100644 Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.m create mode 100644 Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.m.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_POD.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_POD/IOSPostProcessBuild.PodFix.cs create mode 100644 Editor/GuruBuildSuit/IOS_POST_POD/IOSPostProcessBuild.PodFix.cs.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_SWIFT.meta create mode 100644 Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs create mode 100644 Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs.meta create mode 100644 Editor/GuruBuildSuit/SDK_Tracker.meta create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs.meta create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs.meta create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs.meta create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/files.meta create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh create mode 100644 Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh.meta diff --git a/Editor/PostBuildProcess.meta b/Editor/GuruBuildSuit.meta similarity index 77% rename from Editor/PostBuildProcess.meta rename to Editor/GuruBuildSuit.meta index c8d6987..9b5b566 100644 --- a/Editor/PostBuildProcess.meta +++ b/Editor/GuruBuildSuit.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c2bda7db652148e7a73fd2179e22be09 +guid: 70312596ce564426aa363479bc5fd1f9 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Editor/PostBuildProcess/AND_POST_PROGUARD.meta b/Editor/GuruBuildSuit/AND_POST_PROGUARD.meta similarity index 100% rename from Editor/PostBuildProcess/AND_POST_PROGUARD.meta rename to Editor/GuruBuildSuit/AND_POST_PROGUARD.meta diff --git a/Editor/PostBuildProcess/AND_POST_PROGUARD/UserProguardHelper.cs b/Editor/GuruBuildSuit/AND_POST_PROGUARD/UserProguardHelper.cs similarity index 100% rename from Editor/PostBuildProcess/AND_POST_PROGUARD/UserProguardHelper.cs rename to Editor/GuruBuildSuit/AND_POST_PROGUARD/UserProguardHelper.cs diff --git a/Editor/PostBuildProcess/AND_POST_PROGUARD/UserProguardHelper.cs.meta b/Editor/GuruBuildSuit/AND_POST_PROGUARD/UserProguardHelper.cs.meta similarity index 100% rename from Editor/PostBuildProcess/AND_POST_PROGUARD/UserProguardHelper.cs.meta rename to Editor/GuruBuildSuit/AND_POST_PROGUARD/UserProguardHelper.cs.meta diff --git a/Editor/GuruBuildSuit/IOS_POST_AD.meta b/Editor/GuruBuildSuit/IOS_POST_AD.meta new file mode 100644 index 0000000..5f34755 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_AD.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b460e9873d8bf445da1764952f4f966c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs b/Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs new file mode 100644 index 0000000..d27c34f --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs @@ -0,0 +1,74 @@ +#if UNITY_IOS +namespace Guru.Editor +{ + using System.Collections.Generic; + using System.IO; + using UnityEditor; + using UnityEditor.Callbacks; + using UnityEditor.iOS.Xcode; + using UnityEngine; + + /// + /// SKAdNetwork 注入逻辑 + /// + public static class IOSPostBuild_SKAdNetwork + { + private static List NETWORK_IDENTIFIER_ARRAY = new List(); + public static readonly string SKADNetworkIdentifier = "SKAdNetworkIdentifier"; + + private static readonly char DIR_CHAR = Path.DirectorySeparatorChar; + public static readonly string OS_PLATFORM_LOCATION = $"Assets/Guru/GuruBuildTool/Editor/IOS_POST_AD/"; + + [PostProcessBuild(10)] + private static void OnPostProcessBuild(BuildTarget buildTarget, string path) + { + if (buildTarget != BuildTarget.iOS) + { + return; + } + + var plistPath = Path.Combine(path, "Info.plist"); + var plist = new PlistDocument(); + plist.ReadFromFile(plistPath); + + //设置SKAdNetworkItems + ReadSKADNetworkPlistFile(); + var plistElementArray = plist.root.CreateArray("SKAdNetworkItems"); + AddPlatformADNetworkIdentifier(plistElementArray, NETWORK_IDENTIFIER_ARRAY); + plist.WriteToFile(plistPath); + } + + public static void ReadSKADNetworkPlistFile() + { + string plistPath = $"{Application.dataPath}/../{OS_PLATFORM_LOCATION}/SKADNetwork.plist"; + var plist = new PlistDocument(); + plist.ReadFromFile(plistPath); + var skADNetworksArr = plist.root["SKAdNetworkItems"].AsArray(); + if (skADNetworksArr != null) + { + foreach (var plistElement in skADNetworksArr.values) + { + var adNetworkValue = plistElement.AsDict()[SKADNetworkIdentifier].AsString(); + if(!NETWORK_IDENTIFIER_ARRAY.Contains(adNetworkValue)) + NETWORK_IDENTIFIER_ARRAY.Add(adNetworkValue); + } + } + } + + private static void AddPlatformADNetworkIdentifier(PlistElementArray plistElementArray, List arrays) + { + foreach (var value in arrays) + { + PlistArrayAddDict(plistElementArray, value); + } + } + + private static void PlistArrayAddDict(PlistElementArray plistElementArray, string value) + { + plistElementArray.AddDict().SetString(SKADNetworkIdentifier, value); + } + } +} + + +#endif \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs.meta b/Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs.meta new file mode 100644 index 0000000..5860789 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_AD/IOSPostBuild_SKAdNetwork.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: be1ddc59e4ac2416f8174a5611f0c98a +timeCreated: 1632375624 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist b/Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist new file mode 100644 index 0000000..50309fe --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist @@ -0,0 +1,925 @@ + + + + + SKAdNetworkItems + + + SKAdNetworkIdentifier + cstr6suwn9.skadnetwork + + + SKAdNetworkIdentifier + 4fzdc2evr5.skadnetwork + + + SKAdNetworkIdentifier + 4pfyvq9l8r.skadnetwork + + + SKAdNetworkIdentifier + 2fnua5tdw4.skadnetwork + + + SKAdNetworkIdentifier + ydx93a7ass.skadnetwork + + + SKAdNetworkIdentifier + 5a6flpkh64.skadnetwork + + + SKAdNetworkIdentifier + p78axxw29g.skadnetwork + + + SKAdNetworkIdentifier + v72qych5uu.skadnetwork + + + SKAdNetworkIdentifier + ludvb6z3bs.skadnetwork + + + SKAdNetworkIdentifier + cp8zw746q7.skadnetwork + + + SKAdNetworkIdentifier + 3sh42y64q3.skadnetwork + + + SKAdNetworkIdentifier + c6k4g5qg8m.skadnetwork + + + SKAdNetworkIdentifier + s39g8k73mm.skadnetwork + + + SKAdNetworkIdentifier + 3qy4746246.skadnetwork + + + SKAdNetworkIdentifier + f38h382jlk.skadnetwork + + + SKAdNetworkIdentifier + hs6bdukanm.skadnetwork + + + SKAdNetworkIdentifier + v4nxqhlyqp.skadnetwork + + + SKAdNetworkIdentifier + wzmmz9fp6w.skadnetwork + + + SKAdNetworkIdentifier + yclnxrl5pm.skadnetwork + + + SKAdNetworkIdentifier + t38b2kh725.skadnetwork + + + SKAdNetworkIdentifier + 7ug5zh24hu.skadnetwork + + + SKAdNetworkIdentifier + gta9lk7p23.skadnetwork + + + SKAdNetworkIdentifier + vutu7akeur.skadnetwork + + + SKAdNetworkIdentifier + y5ghdn5j9k.skadnetwork + + + SKAdNetworkIdentifier + n6fk4nfna4.skadnetwork + + + SKAdNetworkIdentifier + v9wttpbfk9.skadnetwork + + + SKAdNetworkIdentifier + n38lu8286q.skadnetwork + + + SKAdNetworkIdentifier + 47vhws6wlr.skadnetwork + + + SKAdNetworkIdentifier + kbd757ywx3.skadnetwork + + + SKAdNetworkIdentifier + 9t245vhmpl.skadnetwork + + + SKAdNetworkIdentifier + eh6m2bh4zr.skadnetwork + + + SKAdNetworkIdentifier + a2p9lx4jpn.skadnetwork + + + SKAdNetworkIdentifier + 22mmun2rn5.skadnetwork + + + SKAdNetworkIdentifier + 4468km3ulz.skadnetwork + + + SKAdNetworkIdentifier + 2u9pt9hc89.skadnetwork + + + SKAdNetworkIdentifier + 8s468mfl3y.skadnetwork + + + SKAdNetworkIdentifier + klf5c3l5u5.skadnetwork + + + SKAdNetworkIdentifier + ppxm28t8ap.skadnetwork + + + SKAdNetworkIdentifier + ecpz2srf59.skadnetwork + + + SKAdNetworkIdentifier + uw77j35x4d.skadnetwork + + + SKAdNetworkIdentifier + pwa73g5rt2.skadnetwork + + + SKAdNetworkIdentifier + mlmmfzh3r3.skadnetwork + + + SKAdNetworkIdentifier + 578prtvx9j.skadnetwork + + + SKAdNetworkIdentifier + 4dzt52r2t5.skadnetwork + + + SKAdNetworkIdentifier + e5fvkxwrpn.skadnetwork + + + SKAdNetworkIdentifier + 8c4e2ghe7u.skadnetwork + + + SKAdNetworkIdentifier + zq492l623r.skadnetwork + + + SKAdNetworkIdentifier + 3rd42ekr43.skadnetwork + + + SKAdNetworkIdentifier + 3qcr597p9d.skadnetwork + + + SKAdNetworkIdentifier + 238da6jt44.skadnetwork + + + SKAdNetworkIdentifier + 24t9a8vw3c.skadnetwork + + + SKAdNetworkIdentifier + 24zw6aqk47.skadnetwork + + + SKAdNetworkIdentifier + 252b5q8x7y.skadnetwork + + + SKAdNetworkIdentifier + 275upjj5gd.skadnetwork + + + SKAdNetworkIdentifier + 294l99pt4k.skadnetwork + + + SKAdNetworkIdentifier + 32z4fx6l9h.skadnetwork + + + SKAdNetworkIdentifier + 3l6bd9hu43.skadnetwork + + + SKAdNetworkIdentifier + 424m5254lk.skadnetwork + + + SKAdNetworkIdentifier + 44jx6755aq.skadnetwork + + + SKAdNetworkIdentifier + 44n7hlldy6.skadnetwork + + + SKAdNetworkIdentifier + 488r3q3dtq.skadnetwork + + + SKAdNetworkIdentifier + 4mn522wn87.skadnetwork + + + SKAdNetworkIdentifier + 4w7y6s5ca2.skadnetwork + + + SKAdNetworkIdentifier + 523jb4fst2.skadnetwork + + + SKAdNetworkIdentifier + 52fl2v3hgk.skadnetwork + + + SKAdNetworkIdentifier + 54nzkqm89y.skadnetwork + + + SKAdNetworkIdentifier + 5l3tpt7t6e.skadnetwork + + + SKAdNetworkIdentifier + 5lm9lj6jb7.skadnetwork + + + SKAdNetworkIdentifier + 5tjdwbrq8w.skadnetwork + + + SKAdNetworkIdentifier + 6964rsfnh4.skadnetwork + + + SKAdNetworkIdentifier + 6g9af3uyq4.skadnetwork + + + SKAdNetworkIdentifier + 6p4ks3rnbw.skadnetwork + + + SKAdNetworkIdentifier + 6v7lgmsu45.skadnetwork + + + SKAdNetworkIdentifier + 6xzpu9s2p8.skadnetwork + + + SKAdNetworkIdentifier + 737z793b9f.skadnetwork + + + SKAdNetworkIdentifier + 74b6s63p6l.skadnetwork + + + SKAdNetworkIdentifier + 79pbpufp6p.skadnetwork + + + SKAdNetworkIdentifier + 7fmhfwg9en.skadnetwork + + + SKAdNetworkIdentifier + 7rz58n8ntl.skadnetwork + + + SKAdNetworkIdentifier + 84993kbrcf.skadnetwork + + + SKAdNetworkIdentifier + 89z7zv988g.skadnetwork + + + SKAdNetworkIdentifier + 8m87ys6875.skadnetwork + + + SKAdNetworkIdentifier + 8r8llnkz5a.skadnetwork + + + SKAdNetworkIdentifier + 97r2b46745.skadnetwork + + + SKAdNetworkIdentifier + 9b89h5y424.skadnetwork + + + SKAdNetworkIdentifier + 9nlqeag3gk.skadnetwork + + + SKAdNetworkIdentifier + 9rd848q2bz.skadnetwork + + + SKAdNetworkIdentifier + 9vvzujtq5s.skadnetwork + + + SKAdNetworkIdentifier + 9yg77x724h.skadnetwork + + + SKAdNetworkIdentifier + a7xqa6mtl2.skadnetwork + + + SKAdNetworkIdentifier + a8cz6cu7e5.skadnetwork + + + SKAdNetworkIdentifier + av6w8kgt66.skadnetwork + + + SKAdNetworkIdentifier + b9bk5wbcq9.skadnetwork + + + SKAdNetworkIdentifier + bxvub5ada5.skadnetwork + + + SKAdNetworkIdentifier + c3frkrj4fj.skadnetwork + + + SKAdNetworkIdentifier + cg4yq2srnc.skadnetwork + + + SKAdNetworkIdentifier + cj5566h2ga.skadnetwork + + + SKAdNetworkIdentifier + cs644xg564.skadnetwork + + + SKAdNetworkIdentifier + dbu4b84rxf.skadnetwork + + + SKAdNetworkIdentifier + dkc879ngq3.skadnetwork + + + SKAdNetworkIdentifier + dzg6xy7pwj.skadnetwork + + + SKAdNetworkIdentifier + ejvt5qm6ak.skadnetwork + + + SKAdNetworkIdentifier + f73kdq92p3.skadnetwork + + + SKAdNetworkIdentifier + f7s53z58qe.skadnetwork + + + SKAdNetworkIdentifier + feyaarzu9v.skadnetwork + + + SKAdNetworkIdentifier + g28c52eehv.skadnetwork + + + SKAdNetworkIdentifier + g2y4y55b64.skadnetwork + + + SKAdNetworkIdentifier + ggvn48r87g.skadnetwork + + + SKAdNetworkIdentifier + glqzh8vgby.skadnetwork + + + SKAdNetworkIdentifier + gta8lk7p23.skadnetwork + + + SKAdNetworkIdentifier + hb56zgv37p.skadnetwork + + + SKAdNetworkIdentifier + hdw39hrw9y.skadnetwork + + + SKAdNetworkIdentifier + k674qkevps.skadnetwork + + + SKAdNetworkIdentifier + kbmxgpxpgc.skadnetwork + + + SKAdNetworkIdentifier + krvm3zuq6h.skadnetwork + + + SKAdNetworkIdentifier + lr83yxwka7.skadnetwork + + + SKAdNetworkIdentifier + m297p6643m.skadnetwork + + + SKAdNetworkIdentifier + m5mvw97r93.skadnetwork + + + SKAdNetworkIdentifier + m8dbw4sv7c.skadnetwork + + + SKAdNetworkIdentifier + mls7yz5dvl.skadnetwork + + + SKAdNetworkIdentifier + mp6xlyr22a.skadnetwork + + + SKAdNetworkIdentifier + mtkv5xtk9e.skadnetwork + + + SKAdNetworkIdentifier + n66cz3y3bx.skadnetwork + + + SKAdNetworkIdentifier + n9x2a789qt.skadnetwork + + + SKAdNetworkIdentifier + nzq8sh4pbs.skadnetwork + + + SKAdNetworkIdentifier + prcb7njmu6.skadnetwork + + + SKAdNetworkIdentifier + pwdxu55a5a.skadnetwork + + + SKAdNetworkIdentifier + qqp299437r.skadnetwork + + + SKAdNetworkIdentifier + r45fhb6rf7.skadnetwork + + + SKAdNetworkIdentifier + rvh3l7un93.skadnetwork + + + SKAdNetworkIdentifier + rx5hdcabgc.skadnetwork + + + SKAdNetworkIdentifier + s69wq72ugq.skadnetwork + + + SKAdNetworkIdentifier + su67r6k2v3.skadnetwork + + + SKAdNetworkIdentifier + tl55sbb4fm.skadnetwork + + + SKAdNetworkIdentifier + u679fj5vs4.skadnetwork + + + SKAdNetworkIdentifier + v79kvwwj4g.skadnetwork + + + SKAdNetworkIdentifier + vcra2ehyfk.skadnetwork + + + SKAdNetworkIdentifier + w9q455wk68.skadnetwork + + + SKAdNetworkIdentifier + wg4vff78zm.skadnetwork + + + SKAdNetworkIdentifier + x44k69ngh6.skadnetwork + + + SKAdNetworkIdentifier + x5l83yy675.skadnetwork + + + SKAdNetworkIdentifier + x8jxxk4ff5.skadnetwork + + + SKAdNetworkIdentifier + x8uqf25wch.skadnetwork + + + SKAdNetworkIdentifier + xy9t38ct57.skadnetwork + + + SKAdNetworkIdentifier + y45688jllp.skadnetwork + + + SKAdNetworkIdentifier + zmvfpc5aq8.skadnetwork + + + SKAdNetworkIdentifier + t6d3zquu66.skadnetwork + + + SKAdNetworkIdentifier + 9g2aggbj52.skadnetwork + + + SKAdNetworkIdentifier + h65wbv5k3f.skadnetwork + + + SKAdNetworkIdentifier + gvn48r87g.skadnetwork + + + SKAdNetworkIdentifier + bvpn9ufa9b.skadnetwork + + + SKAdNetworkIdentifier + hjevpa356n.skadnetwork + + + SKAdNetworkIdentifier + 6yxyv74ff7.skadnetwork + + + SKAdNetworkIdentifier + mqn7fxpca7.skadnetwork + + + SKAdNetworkIdentifier + 7953jerfzd.skadnetwork + + + SKAdNetworkIdentifier + qu637u8glc.skadnetwork + + + SKAdNetworkIdentifier + g6gcrrvk4p.skadnetwork + + + SKAdNetworkIdentifier + nu4557a4je.skadnetwork + + + SKAdNetworkIdentifier + cj5566h2ga.skadnetwork + + + SKAdNetworkIdentifier + gvmwg8q7h5.skadnetwork + + + SKAdNetworkIdentifier + pu4na253f3.skadnetwork + + + SKAdNetworkIdentifier + yrqqpx2mcb.skadnetwork + + + SKAdNetworkIdentifier + z4gj7hsk7h.skadnetwork + + + SKAdNetworkIdentifier + z959bm4gru.skadnetwork + + + SKAdNetworkIdentifier + bd757ywx3.skadnetwork + + + SKAdNetworkIdentifier + 33r6p7g8nc.skadnetwork + + + SKAdNetworkIdentifier + g69uk9uh2b.skadnetwork + + + SKAdNetworkIdentifier + 633vhxswh4.skadnetwork + + + SKAdNetworkIdentifier + tmhh9296z4.skadnetwork + + + SKAdNetworkIdentifier + zh3b7bxvad.skadnetwork + + + SKAdNetworkIdentifier + xmn954pzmp.skadnetwork + + + SKAdNetworkIdentifier + 79w64w269u.skadnetwork + + + SKAdNetworkIdentifier + d7g9azk84q.skadnetwork + + + SKAdNetworkIdentifier + 866k9ut3g3.skadnetwork + + + SKAdNetworkIdentifier + 2q884k2j68.skadnetwork + + + SKAdNetworkIdentifier + gfat3222tu.skadnetwork + + + SKAdNetworkIdentifier + pd25vrrwzn.skadnetwork + + + SKAdNetworkIdentifier + y755zyxw56.skadnetwork + + + SKAdNetworkIdentifier + qlbq5gtkt8.skadnetwork + + + SKAdNetworkIdentifier + 67369282zy.skadnetwork + + + SKAdNetworkIdentifier + 899vrgt9g8.skadnetwork + + + SKAdNetworkIdentifier + mj797d8u6f.skadnetwork + + + SKAdNetworkIdentifier + 88k8774x49.skadnetwork + + + SKAdNetworkIdentifier + t3b3f7n3x8.skadnetwork + + + SKAdNetworkIdentifier + c7g47wypnu.skadnetwork + + + SKAdNetworkIdentifier + z5b3gh5ugf.skadnetwork + + + SKAdNetworkIdentifier + dd3a75yxkv.skadnetwork + + + SKAdNetworkIdentifier + h5jmj969g5.skadnetwork + + + SKAdNetworkIdentifier + dr774724x4.skadnetwork + + + SKAdNetworkIdentifier + t7ky8fmwkd.skadnetwork + + + SKAdNetworkIdentifier + fz2k2k5tej.skadnetwork + + + SKAdNetworkIdentifier + w28pnjg2k4.skadnetwork + + + SKAdNetworkIdentifier + 2rq3zucswp.skadnetwork + + + SKAdNetworkIdentifier + vc83br9sjg.skadnetwork + + + SKAdNetworkIdentifier + eqhxz8m8av.skadnetwork + + + SKAdNetworkIdentifier + 7k3cvf297u.skadnetwork + + + SKAdNetworkIdentifier + 7tnzynbdc7.skadnetwork + + + SKAdNetworkIdentifier + l6nv3x923s.skadnetwork + + + SKAdNetworkIdentifier + h8vml93bkz.skadnetwork + + + SKAdNetworkIdentifier + uzqba5354d.skadnetwork + + + SKAdNetworkIdentifier + 8qiegk9qfv.skadnetwork + + + SKAdNetworkIdentifier + xx9sdjej2w.skadnetwork + + + SKAdNetworkIdentifier + au67k4efj4.skadnetwork + + + SKAdNetworkIdentifier + dmv22haz9p.skadnetwork + + + SKAdNetworkIdentifier + 7fbxrn65az.skadnetwork + + + SKAdNetworkIdentifier + b55w3d8y8z.skadnetwork + + + SKAdNetworkIdentifier + v7896pgt74.skadnetwork + + + SKAdNetworkIdentifier + 5ghnmfs3dh.skadnetwork + + + SKAdNetworkIdentifier + 627r9wr2y5.skadnetwork + + + SKAdNetworkIdentifier + sczv5946wb.skadnetwork + + + SKAdNetworkIdentifier + 8w3np9l82g.skadnetwork + + + SKAdNetworkIdentifier + nrt9jy4kw9.skadnetwork + + + SKAdNetworkIdentifier + dn942472g5.skadnetwork + + + SKAdNetworkIdentifier + cad8qz2s3j.skadnetwork + + + SKAdNetworkIdentifier + r26jy69rpl.skadnetwork + + + SKAdNetworkIdentifier + jb7bn6koa5.skadnetwork + + + SKAdNetworkIdentifier + fkak3gfpt6.skadnetwork + + + SKAdNetworkIdentifier + 2tdux39lx8.skadnetwork + + + SKAdNetworkIdentifier + 3cgn6rq224.skadnetwork + + + SKAdNetworkIdentifier + nfqy3847ph.skadnetwork + + + SKAdNetworkIdentifier + dticjx1a9i.skadnetwork + + + SKAdNetworkIdentifier + 9wsyqb3ku7.skadnetwork + + + SKAdNetworkIdentifier + x5854y7y24.skadnetwork + + + SKAdNetworkIdentifier + 6qx585k4p6.skadnetwork + + + SKAdNetworkIdentifier + l93v5h6a4m.skadnetwork + + + SKAdNetworkIdentifier + axh5283zss.skadnetwork + + + SKAdNetworkIdentifier + 5mv394q32t.skadnetwork + + + SKAdNetworkIdentifier + ln5gz23vtd.skadnetwork + + + SKAdNetworkIdentifier + x2jnk7ly8j.skadnetwork + + + + \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist.meta b/Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist.meta new file mode 100644 index 0000000..71f52a2 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_AD/SKADNetwork.plist.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e15412105e424ee0934897a153640a34 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/GuruBuildSuit/IOS_POST_FIREBASE.meta b/Editor/GuruBuildSuit/IOS_POST_FIREBASE.meta new file mode 100644 index 0000000..110f497 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_FIREBASE.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 815571d7e09647a8b91951918d0feb7e +timeCreated: 1699597324 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs b/Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs new file mode 100644 index 0000000..85ed4ab --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs @@ -0,0 +1,110 @@ +#if UNITY_IOS + +namespace Guru.Editor +{ + using System.Collections.Generic; + using UnityEditor; + using UnityEditor.Callbacks; + using UnityEditor.iOS.Xcode; + using UnityEngine; + using System.IO; + using Enumerable = System.Linq.Enumerable; + + /// + /// Fireabse DebugView 开启参数注入 + /// + public class IOSPostBuild_FireabseDebugView + { + public static readonly string Tag = "[POST]"; + private static readonly string CodeFixMark = "CODE_FIX_BY_GURU"; + private static readonly string CodeCmdArgsFix = $"\t\t//--------- {CodeFixMark} --------------\n\t\tNSMutableArray *newArguments = [NSMutableArray arrayWithArray:[[NSProcessInfo processInfo] arguments]];\n\t\t[newArguments addObject:@\"-FIRAnalyticsDebugEnabled\"];\n\t\t[newArguments addObject:@\"-FIRDebugEnabled\"];\n\t\t[[NSProcessInfo processInfo] setValue:[newArguments copy] forKey:@\"arguments\"];"; + private static readonly string CodeDidFinishedLaunch = + "(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:"; + + /// + /// 需要在外部接口调用参数注入 + /// + public static bool EnableDebugView = false; // 默认为False, 需要外部注入 + + [PostProcessBuild(1)] + public static void PostBuildXcodeArgs(BuildTarget target, string buildPath) + { + Debug.Log($"{Tag} --- Add Firebase debug args: {EnableDebugView}"); + + if (target != BuildTarget.iOS) return; + if (!EnableDebugView) return; + + AddLauncherArgsToSchema(buildPath); + InjectLaunchCode(buildPath); + } + + /// + /// 添加启动参数到Scheme + /// + /// + private static void AddLauncherArgsToSchema(string buildPath) + { + string schemePath = buildPath + "/Unity-iPhone.xcodeproj/xcshareddata/xcschemes/Unity-iPhone.xcscheme"; + + var xcscheme = new XcScheme(); + xcscheme.ReadFromFile(schemePath); + + xcscheme.SetMetalValidationOnRun(XcScheme.MetalValidation.Extended); + xcscheme.SetFrameCaptureModeOnRun(XcScheme.FrameCaptureMode.Metal); + xcscheme.AddArgumentPassedOnLaunch("-FIRDebugEnabled"); + + xcscheme.WriteToFile(schemePath); + } + + /// + /// 注入命令行参数 + /// + /// + private static void InjectLaunchCode(string buildPath) + { + string path = $"{buildPath}/Classes/UnityAppController.mm"; + + if (File.Exists(path)) + { + List lines = Enumerable.ToList(File.ReadAllLines(path)); + string line = ""; + int idx = -1; + for (int i = 0; i < lines.Count; i++) + { + line = lines[i]; + if (line.Contains(CodeDidFinishedLaunch)) + { + // 找到注入行 + idx = i + 1; + if (lines[idx].Contains("{")) + { + idx++; + } + if (lines[idx].Contains(@"::printf(""-> applicationDidFinishLaunching()\n"");")) + { + idx++; + } + + if (lines[idx].Contains(CodeFixMark) || lines[idx+1].Contains(CodeFixMark)) + { + Debug.Log($"{Tag} ---- code has already injected, skip... "); + return; + } + + break; + } + } + lines.Insert(idx, CodeCmdArgsFix); + File.WriteAllLines(path, lines.ToArray()); + Debug.Log($"{Tag} ---- code has success injected. path:\n{path}"); + } + else + { + Debug.Log($"{Tag} ---- file not found: {path}, inject failed... "); + } + } + + } +} + +#endif \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs.meta b/Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs.meta new file mode 100644 index 0000000..6937a94 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_FIREBASE/IOSPostBuild.Firebase.DebugView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7f98aa3ce0d04b2d9f8442a0b288f27e +timeCreated: 1699597308 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM.meta b/Editor/GuruBuildSuit/IOS_POST_IPM.meta new file mode 100644 index 0000000..03754e6 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf616a5ad654b418281c06863ad401eb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs b/Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs new file mode 100644 index 0000000..4b82ac2 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs @@ -0,0 +1,215 @@ +#if UNITY_IOS + +namespace Guru.Editor +{ + using System.Collections.Generic; + using System.IO; + using UnityEditor; + using UnityEditor.Callbacks; + using UnityEditor.iOS.Xcode; + using UnityEditor.iOS.Xcode.Extensions; + using UnityEngine; + + public static class IOSPostProcessBuildIPM + { + public static readonly string DEFAULT_PROJECT_TARGET_NAME = "Unity-iPhone"; + public static readonly string NOTIFICATION_SERVICE_EXTENSION_TARGET_NAME = "U3D2FCM-iOS"; + public static readonly string NOTIFICATION_SERVICE_EXTENSION_OBJECTIVEC_FILENAME = "NotificationService"; + + private static readonly char DIR_CHAR = Path.DirectorySeparatorChar; + public static readonly string OS_PLATFORM_LOCATION = $"Assets/Guru/GuruBuildTool/Editor/IOS_POST_IPM/"; + private static readonly string SKADNetworkIdentifier = "SKAdNetworkIdentifier"; + private static List NETWORK_IDENTIFIER_ARRAY = new List(); + + private enum EntitlementOptions { + AppGroups, + } + + private static readonly string[] FRAMEWORKS_MAIN_TO_ADD = { + }; + + private static readonly string[] FRAMEWORKS_UNITY_FRAMEWORK_TO_ADD = { + "GameKit.framework", + }; + + private static readonly string[] FRAMEWORKS_FCM_TO_ADD = { + "UserNotifications.framework", + "UIKit.framework", + }; + + [PostProcessBuild(1)] + private static void OnPostProcessBuild(BuildTarget buildTarget, string path) + { + if (buildTarget != BuildTarget.iOS) + { + return; + } + + var projectPath = PBXProject.GetPBXProjectPath(path); + var project = new PBXProject(); + project.ReadFromString(File.ReadAllText(projectPath)); + + var mainTargetName = GetPBXProjectTargetName(project); + var mainTargetGUID = GetPBXProjectTargetGUID(project); + var unityFrameworkGUID = GetPBXProjectUnityFrameworkGUID(project); + + foreach(var framework in FRAMEWORKS_MAIN_TO_ADD) { + project.AddFrameworkToProject(mainTargetGUID, framework, false); + } + + foreach(var framework in FRAMEWORKS_UNITY_FRAMEWORK_TO_ADD) { + project.AddFrameworkToProject(unityFrameworkGUID, framework, false); + } + + ModifyPlistFile(path); + + // 关闭Bitode + project.SetBuildProperty(mainTargetGUID, "ENABLE_BITCODE", "NO"); + project.SetBuildProperty(unityFrameworkGUID, "ENABLE_BITCODE", "NO"); + + // 添加 UnityFramework 版本号 + project.SetBuildProperty(unityFrameworkGUID, "CURRENT_PROJECT_VERSION", PlayerSettings.bundleVersion); + project.SetBuildProperty(unityFrameworkGUID, "MARKETING_VERSION", PlayerSettings.iOS.buildNumber); + + AddOrUpdateEntitlements(path, project, mainTargetGUID, mainTargetName, + new HashSet + { + EntitlementOptions.AppGroups + }); + + // AddNotificationServiceExtension(project ,path); // <--- 无需添加Extension了 + + project.WriteToFile(projectPath); + var contents = File.ReadAllText(projectPath); + project.ReadFromString(contents); + + // Add push notifications as a capability on the main app target + AddPushCapability(project, path, mainTargetGUID, mainTargetName); + + project.SetBuildProperty(unityFrameworkGUID, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES"); + project.SetBuildProperty(mainTargetGUID, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES"); + File.WriteAllText(projectPath, project.WriteToString()); + } + + private static void ModifyPlistFile(string pathToBuildProject) + { + var plistPath = Path.Combine(pathToBuildProject, "Info.plist"); + var plist = new PlistDocument(); + plist.ReadFromFile(plistPath); + //设置Google AD GADApplicationIdentifier + plist.root.SetString("NSCalendarsUsageDescription", "Store calendar events from ads"); + // plist.root.SetString("GADApplicationIdentifier", "ca-app-pub-2436733915645843~7788635385"); + // plist.root.SetString("FacebookClientToken", "2414c9079473645856a5ef6b8ac95cf6"); + // plist.root.SetString("FacebookDisplayName", PlayerSettings.productName); + //设置Xcode的Att弹窗配置 + plist.root.SetString("NSUserTrackingUsageDescription","By allowing tracking, we'll be able to better tailor ads served to you on this game."); + //设置SKAdNetworkItems + // ReadSKADNetworkPlistFile(); + // var plistElementArray = plist.root.CreateArray("SKAdNetworkItems"); + // AddPlatformADNetworkIdentifier(plistElementArray, NETWORK_IDENTIFIER_ARRAY); + + // 设置合规出口证明 + plist.root.SetBoolean("ITSAppUsesNonExemptEncryption", false); + + var root = plist.root.values; + PlistElement atsRoot; + root.TryGetValue("NSAppTransportSecurity", out atsRoot); + + if (atsRoot == null || atsRoot.GetType() != typeof(PlistElementDict)) + { + atsRoot = plist.root.CreateDict("NSAppTransportSecurity"); + atsRoot.AsDict().SetBoolean("NSAllowsArbitraryLoads", true); + } + + var atsRootDict = atsRoot.AsDict().values; + if (atsRootDict.ContainsKey("NSAllowsArbitraryLoadsInWebContent")) + { + atsRootDict.Remove("NSAllowsArbitraryLoadsInWebContent"); + } + + plist.WriteToFile(plistPath); + } + + #region 纯功能函数 + + private static void AddOrUpdateEntitlements(string path, PBXProject project, string targetGUI, + string targetName, HashSet options) + { + string entitlementPath = GetEntitlementsPath(path, project, targetGUI, targetName); + var entitlements = new PlistDocument(); + + // Check if the file already exisits and read it + if (File.Exists(entitlementPath)) { + entitlements.ReadFromFile(entitlementPath); + } + + // TOOD: This can be updated to use project.AddCapability() in the future + if (options.Contains(EntitlementOptions.AppGroups) && entitlements.root["com.apple.security.application-groups"] == null) { + var groups = entitlements.root.CreateArray("com.apple.security.application-groups"); + groups.AddString("group." + PlayerSettings.applicationIdentifier); + } + + entitlements.WriteToFile(entitlementPath); + + // Copy the entitlement file to the xcode project + var entitlementFileName = Path.GetFileName(entitlementPath); + var relativeDestination = targetName + "/" + entitlementFileName; + + // Add the pbx configs to include the entitlements files on the project + project.AddFile(relativeDestination, entitlementFileName); + project.AddBuildProperty(targetGUI, "CODE_SIGN_ENTITLEMENTS", relativeDestination); + } + + private static void AddPushCapability(PBXProject project, string path, string targetGUID, string targetName) + { + var projectPath = PBXProject.GetPBXProjectPath(path); + //project.AddCapability(targetGUID, PBXCapabilityType.PushNotifications); + //project.AddCapability(targetGUID, PBXCapabilityType.BackgroundModes); + + var entitlementsPath = GetEntitlementsPath(path, project, targetGUID, targetName); + // NOTE: ProjectCapabilityManager's 4th constructor param requires Unity 2019.3+ + var projCapability = new ProjectCapabilityManager(projectPath, entitlementsPath, targetName); + //projCapability.AddBackgroundModes(BackgroundModesOptions.BackgroundFetch); + //projCapability.AddBackgroundModes(BackgroundModesOptions.RemoteNotifications); + projCapability.AddPushNotifications(false); + projCapability.WriteToFile(); + } + + + private static string GetPBXProjectTargetName(PBXProject project) + { + // var projectUUID = project.GetUnityMainTargetGuid(); + // return project.GetBuildPhaseName(projectUUID); + // The above always returns null, using a static value for now. + return DEFAULT_PROJECT_TARGET_NAME; + } + + private static string GetPBXProjectTargetGUID(PBXProject project) + { + return project.GetUnityMainTargetGuid(); + } + + private static string GetPBXProjectUnityFrameworkGUID(PBXProject project) + { + return project.GetUnityFrameworkTargetGuid(); + } + + private static string GetEntitlementsPath(string path, PBXProject project, string targetGUI, string targetName) + { + // Check if there is already an eltitlements file configured in the Xcode project + var relativeEntitlementPath = project.GetBuildPropertyForConfig(targetGUI, "CODE_SIGN_ENTITLEMENTS"); + if (relativeEntitlementPath != null) { + var entitlementPath = path + DIR_CHAR + relativeEntitlementPath; + if (File.Exists(entitlementPath)) { + return entitlementPath; + } + } + + // No existing file, use a new name + return path + DIR_CHAR + targetName + DIR_CHAR + targetName + ".entitlements"; + } + #endregion + } +} + +#endif \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs.meta b/Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs.meta new file mode 100644 index 0000000..3f7b736 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM/IOSPostProcessBuild.IPM.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 963cba5e4a074d208e7d9343acb547dc +timeCreated: 1632375624 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist b/Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist new file mode 100644 index 0000000..e3488ab --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + U3D2FCM-iOS + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.1.0 + CFBundleVersion + 8 + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + NotificationService + + + diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist.meta b/Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist.meta new file mode 100644 index 0000000..c46018d --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM/Info.plist.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c76614c2deb1e4591a5f2f0d5cdfabf7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h b/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h new file mode 100644 index 0000000..a820f01 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h @@ -0,0 +1,12 @@ +// +// NotificationService.h +// U3D2FCM-iOS +// +// Created by Xiaohang Yang on 2021/1/28. +// + +#import + +@interface NotificationService : UNNotificationServiceExtension + +@end diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h.meta b/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h.meta new file mode 100644 index 0000000..0e29d59 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.h.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: 45e43a2e87043417d8f83185b71b4199 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.m b/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.m new file mode 100644 index 0000000..b70bbaf --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_IPM/NotificationService.m @@ -0,0 +1,122 @@ +// +// NotificationService.m +// U3D2FCM +// +// Created by Michael on 2020/11/27. +// + +#import "NotificationService.h" +#import +#import + + +@interface NotificationService () + +@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver); +@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent; + +@end + + + +@implementation NotificationService + + +- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { + self.contentHandler = contentHandler; + self.bestAttemptContent = [request.content mutableCopy]; + + NSLog(@"EventPush-NotificationService-didReceiveNotificationRequest"); + + NSString *packageName = @""; + NSArray *arr = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"] componentsSeparatedByString:@"."]; + for(int i=0;i + /// 针对AmazonSDK iOS平台构建后 + /// BitCode报错的问题 + /// + public class IOSPostProcessBuild_PodFix + { + + /// + /// 添加内容 + /// + private static readonly string MOD_SCRIPT = @"#Compile bugs fixed by HuYufei 2023-11-16 +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + xcconfig_path = config.base_configuration_reference.real_path + xcconfig = File.read(xcconfig_path) + xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, ""TOOLCHAIN_DIR"") + File.open(xcconfig_path, ""w"") { |file| file << xcconfig_mod } + end + end +end"; + + /// + /// 构建操作 + /// 构建顺序 45-50 可以保证执行时序在MAX 自身生成podfile之后, 注入需要的逻辑 + /// AmazonSDK使用了45, 工具设为46,确保后发执行 + /// + /// + /// + [PostProcessBuild(46)] + private static void OnPostProcessBuild(BuildTarget target, string projPath) + { + if (target != BuildTarget.iOS) + return; + + string podPath = Path.Combine(projPath, "Podfile"); + if (File.Exists(podPath)) + { + bool needFix = false; + string content = File.ReadAllText(podPath); + if (!content.Contains("#BITCODE")) + { + content = content + "\n" + MOD_SCRIPT; + File.WriteAllText(podPath, content); + Debug.Log($"=== Fix Pods BitCode bug ==="); + } + + + } + else + { + Debug.LogError($"=== POD not exists, exit pod hook...==="); + } + } + + } +} + +#endif \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_POD/IOSPostProcessBuild.PodFix.cs.meta b/Editor/GuruBuildSuit/IOS_POST_POD/IOSPostProcessBuild.PodFix.cs.meta new file mode 100644 index 0000000..c7b3082 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_POD/IOSPostProcessBuild.PodFix.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7418e71e42e99424c9df47a84b05b37c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/GuruBuildSuit/IOS_POST_SWIFT.meta b/Editor/GuruBuildSuit/IOS_POST_SWIFT.meta new file mode 100644 index 0000000..0b11a80 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_SWIFT.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a78e5d32ead914b3f9f0a718da8594ea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs b/Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs new file mode 100644 index 0000000..1584e81 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs @@ -0,0 +1,53 @@ +#if UNITY_IOS +using UnityEditor; +using UnityEditor.iOS.Xcode; +using UnityEditor.Callbacks; +using UnityEngine; + +namespace Guru +{ + /// + /// SWIFT语言支持 + /// + public class IOSPostBuildSwift + { + [PostProcessBuild(40)] + public static void OnPostProcessBuild(BuildTarget target, string buildPath) + { + if (target != BuildTarget.iOS) return; + + Debug.Log($"--- Add Swift support to project: {buildPath}"); + + // 更新Swift语言支持 + AddSwiftSupport(buildPath); + } + + /// + /// 添加Swift Support + /// + /// + private static void AddSwiftSupport(string buildPath) + { + var projectPath = PBXProject.GetPBXProjectPath(buildPath); + var project = new PBXProject(); + project.ReadFromFile(projectPath); + var mainTargetGuid = project.GetUnityMainTargetGuid(); + var frameworkTargetGuid = project.GetUnityFrameworkTargetGuid(); + + // 关闭BitCode + project.SetBuildProperty(mainTargetGuid, "ENABLE_BITCODE", "NO"); + project.SetBuildProperty(frameworkTargetGuid, "ENABLE_BITCODE", "NO"); + + // 添加搜索路径 + project.AddBuildProperty(frameworkTargetGuid, "LD_RUNPATH_SEARCH_PATHS", "/usr/lib/swift"); + + // 设置主项目的SWIFT构建支持 + project.SetBuildProperty(mainTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES"); + + + project.WriteToFile(projectPath); + } + } +} + +#endif \ No newline at end of file diff --git a/Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs.meta b/Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs.meta new file mode 100644 index 0000000..42e20c6 --- /dev/null +++ b/Editor/GuruBuildSuit/IOS_POST_SWIFT/IOSPostBuild.Swift.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 661b372db3634542856a44e37664649c +timeCreated: 1673406971 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker.meta b/Editor/GuruBuildSuit/SDK_Tracker.meta new file mode 100644 index 0000000..b9b3711 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a0af2d1a3be34a4cb6101bd2a40b4c36 +timeCreated: 1705373808 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs b/Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs new file mode 100644 index 0000000..3ec7fb5 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs @@ -0,0 +1,28 @@ +#if UNITY_ANDROID + +using System; +using System.Collections.Generic; +using UnityEditor.Android; +using UnityEngine; +using Debug=UnityEngine.Debug; + +namespace Guru.Editor +{ + public class AndroidGradleOutputDeps: IPostGenerateGradleAndroidProject + { + public int callbackOrder => 1; + + /// + /// 生成Android项目后执行逻辑 + /// + /// + public void OnPostGenerateGradleAndroidProject(string buildPath) + { + Debug.Log($"---- Android Projct start build {buildPath}"); + DepsOutputHelper.InstallAndRun(buildPath); + } + } +} + + +#endif \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs.meta b/Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs.meta new file mode 100644 index 0000000..9d5ee77 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/AndroidGradleOutputDeps.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f8b64715449c4f23a7781dc15f5d38fe +timeCreated: 1702349739 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs b/Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs new file mode 100644 index 0000000..26fd794 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs @@ -0,0 +1,142 @@ +namespace Guru.Editor +{ + using System; + using UnityEditor; + using System.Diagnostics; + using System.IO; + using UnityEngine; + using Debug=UnityEngine.Debug; + using System.Collections.Generic; + + public class DepsOutputHelper + { + public static readonly string DepsScriptName = "deps.sh"; + public static readonly string EnvScriptName = ".deps_env"; + private static string _scriptFilePath = String.Empty; + public static string ScriptFilePath + { + get + { + if(string.IsNullOrEmpty(_scriptFilePath)) + _scriptFilePath = GetScriptFilePath(); + return _scriptFilePath; + } + } + /// + /// 获取脚本路径 + /// + /// + private static string GetScriptFilePath() + { + string sc = string.Empty; + var guids = AssetDatabase.FindAssets($"{nameof(DepsOutputHelper)} t:script"); + if (guids.Length > 0) + { + sc = AssetDatabase.GUIDToAssetPath(guids[0]); + var fpath = $"{Directory.GetParent(sc).FullName}/files/{DepsScriptName}"; + if(File.Exists(fpath)) return fpath; + } + return string.Empty; + } + + /// + /// 执行脚本 + /// + /// + /// + public static void CallDepsScript(string workpath, string cmd = "") + { + if (string.IsNullOrEmpty(cmd)) cmd = DepsScriptName; + RunShellCmd(workpath, cmd); + Debug.Log($"---- running command: {cmd} is over -----"); + } + + // 运行命令 + public static void RunShellCmd(string workpath, string cmd) + { + //------ 启动命令 -------- + Process p = new Process(); + p.StartInfo.WorkingDirectory = workpath; + p.StartInfo.FileName = "/bin/bash"; + p.StartInfo.Arguments = cmd; + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardOutput = true; + p.Start(); + var log = p.StandardOutput.ReadToEnd(); + p.WaitForExit(); + Debug.Log(log); + } + + // 设置ENV文件 + private static void SetupEnvScript(string projPath, string depauditPath = "") + { + string buildName = $"1.0.0-00000000"; + string platform = $"editor"; + string dir = projPath; + +#if UNITY_ANDROID + buildName = $"{Application.version}-{PlayerSettings.Android.bundleVersionCode}"; + platform = "android"; +#elif UNITY_IOS + buildName = $"{Application.version}-{PlayerSettings.iOS.buildNumber}"; + platform = "ios"; +#endif + List lines = new List() + { + $"export BUILD_NAME={buildName}", + $"export APP_NAME=\"{PlayerSettings.productName}\"", + $"export APP_ID={Application.identifier}", + $"export PLATFORM={platform}", + $"export DIR={dir}", + }; + + if (!string.IsNullOrEmpty(depauditPath)) + { + // 本地调试, 需要工具路径 + lines.Add($"export depaudit={depauditPath}"); + } + + File.WriteAllLines($"{projPath}/{EnvScriptName}", lines.ToArray()); + } + + /// + /// 安装和运行依赖输出器 + /// + /// + public static void InstallAndRun(string buildPath) + { + if (string.IsNullOrEmpty(ScriptFilePath) || !File.Exists(ScriptFilePath)) + { + Debug.LogError($"--- deps script file not found, skip output deps..."); + return; + } + + string projPath = buildPath; +#if UNITY_ANDROID + projPath = Directory.GetParent(buildPath).FullName; +#elif UNITY_IOS + //TBD +#endif + //---- Setup Env ---- + SetupEnvScript(projPath); + + //---- Setup Deps ---- + string to = $"{projPath}/{DepsScriptName}"; + if (File.Exists(to)) File.Delete(to); + FileUtil.CopyFileOrDirectory(ScriptFilePath, to); //拷贝脚本 + + try + { + Debug.Log($"=== Output build deps data ==="); + CallDepsScript(projPath); + } + catch (Exception ex) + { + Debug.LogError(ex); + Debug.Log($"=== Output pods deps failed: {ex}"); + } + + } + + } +} \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs.meta b/Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs.meta new file mode 100644 index 0000000..195ee39 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/DepsOutputHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 831ffddddd78421b8597eac6367fd920 +timeCreated: 1702366162 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs b/Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs new file mode 100644 index 0000000..3bd3125 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs @@ -0,0 +1,36 @@ +#if UNITY_IOS + +using System.IO; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEngine; + +namespace Guru.Editor +{ + public class IOSXcodeOutputDeps + { + // + /// 构建操作 + /// 构建顺序 45-50 可以保证执行时序在MAX 自身生成podfile之后, 注入需要的逻辑 + /// AmazonSDK使用了45, 工具设为 > 45, 确保后发执行 + /// + /// + /// + [PostProcessBuild(1000)] + private static void OnPostProcessBuild(BuildTarget target, string projPath) + { + string podlock = Path.Combine(projPath, "Podfile.lock"); + if (File.Exists(podlock)) + { + DepsOutputHelper.InstallAndRun(projPath); + } + else + { + Debug.LogError($"=== POD install not success, exit deps hook...==="); + } + } + } +} + + +#endif \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs.meta b/Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs.meta new file mode 100644 index 0000000..2ed4742 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/IOSXcodeOutputDeps.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b2e00c5d9f49480988f78c88fc9d2bac +timeCreated: 1702365324 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/files.meta b/Editor/GuruBuildSuit/SDK_Tracker/files.meta new file mode 100644 index 0000000..b2306c1 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/files.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d7b67912d7d245e0bf67086a8e2f395a +timeCreated: 1702349190 \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh b/Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh new file mode 100644 index 0000000..1e71899 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +GRADLE_VERSION=6.7.1 + +export PATH="~/.gradle/${GRADLE_VERSION}:$PATH" +export PATH="~/.gradle/${GRADLE_VERSION}/bin:$PATH" +export GURU_BIN="~/dev/flutter/guru_app/tools/bin" +export PATH="$GURU_BIN:$PATH" + +source .deps_env + +echo "--- BuildName: ${BUILD_NAME}" +echo "--- AppName: ${APP_NAME}" +echo "--- APP_ID: ${APP_ID}" +echo "--- Platform: ${PLATFORM}" +echo "--- DIR: ${DIR}" + + +if [ "${PLATFORM}" = "android" ]; then + gradle w +fi + +echo "----- collect deps start-----" + +depaudit --platform "${PLATFORM}" --dir "${DIR}" --build_version "${BUILD_NAME}" --app_name "${APP_NAME}" --app_id "${APP_ID}" --engine unity + +echo "----- collect deps over -----" + +if [ "${PLATFORM}" = "android" ]; then + + if [ -f ${DIR}/gradlew ]; then + ${DIR}/gradlew --stop + echo "***************** deps collect success! *****************" + else + echo "***************** gradlew not found, deps collect failed! *****************" + fi + +else + echo "***************** deps collect success! *****************" +fi \ No newline at end of file diff --git a/Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh.meta b/Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh.meta new file mode 100644 index 0000000..cba9769 --- /dev/null +++ b/Editor/GuruBuildSuit/SDK_Tracker/files/deps.sh.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d43d22568540f49378be159486b4e1d3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: