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: