update: 添加中台对应的 iOS 构建管线

deeplink
胡宇飞 2024-03-13 17:43:29 +08:00
parent bdb15cdf1d
commit ffd2b7da21
37 changed files with 2008 additions and 1 deletions

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c2bda7db652148e7a73fd2179e22be09
guid: 70312596ce564426aa363479bc5fd1f9
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b460e9873d8bf445da1764952f4f966c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
/// <summary>
/// SKAdNetwork 注入逻辑
/// </summary>
public static class IOSPostBuild_SKAdNetwork
{
private static List<string> NETWORK_IDENTIFIER_ARRAY = new List<string>();
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<string> arrays)
{
foreach (var value in arrays)
{
PlistArrayAddDict(plistElementArray, value);
}
}
private static void PlistArrayAddDict(PlistElementArray plistElementArray, string value)
{
plistElementArray.AddDict().SetString(SKADNetworkIdentifier, value);
}
}
}
#endif

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: be1ddc59e4ac2416f8174a5611f0c98a
timeCreated: 1632375624

View File

@ -0,0 +1,925 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4fzdc2evr5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4pfyvq9l8r.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2fnua5tdw4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ydx93a7ass.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>5a6flpkh64.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>p78axxw29g.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v72qych5uu.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ludvb6z3bs.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cp8zw746q7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3sh42y64q3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>c6k4g5qg8m.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>s39g8k73mm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3qy4746246.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>f38h382jlk.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>hs6bdukanm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v4nxqhlyqp.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>wzmmz9fp6w.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>yclnxrl5pm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>t38b2kh725.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7ug5zh24hu.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>gta9lk7p23.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>vutu7akeur.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>y5ghdn5j9k.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>n6fk4nfna4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v9wttpbfk9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>n38lu8286q.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>47vhws6wlr.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>kbd757ywx3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9t245vhmpl.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>eh6m2bh4zr.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>a2p9lx4jpn.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4468km3ulz.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2u9pt9hc89.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8s468mfl3y.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>klf5c3l5u5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ppxm28t8ap.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ecpz2srf59.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>uw77j35x4d.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>pwa73g5rt2.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mlmmfzh3r3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>578prtvx9j.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4dzt52r2t5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>e5fvkxwrpn.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8c4e2ghe7u.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>zq492l623r.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3rd42ekr43.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3qcr597p9d.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>24t9a8vw3c.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>24zw6aqk47.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>252b5q8x7y.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>275upjj5gd.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>294l99pt4k.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>32z4fx6l9h.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3l6bd9hu43.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>424m5254lk.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>44jx6755aq.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>44n7hlldy6.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>488r3q3dtq.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4mn522wn87.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4w7y6s5ca2.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>523jb4fst2.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>52fl2v3hgk.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>54nzkqm89y.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>5l3tpt7t6e.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>5lm9lj6jb7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>5tjdwbrq8w.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>6964rsfnh4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>6g9af3uyq4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>6p4ks3rnbw.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>6v7lgmsu45.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>6xzpu9s2p8.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>737z793b9f.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>74b6s63p6l.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>79pbpufp6p.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7fmhfwg9en.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7rz58n8ntl.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>84993kbrcf.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>89z7zv988g.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8m87ys6875.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8r8llnkz5a.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>97r2b46745.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9b89h5y424.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9nlqeag3gk.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9rd848q2bz.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9vvzujtq5s.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9yg77x724h.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>a7xqa6mtl2.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>a8cz6cu7e5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>av6w8kgt66.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>b9bk5wbcq9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>bxvub5ada5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>c3frkrj4fj.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cg4yq2srnc.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cj5566h2ga.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cs644xg564.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dbu4b84rxf.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dkc879ngq3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dzg6xy7pwj.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ejvt5qm6ak.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>f73kdq92p3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>f7s53z58qe.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>feyaarzu9v.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>g28c52eehv.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>g2y4y55b64.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ggvn48r87g.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>glqzh8vgby.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>gta8lk7p23.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>hb56zgv37p.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>hdw39hrw9y.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>k674qkevps.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>kbmxgpxpgc.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>krvm3zuq6h.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>lr83yxwka7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>m297p6643m.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>m5mvw97r93.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>m8dbw4sv7c.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mls7yz5dvl.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mp6xlyr22a.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mtkv5xtk9e.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>n66cz3y3bx.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>n9x2a789qt.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>nzq8sh4pbs.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>prcb7njmu6.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>pwdxu55a5a.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>qqp299437r.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>r45fhb6rf7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>rvh3l7un93.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>rx5hdcabgc.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>s69wq72ugq.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>su67r6k2v3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>tl55sbb4fm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>u679fj5vs4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v79kvwwj4g.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>vcra2ehyfk.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>w9q455wk68.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>wg4vff78zm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x44k69ngh6.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x5l83yy675.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x8jxxk4ff5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x8uqf25wch.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>xy9t38ct57.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>y45688jllp.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>zmvfpc5aq8.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>t6d3zquu66.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9g2aggbj52.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>h65wbv5k3f.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>gvn48r87g.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>bvpn9ufa9b.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>hjevpa356n.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>6yxyv74ff7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mqn7fxpca7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7953jerfzd.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>qu637u8glc.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>g6gcrrvk4p.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>nu4557a4je.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cj5566h2ga.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>gvmwg8q7h5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>pu4na253f3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>yrqqpx2mcb.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>z4gj7hsk7h.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>z959bm4gru.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>bd757ywx3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>33r6p7g8nc.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>g69uk9uh2b.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>633vhxswh4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>tmhh9296z4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>zh3b7bxvad.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>xmn954pzmp.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>79w64w269u.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>d7g9azk84q.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>866k9ut3g3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2q884k2j68.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>gfat3222tu.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>pd25vrrwzn.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>y755zyxw56.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>qlbq5gtkt8.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>67369282zy.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>899vrgt9g8.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mj797d8u6f.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>88k8774x49.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>t3b3f7n3x8.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>c7g47wypnu.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>z5b3gh5ugf.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dd3a75yxkv.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>h5jmj969g5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dr774724x4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>t7ky8fmwkd.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>fz2k2k5tej.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>w28pnjg2k4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2rq3zucswp.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>vc83br9sjg.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>eqhxz8m8av.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7k3cvf297u.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7tnzynbdc7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>l6nv3x923s.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>h8vml93bkz.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>uzqba5354d.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8qiegk9qfv.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>xx9sdjej2w.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>au67k4efj4.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dmv22haz9p.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7fbxrn65az.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>b55w3d8y8z.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v7896pgt74.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>5ghnmfs3dh.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>627r9wr2y5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>sczv5946wb.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8w3np9l82g.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>nrt9jy4kw9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dn942472g5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cad8qz2s3j.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>r26jy69rpl.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>jb7bn6koa5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>fkak3gfpt6.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2tdux39lx8.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>3cgn6rq224.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>nfqy3847ph.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>dticjx1a9i.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9wsyqb3ku7.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x5854y7y24.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>6qx585k4p6.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>l93v5h6a4m.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>axh5283zss.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>5mv394q32t.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ln5gz23vtd.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x2jnk7ly8j.skadnetwork</string>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e15412105e424ee0934897a153640a34
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 815571d7e09647a8b91951918d0feb7e
timeCreated: 1699597324

