From a5cfdd4df6c9edea2228bb391dbd5f8a51a71d9a Mon Sep 17 00:00:00 2001 From: huyfei Date: Thu, 22 Feb 2024 16:28:58 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E5=8D=87=E7=BA=A7=20GuruConsent=20An?= =?UTF-8?q?droid=20=E5=AE=9E=E7=8E=B0=E5=92=8C=E6=9E=84=E5=BB=BA=E7=AE=A1?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GuruConsent/Editor/PostBuildProcess.meta | 3 + .../Editor/PostBuildProcess/PostBuild.DMA.cs | 130 ++++++++++++++++++ .../PostBuildProcess/PostBuild.DMA.cs.meta | 3 + .../Plugins/Android/consent-release.aar | Bin 5175 -> 0 bytes .../Android/guruconsent-unity-1.0.5.aar | Bin 0 -> 5639 bytes ....meta => guruconsent-unity-1.0.5.aar.meta} | 2 +- .../Runtime/Script/Consent/GoogleDMAHelper.cs | 66 +++++++++ .../Script/Consent/GoogleDMAHelper.cs.meta | 3 + .../Runtime/Script/Consent/GuruConsent.cs | 29 ++-- .../Runtime/Script/Consent/IConsentAgent.cs | 2 +- .../Consent/Impl/ConsentAgentAndroid.cs | 55 ++++++-- .../Script/Consent/Impl/ConsentAgentIOS.cs | 13 ++ .../Script/Consent/Impl/ConsentAgentStub.cs | 11 +- 13 files changed, 290 insertions(+), 27 deletions(-) create mode 100644 Runtime/GuruConsent/Editor/PostBuildProcess.meta create mode 100644 Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs create mode 100644 Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs.meta delete mode 100644 Runtime/GuruConsent/Plugins/Android/consent-release.aar create mode 100644 Runtime/GuruConsent/Plugins/Android/guruconsent-unity-1.0.5.aar rename Runtime/GuruConsent/Plugins/Android/{consent-release.aar.meta => guruconsent-unity-1.0.5.aar.meta} (93%) create mode 100644 Runtime/GuruConsent/Runtime/Script/Consent/GoogleDMAHelper.cs create mode 100644 Runtime/GuruConsent/Runtime/Script/Consent/GoogleDMAHelper.cs.meta diff --git a/Runtime/GuruConsent/Editor/PostBuildProcess.meta b/Runtime/GuruConsent/Editor/PostBuildProcess.meta new file mode 100644 index 0000000..e4db2ae --- /dev/null +++ b/Runtime/GuruConsent/Editor/PostBuildProcess.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d8070d73e560497f8869d5159003789e +timeCreated: 1708513964 \ No newline at end of file diff --git a/Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs b/Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs new file mode 100644 index 0000000..6560712 --- /dev/null +++ b/Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs @@ -0,0 +1,130 @@ + + +using System.Xml; +using UnityEngine; + +namespace Guru.Editor +{ + using UnityEditor; + using UnityEditor.Callbacks; + using System.IO; + + public class PostBuild_DMA + { + + + [PostProcessBuild] + public static void OnPostProcessBuild(BuildTarget target, string buildPath) + { + string dir = ""; + // TODO: add your code here + if (target == BuildTarget.Android) + { + dir = $"{buildPath}/src/main"; + OnSetAndroidManifest(dir); + } + else if (target == BuildTarget.iOS) + { + + } + + } + + + #region Android Inject + + + + /*-------------------------------------------------------------------------------- + * + * + * 向 AndroidManifest 中添加以下数据 + * + * + * + * + * + * + --------------------------------------------------------------------------------*/ + + /// + /// 修复 AndroidManifest.xml + /// + /// + private static void OnSetAndroidManifest(string dir) + { + var filePath = Path.Combine(dir, "AndroidManifest.xml"); + + // 预注入 Key + string[] dma_keys = new string[] + { + "google_analytics_default_allow_analytics_storage", + "google_analytics_default_allow_ad_storage", + "google_analytics_default_allow_ad_user_data", + "google_analytics_default_allow_ad_personalization_signals" + }; + + int[] flags = new int[] { 0, 0, 0, 0 }; + + string defaultValue = "true"; // 日后可能会进行修改 + + if (File.Exists(filePath)) + { + var xmlStr = File.ReadAllText(filePath); + + var doc = new XmlDocument(); + doc.LoadXml(xmlStr); + + var root = doc.SelectSingleNode("manifest") as XmlElement; + if (root == null) return; + if (root.SelectSingleNode("application") is XmlElement app) + { + var namespace_uri = root.GetAttribute("xmlns:android"); + + var list = app.SelectNodes("meta-data"); + + // 刷新已有属性 + foreach (XmlElement item in list) + { + for(int i = 0; i < dma_keys.Length; i++) + { + if (item.HasAttributes && item.GetAttribute("android:name") == dma_keys[i]) + { + item.SetAttribute("value", namespace_uri, defaultValue); + flags[i] = 1; + } + } + } + + // 补全缺失属性 + for (int i = 0; i < flags.Length; i++) + { + if (flags[i] == 0) + { + var node = doc.CreateElement("meta-data"); + node.SetAttribute("name", namespace_uri,dma_keys[i]); + node.SetAttribute("value", namespace_uri, defaultValue); + app.AppendChild(node); + } + } + + doc.Save(filePath); + } + + } + else + { + Debug.LogError($"[Post] can't find AndroidManifest.xml at {filePath}"); + } + } + + public static void Test_AndroidManifestInject() + { + OnSetAndroidManifest($"{Application.dataPath}/Plugins/Android"); + } + + + + #endregion + } +} \ No newline at end of file diff --git a/Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs.meta b/Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs.meta new file mode 100644 index 0000000..41b65be --- /dev/null +++ b/Runtime/GuruConsent/Editor/PostBuildProcess/PostBuild.DMA.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ecc9ca95286d4da49f2a482f65d865dd +timeCreated: 1708513986 \ No newline at end of file diff --git a/Runtime/GuruConsent/Plugins/Android/consent-release.aar b/Runtime/GuruConsent/Plugins/Android/consent-release.aar deleted file mode 100644 index 6479a70744dc98d3752643bd89de2b61cfb3b362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5175 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 diff --git a/Runtime/GuruConsent/Plugins/Android/guruconsent-unity-1.0.5.aar b/Runtime/GuruConsent/Plugins/Android/guruconsent-unity-1.0.5.aar new file mode 100644 index 0000000000000000000000000000000000000000..0a81642613b17af3b42f73a3ff4a4f12987932a7 GIT binary patch literal 5639 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 + /// DMA 助手 + /// + public class GoogleDMAHelper + { + + /// + /// 设置 DMA 状态值 + /// + /// + public static void SetDMAStatus(string value) + { + if (string.IsNullOrEmpty(value)) + { + // 非 EEA 国家不需要设置和上报 DMA + Debug.Log($"{GuruConsent.Tag} --- GoogleDMAHelper:: User is not at EEA countries"); + return; + } + + bool granted = false; + if(value.Length >= 4) granted = (value[0] == '1' && value[2] == '1' && value[3] == '1'); // 1,3,4 位需同时为 1 才算授权 + // 根据授权填写状态值 + string result = granted? "1111" : "0000"; + + Debug.Log($"{GuruConsent.Tag} --- GoogleDMAHelper::SetDMAStatus - status:{value} result: {result}"); + + //---------- Firebase 上报打点 -------------- + Dictionary consentSettings = new Dictionary() + { + { ConsentType.AdStorage, result[0] == '1' ? ConsentStatus.Granted : ConsentStatus.Denied }, + { ConsentType.AnalyticsStorage, result[1] == '1' ? ConsentStatus.Granted : ConsentStatus.Denied }, + { ConsentType.AdPersonalization, result[2] == '1' ? ConsentStatus.Granted : ConsentStatus.Denied }, + { ConsentType.AdUserData, result[3] == '1' ? ConsentStatus.Granted : ConsentStatus.Denied }, + }; + FirebaseAnalytics.SetConsent(consentSettings); + + //---------- Adjust 上报打点 -------------- + AdjustThirdPartySharing adjustThirdPartySharing = new AdjustThirdPartySharing(null); + adjustThirdPartySharing.addGranularOption("google_dma", "eea", "1"); + adjustThirdPartySharing.addGranularOption("google_dma", "ad_personalization", $"{result[2]}"); + adjustThirdPartySharing.addGranularOption("google_dma", "ad_user_data", $"{result[3]}"); + Adjust.trackThirdPartySharing(adjustThirdPartySharing); + + //----------- 中台打点 --------------- + Guru.Analytics.LogEvent("dma_gg", new Dictionary() + { + {"purpose", value}, + {"result", result} + + }, new Analytics.EventSetting() + { + EnableFirebaseAnalytics = true, + EnableFacebookAnalytics = true, + }); + + } + } +} \ No newline at end of file diff --git a/Runtime/GuruConsent/Runtime/Script/Consent/GoogleDMAHelper.cs.meta b/Runtime/GuruConsent/Runtime/Script/Consent/GoogleDMAHelper.cs.meta new file mode 100644 index 0000000..85f7941 --- /dev/null +++ b/Runtime/GuruConsent/Runtime/Script/Consent/GoogleDMAHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 161e0f9feb4045f29c908a6aa52074c9 +timeCreated: 1708514026 \ No newline at end of file diff --git a/Runtime/GuruConsent/Runtime/Script/Consent/GuruConsent.cs b/Runtime/GuruConsent/Runtime/Script/Consent/GuruConsent.cs index ee8e299..488263e 100644 --- a/Runtime/GuruConsent/Runtime/Script/Consent/GuruConsent.cs +++ b/Runtime/GuruConsent/Runtime/Script/Consent/GuruConsent.cs @@ -11,8 +11,8 @@ namespace Guru public class GuruConsent { // Guru Consent Version - public static string Version = "1.0.3"; - + public static string Version = "1.0.5"; + public static string Tag = "[GuruConsent]"; #region 公用接口 @@ -46,6 +46,8 @@ namespace Guru /// public static void StartConsent(Action onComplete = null, string deviceId = "", int debugGeography = -1 ) { + Debug.Log($"{Tag} --- GuruConsent::StartConsent - deviceId: {deviceId} debugGeography: {debugGeography}"); + onCompleteHandler = onComplete; // 初始化SDK对象 GuruSDKCallback.AddCallback(OnSDKCallback); @@ -59,11 +61,15 @@ namespace Guru /// /// 获取SDK回调 /// - /// + /// private static void OnSDKCallback(string msg) { - Debug.Log($"[U3D] msg: \n{msg}"); + //-------- Fetch DMA status and report ----------- + var dma = Agent?.GetDMAValue() ?? ""; + GoogleDMAHelper.SetDMAStatus(dma); + //------- message send to unity ---------- + Debug.Log($"{Tag} get callback msg:\n{msg}"); var jo = JsonMapper.ToObject(msg); if (jo != null && jo.ContainsKey("action") && jo["action"].ToString() == "gdpr") @@ -73,16 +79,25 @@ namespace Guru var data = JsonMapper.ToObject(json); if (data != null) { - Debug.Log($"[GDPR] == status: {data.status} msg: {data.msg}"); + Debug.Log($"{Tag} --- status: {data.status} msg: {data.msg}"); onCompleteHandler?.Invoke(data.status); } } else { - Debug.Log("[Unity] Parse callback Error"); + Debug.Log($"{Tag} Parse callback Error"); } } + /// + /// 上报异常 + /// + /// + public static void LogException(Exception ex) + { + Analytics.LogCrashlytics(ex); + } + #endregion #region 常量定义 @@ -123,8 +138,6 @@ namespace Guru #endregion - - } diff --git a/Runtime/GuruConsent/Runtime/Script/Consent/IConsentAgent.cs b/Runtime/GuruConsent/Runtime/Script/Consent/IConsentAgent.cs index cceac3e..20fd1a6 100644 --- a/Runtime/GuruConsent/Runtime/Script/Consent/IConsentAgent.cs +++ b/Runtime/GuruConsent/Runtime/Script/Consent/IConsentAgent.cs @@ -3,7 +3,7 @@ namespace Guru public interface IConsentAgent { void Init(string objectName, string callbackName); - void RequestGDPR(string deviceId = "", int debugGeography = -1); + string GetDMAValue(); } } \ No newline at end of file diff --git a/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentAndroid.cs b/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentAndroid.cs index b211327..0b0cd58 100644 --- a/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentAndroid.cs +++ b/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentAndroid.cs @@ -1,40 +1,65 @@ + + namespace Guru { - + using System; using UnityEngine; - public class ConsentAgentAndroid: IConsentAgent { - private static readonly string ConsentAndroidClassName = "com.guru.unity.consent.Consent"; - private string _objName; private string _callbackName; +#if UNITY_ANDROID + private AndroidJavaClass _javaConsentClass; + private bool _initSuccess = false; +#endif public void Init(string objectName, string callbackName) { _objName = objectName; _callbackName = callbackName; +#if UNITY_ANDROID + _initSuccess = false; + try + { + _javaConsentClass = new AndroidJavaClass(ConsentAndroidClassName); + if (_javaConsentClass != null) + { + _initSuccess = true; + // 绑定Unity回调物体 + _javaConsentClass.CallStatic("initSDK", _objName, _callbackName); + } + } + catch (Exception e) + { + GuruConsent.LogException(e); + } +#endif } public void RequestGDPR(string deviceId = "", int debugGeography = -1) { #if UNITY_ANDROID - - // 初始化Android SDK - using (var jc = new AndroidJavaClass("com.guru.unity.consent.Consent")) - { - // 绑定Unity回调物体 - jc.CallStatic("initSDK", _objName, _callbackName); - - // request gdpr - jc.CallStatic("requestGDPR", deviceId, debugGeography); - } + if (!_initSuccess) return; + // request funding choices + _javaConsentClass.CallStatic("requestGDPR", deviceId, debugGeography); #endif - + } + + /// + /// 获取 DMA 字段 + /// + /// + public string GetDMAValue() + { +#if UNITY_ANDROID + if (!_initSuccess) return ""; + return _javaConsentClass.CallStatic("getDMAValue"); +#endif + return ""; } } } \ No newline at end of file diff --git a/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentIOS.cs b/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentIOS.cs index d64b057..2fd5605 100644 --- a/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentIOS.cs +++ b/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentIOS.cs @@ -41,5 +41,18 @@ namespace Guru unityRequestGDPR(deviceId, debugGeography); #endif } + + + /// + /// 获取 DMA 字段 + /// + /// + public string GetDMAValue() + { +#if UNITY_IOS + //TODO: ios return raw value +#endif + return ""; + } } } \ No newline at end of file diff --git a/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentStub.cs b/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentStub.cs index 19b4289..c3eaca4 100644 --- a/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentStub.cs +++ b/Runtime/GuruConsent/Runtime/Script/Consent/Impl/ConsentAgentStub.cs @@ -13,8 +13,6 @@ namespace Guru public static string DebugMessage { get; set; } = "You have already obtained the consent."; private static readonly string callbackMsgFmt = @"{""action"":""gdpr"", ""data"": {""status"":$0, ""msg"":""$1"" }}"; - - #region 接口实现 @@ -44,6 +42,15 @@ namespace Guru } #endif } + + /// + /// 获取 DMA 字段 + /// + /// + public string GetDMAValue() + { + return ""; + } #endregion