View File

@ -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;
/// <summary>
/// Fireabse DebugView 开启参数注入
/// </summary>
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:";
/// <summary>
/// 需要在外部接口调用参数注入
/// </summary>
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);
}
/// <summary>
/// 添加启动参数到Scheme
/// </summary>
/// <param name="buildPath"></param>
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);
}
/// <summary>
/// 注入命令行参数
/// </summary>
/// <param name="buildPath"></param>
private static void InjectLaunchCode(string buildPath)
{
string path = $"{buildPath}/Classes/UnityAppController.mm";
if (File.Exists(path))
{
List<string> 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} <color=orange>---- code has already injected, skip... </color>");
return;
}
break;
}
}
lines.Insert(idx, CodeCmdArgsFix);
File.WriteAllLines(path, lines.ToArray());
Debug.Log($"{Tag} <color=#88ff00>---- code has success injected.</color> path:\n{path}");
}
else
{
Debug.Log($"{Tag} <color=red>---- file not found: {path}, inject failed... </color>");
}
}
}
}
#endif

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7f98aa3ce0d04b2d9f8442a0b288f27e
timeCreated: 1699597308

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: bf616a5ad654b418281c06863ad401eb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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<string> NETWORK_IDENTIFIER_ARRAY = new List<string>();
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>
{
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<EntitlementOptions> 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

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 963cba5e4a074d208e7d9343acb547dc
timeCreated: 1632375624

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>U3D2FCM-iOS</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.1.0</string>
<key>CFBundleVersion</key>
<string>8</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.usernotifications.service</string>
<key>NSExtensionPrincipalClass</key>
<string>NotificationService</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: c76614c2deb1e4591a5f2f0d5cdfabf7
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,12 @@
//
// NotificationService.h
// U3D2FCM-iOS
//
// Created by Xiaohang Yang on 2021/1/28.
//
#import <UserNotifications/UserNotifications.h>
@interface NotificationService : UNNotificationServiceExtension
@end

View File

@ -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:

View File

@ -0,0 +1,122 @@
//
// NotificationService.m
// U3D2FCM
//
// Created by Michael on 2020/11/27.
//
#import "NotificationService.h"
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@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<arr.count-1;i++){
if(i==arr.count-2){
packageName = [packageName stringByAppendingString:arr[i]];
}else{
packageName = [packageName stringByAppendingString: [NSString stringWithFormat:@"%@.",arr[i]]];
}
}
NSLog(@"EventPush-NotificationService-packageName: %@", packageName);
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName: [NSString stringWithFormat: @"group.%@", packageName]];
NSString *appCountry= [defaults stringForKey:@"appCountry"];
NSString *appIdentifier = [defaults stringForKey:@"appIdentifier"];
NSString *appVersion = [defaults stringForKey:@"appVersion"];
NSString *deviceCountry = [defaults stringForKey:@"deviceCountry"];
NSString *deviceId = [defaults stringForKey:@"deviceId"];
NSString *deviceToken = [defaults stringForKey:@"deviceToken"];
NSString *eventUrl = [defaults stringForKey:@"eventUrl"];
NSString *IPM_X_APP_ID = [defaults stringForKey:@"IPM_X_APP_ID"];
NSString *IPM_TOKEN = [defaults stringForKey:@"IPM_TOKEN"];
NSString *IPM_UID = [defaults stringForKey:@"IPM_UID"];
//timezone
NSTimeZone *zone = [NSTimeZone localTimeZone];
NSString *timezone = [zone name];
//model
UIDevice *currentDevice = [UIDevice currentDevice];
NSString *model = [currentDevice model];
//language
NSArray *languageArray = [NSLocale preferredLanguages];
NSString *language = [languageArray objectAtIndex:0];
//locale
NSLocale *localeObj = [NSLocale currentLocale];
NSString *locale = [localeObj localeIdentifier];
NSDate *currentDate = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
NSString *appEventTime = [dateFormatter stringFromDate:currentDate];
NSString *deviceData = [NSString stringWithFormat: @"{\"androidId\":null,\"appCountry\":\"%@\",\"appIdentifier\":\"%@\",\"appVersion\":\"%@\",\"brand\":null,\"deviceCoordinates\":{\"latitude\":0,\"longitude\":0},\"deviceCountry\":\"%@\",\"deviceId\":\"%@\",\"deviceToken\":\"%@\",\"deviceType\":\"iOS\",\"gpsCoordinates\":{\"latitude\":0,\"longitude\":0},\"groups\":null,\"language\":\"%@\",\"locale\":\"%@\",\"model\":\"%@\",\"pushDeviceType\":\"iOS\",\"pushNotificationEnable\":true,\"pushNotifications\":null,\"pushType\":\"FCM\",\"timezone\":\"%@\",\"uid\":\"%@\"}", appCountry,appIdentifier,appVersion,deviceCountry,deviceId,deviceToken,language,locale,model,timezone,IPM_UID];
NSString *postData = [NSString stringWithFormat: @"{\"appEventTime\":\"%@\",\"deviceData\":%@, \"eventType\":\"DeviceReceive\",\"serverParams\":\"{\\\"itemIndex\\\":0,\\\"pushEventId\\\":\\\"test123\\\",\\\"serverPushTime\\\":\\\"2020-11-27T08:48:39Z\\\",\\\"silent\\\":true,\\\"taskName\\\":\\\"pushTest-dof\\\"}\" }",appEventTime,deviceData];
NSLog(@"EventPush-NotificationService-PlayerPrefs: %@", postData);
NSLog(@"EventPush-NotificationService-eventUrl: %@", eventUrl);
NSURL *url = [NSURL URLWithString:eventUrl];
NSMutableURLRequest *httpRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSData *requestData = [postData dataUsingEncoding:NSUTF8StringEncoding];
[httpRequest setHTTPMethod:@"POST"];
[httpRequest setValue:IPM_X_APP_ID forHTTPHeaderField:@"X-APP-ID"];
[httpRequest setValue:IPM_TOKEN forHTTPHeaderField:@"X-ACCESS-TOKEN"];
[httpRequest setValue:IPM_UID forHTTPHeaderField:@"X-UID"];
[httpRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[httpRequest setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[httpRequest setHTTPBody: requestData];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
__block NSURLSessionDataTask *task = [session dataTaskWithRequest:httpRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error!=nil)
{
[task suspend];
}
else
{
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"EventPush-NotificationService-response: %@", requestReply);
[task suspend];
}
}];
[task resume];
// Modify the notification content here...
//self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
self.contentHandler(self.bestAttemptContent);
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}
@end

View File

@ -0,0 +1,27 @@
fileFormatVersion: 2
guid: 280f79c00824a4499a2ef446aa7d00ca
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:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a605997850a6a4ee79efe04dbacff91b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,71 @@
#if UNITY_IOS
namespace Guru.Editor
{
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using Debug = UnityEngine.Debug;
/// <summary>
/// 针对AmazonSDK iOS平台构建后
/// BitCode报错的问题
/// </summary>
public class IOSPostProcessBuild_PodFix
{
/// <summary>
/// 添加内容
/// </summary>
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";
/// <summary>
/// 构建操作
/// 构建顺序 45-50 可以保证执行时序在MAX 自身生成podfile之后, 注入需要的逻辑
/// AmazonSDK使用了45, 工具设为46,确保后发执行
/// </summary>
/// <param name="target"></param>
/// <param name="projPath"></param>
[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($"<color=#88ff00>=== Fix Pods BitCode bug ===</color>");
}
}
else
{
Debug.LogError($"=== POD not exists, exit pod hook...===");
}
}
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7418e71e42e99424c9df47a84b05b37c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a78e5d32ead914b3f9f0a718da8594ea
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,53 @@
#if UNITY_IOS
using UnityEditor;
using UnityEditor.iOS.Xcode;
using UnityEditor.Callbacks;
using UnityEngine;
namespace Guru
{
/// <summary>
/// SWIFT语言支持
/// </summary>
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);
}
/// <summary>
/// 添加Swift Support
/// </summary>
/// <param name="buildPath"></param>
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

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 661b372db3634542856a44e37664649c
timeCreated: 1673406971

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a0af2d1a3be34a4cb6101bd2a40b4c36
timeCreated: 1705373808

View File

@ -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;
/// <summary>
/// 生成Android项目后执行逻辑
/// </summary>
/// <param name="buildPath"></param>
public void OnPostGenerateGradleAndroidProject(string buildPath)
{
Debug.Log($"<color=#88ff00>---- Android Projct start build {buildPath}</color>");
DepsOutputHelper.InstallAndRun(buildPath);
}
}
}
#endif

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f8b64715449c4f23a7781dc15f5d38fe
timeCreated: 1702349739

View File

@ -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;
}
}
/// <summary>
/// 获取脚本路径
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 执行脚本
/// </summary>
/// <param name="projPath"></param>
/// <param name="cmd"></param>
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<string> lines = new List<string>()
{
$"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());
}
/// <summary>
/// 安装和运行依赖输出器
/// </summary>
/// <param name="buildPath"></param>
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}");
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 831ffddddd78421b8597eac6367fd920
timeCreated: 1702366162

View File

@ -0,0 +1,36 @@
#if UNITY_IOS
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;
namespace Guru.Editor
{
public class IOSXcodeOutputDeps
{
// <summary>
/// 构建操作
/// 构建顺序 45-50 可以保证执行时序在MAX 自身生成podfile之后, 注入需要的逻辑
/// AmazonSDK使用了45, 工具设为 > 45, 确保后发执行
/// </summary>
/// <param name="target"></param>
/// <param name="projPath"></param>
[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

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b2e00c5d9f49480988f78c88fc9d2bac
timeCreated: 1702365324

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d7b67912d7d245e0bf67086a8e2f395a
timeCreated: 1702349190

View File

@ -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

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d43d22568540f49378be159486b4e1d3
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: