diff --git a/Runtime/GuruAdjust/AdjustService.cs b/Runtime/GuruAdjust/AdjustService.cs
index 1bb2697..7d698df 100644
--- a/Runtime/GuruAdjust/AdjustService.cs
+++ b/Runtime/GuruAdjust/AdjustService.cs
@@ -370,24 +370,22 @@ namespace Guru
 		/// 
 		/// 广告收入上报 (Adjust 特有的接口)
 		/// 
-		/// 
-		public static void TrackADRevenue(AdImpressionData impressionData)
+		/// 
+		/// 
+		/// 
+		/// 
+		/// 
+		public static void TrackADRevenue(double value, string currency, string adSource, string adUnitId, string adPlacement)
 		{
-			if (impressionData == null)
-				return;
-			
 			var adRevenue = new AdjustAdRevenue(AdjustConfig.AdjustAdRevenueSourceAppLovinMAX);
-			adRevenue.setRevenue(impressionData.value, "USD");
-			adRevenue.setAdRevenueNetwork(impressionData.ad_source);
-			adRevenue.setAdRevenueUnit(impressionData.ad_unit_name);
-			adRevenue.setAdRevenuePlacement(impressionData.ad_placement);
+			if (string.IsNullOrEmpty(currency)) currency = "USD";
+			adRevenue.setRevenue(value, currency);
+			adRevenue.setAdRevenueNetwork(adSource);
+			adRevenue.setAdRevenueUnit(adUnitId);
+			adRevenue.setAdRevenuePlacement(adPlacement);
 			Adjust.trackAdRevenue(adRevenue);
 		}
 		
-		
-		
-		
-
 		#endregion
 
 		#region 关键属性上报
diff --git a/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs b/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs
index b04c14f..536d0be 100644
--- a/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs
+++ b/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs
@@ -5,6 +5,7 @@ namespace Guru
     using System;
     using UnityEngine;
     using System.Collections.Generic;
+    using Guru.Ads;
     
     public abstract class ADServiceBase : IADService where T : new()
     {
@@ -44,11 +45,13 @@ namespace Guru
         public static Action OnRewardClosed;
         
         private Dictionary _reviewCreativeIds = new Dictionary(10); // Creative ID 缓存: Cid : RCid
-        private Dictionary _impressionCache = new Dictionary(10);
+        private Dictionary> _impressionCache = new Dictionary>(10);
  
         protected AdsModel _model;
         protected AdsInitSpec _initSpec = null;
 
+        private AdImpressionDriver _impressionDriver;
+
         public AdsModel Model
         {
             get
@@ -79,6 +82,9 @@ namespace Guru
             if(_model == null) _model = AdsModel.Create();
             this.Log("AD SDK Start Init");
 
+            _impressionDriver = new AdImpressionDriver();
+            _impressionDriver.Init(ReportAdsRevenue); // 初始化 Impression 驱动器
+            
             InitMaxCallbacks(); // 初始化 MAX 广告
             InitService(); // 内部继承接口
         }
@@ -90,15 +96,15 @@ namespace Guru
         {
             //--------------  初始化回调 ------------------
             MaxSdkCallbacks.OnSdkInitializedEvent += OnMaxSdkInitializedCallBack;
-            MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
-            MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
-            MaxSdkCallbacks.Banner.OnAdRevenuePaidEvent += OnBannerRevenuePaidEvent;
-            MaxSdkCallbacks.MRec.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
             
+            //--------------- MRec 回调 -----------------
+            // MaxSdkCallbacks.MRec.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
+
             //--------------- Banner 回调 -----------------
             MaxSdkCallbacks.Banner.OnAdLoadedEvent += OnBannerLoadedEvent;
             MaxSdkCallbacks.Banner.OnAdLoadFailedEvent += OnBannerFailedEvent;
             MaxSdkCallbacks.Banner.OnAdClickedEvent += OnBannerClickedEvent;
+            MaxSdkCallbacks.Banner.OnAdRevenuePaidEvent += OnBannerRevenuePaidEvent;
             MaxSdkCallbacks.Banner.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent;
             //--------------- IV 回调 -----------------
             MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialLoadedEvent;
@@ -107,6 +113,7 @@ namespace Guru
             MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnInterstitialClickEvent;
             MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialDisplayEvent;
             MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialDismissedEvent;
+            MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnInterstitialPaidEvent;
             MaxSdkCallbacks.Interstitial.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent;
             //--------------- RV 回调 -----------------
             MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnRewardedAdLoadedEvent;
@@ -116,6 +123,7 @@ namespace Guru
             MaxSdkCallbacks.Rewarded.OnAdClickedEvent += OnRewardedAdClickedEvent;
             MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnRewardedAdDismissedEvent;
             MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent += OnRewardedAdReceivedRewardEvent;
+            MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnRewardedAdPaidEvent;
             MaxSdkCallbacks.Rewarded.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent;
             
             //--------------- Creative 回调 -----------------
@@ -126,6 +134,8 @@ namespace Guru
             MaxSdk.SetExtraParameter("enable_black_screen_fixes", "true"); // 修复黑屏
         }
 
+
+
         protected virtual void InitService()
         {
         }
@@ -206,88 +216,22 @@ namespace Guru
         /// 
         /// 
         /// 
-        private void ReportAdsRevenue(AdImpressionData impressionData)
+        private void ReportAdsRevenue(AdImpressionData data)
         {
             // #1 ad_impression
-            Analytics.ADImpression(impressionData);
+            Analytics.ADImpression(data);
             
-            // #2 tch_001
-            double revenue = impressionData.value;
+            // #2 tch_001 和 tch_02
+            double revenue = data.value;
             CalcTch001Value(revenue);
             CalcTch02Value(revenue);
                 
             // #3 adjust_ad_revenue
-            AdjustService.TrackADRevenue(impressionData);
-
-
-            var adType = impressionData.ad_format.ToUpper();
-            // #4 Paid Event
-            Debug.Log($"{Tag} --- ReportAdsRevenue :: Send Paid Event: {adType}");
-            if (adType.Contains("INTER"))
-            {
-                OnInterstitialPaidEvent(impressionData);
-            }
-            else if (adType.Contains("REWARD"))
-            {
-                OnRewardedAdPaidEvent(impressionData);
-            }
+            AdjustService.TrackADRevenue(data.value, data.currency, data.ad_source, data.ad_unit_name, data.ad_placement);
         }
 
 
-
-
-        private void OnAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
-        {
-            if (adInfo == null) return;
-            Debug.Log( $"{Tag} --- [Revenue] > [{adInfo.AdFormat}] --- adUnitId:{adUnitId}: UnitID:{adInfo.AdUnitIdentifier}   Revenue:{adInfo.Revenue}    CreativeId:{adInfo.CreativeIdentifier}");
-
-            try
-            {
-                if (_reviewCreativeIds.TryGetValue(adInfo.CreativeIdentifier, out var reviewCreativeId))
-                {
-                    // 找到 RCid 的话则直接上报广告收益
-                    TryReportImpression(adInfo, reviewCreativeId);
-                }
-                else
-                {
-                    // 找不到的话会缓存 adInfo, 等待获取 RCid
-                    SetImpressionData(adInfo);
-                }
-
-            }
-            catch (Exception ex)
-            {
-                Analytics.LogCrashlytics(ex);
-            }
         
-        }
-
-        /// 
-        /// 构建 Impression 数据
-        /// 
-        /// 
-        /// 
-        /// 
-        /// 
-        private AdImpressionData CreateImpressionData(MaxSdkBase.AdInfo adInfo, string reviewCreativeId = "", string platform = "")
-        {
-            if (string.IsNullOrEmpty(platform)) platform = Analytics.AdMAX;
-            
-            var impression = new AdImpressionData()
-            {
-                value = adInfo.Revenue,
-                currency = Analytics.USD,
-                ad_platform = platform,
-                ad_format = adInfo.AdFormat,
-                ad_unit_name = adInfo.AdUnitIdentifier,
-                ad_source = adInfo.NetworkName,
-                ad_placement = adInfo.NetworkPlacement,
-                ad_creative_id = adInfo.CreativeIdentifier,
-                review_creative_id = reviewCreativeId
-            };
-            
-            return impression;
-        }
 
 
         /// 
@@ -339,7 +283,6 @@ namespace Guru
         private int _badsloadedNum = 0;
         private int _badsLoadFailNum = 0;
         
-        
         /// 
         /// 获取动作间隔之间的毫秒数
         /// 
@@ -495,7 +438,8 @@ namespace Guru
         {
             if (_bannerVisible)
             {
-                OnAdRevenuePaidEvent(adUnitId, adInfo); // Banner 只有显示时才上报收益值
+                // Banner 只有显示时才上报收益值
+                AppendImpressionData(adInfo, eventName:Analytics.EventBadsPaid, itemCategory:_badsCategory);
             }
         }
 
@@ -617,7 +561,7 @@ namespace Guru
             Analytics.ADIadsFailed(AdParams.Build(adUnitId,
                 duration: GetActionDuration(_iadsDisplayStartTime), category: _iadsCategory,
                 errorCode: (int)errorInfo.Code,
-                waterfallName: errorInfo?.WaterfallInfo?.Name ?? ""));
+                waterfallName: errorInfo.WaterfallInfo?.Name ?? ""));
             DelayCall(2.0f, RequestInterstitialAD);
         }
         
@@ -625,20 +569,16 @@ namespace Guru
         protected virtual void OnInterstitialDisplayEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
         {
             // Analytics.ADIadsImp(adUnitId, _iadsCategory);
-            string reviewCreativeId = GetReviewCreativeId(adInfo.CreativeIdentifier);
-            Analytics.ADIadsImp(AdParams.Build(adUnitId, adInfo, category: _iadsCategory, reviewCreativeId:reviewCreativeId));
+            AppendImpressionData(adInfo, eventName:Analytics.EventIadsImp, itemCategory:_iadsCategory);
         }
 
         protected virtual void OnInterstitialClickEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
         {
             // Analytics.ADIadsClick(adUnitId, _iadsCategory);
-            string reviewCreativeId = GetReviewCreativeId(adInfo.CreativeIdentifier);
-            var impressionData = CreateImpressionData(adInfo, reviewCreativeId);
-            var data = impressionData.BuildEventData();
             if(string.IsNullOrEmpty(_iadsCategory)) _iadsCategory = "not_set";
-            data["item_category"] = _iadsCategory;
-            data.Remove("ad_format");
-            Analytics.ADIadsClick(data);
+            AppendImpressionData(adInfo, 
+                eventName:Analytics.EventIadsClick,
+                itemCategory:_iadsCategory);
         }
         
         // Close 
@@ -648,21 +588,21 @@ namespace Guru
             _interCloseAction?.Invoke();
             OnInterstitialClosed?.Invoke();
             // Analytics.ADIadsClose(adUnitId, _iadsCategory);
-            Analytics.ADIadsClose(AdParams.Build(adUnitId, 
-                duration:GetActionDuration(_iadsDisplayStartTime), 
-                category: _iadsCategory));
+            Analytics.ADIadsClose(new Dictionary()
+            {
+                [Analytics.ParameterItemCategory] = _iadsCategory,
+                [Analytics.ParameterDuration] = GetActionDuration(_iadsDisplayStartTime),
+            });
+            
+            _impressionDriver.CleanCreativeId(adInfo.CreativeIdentifier);
             
             //延时加载下一个广告
             DelayCall(2.0f, RequestInterstitialAD);
         }
 
-        private void OnInterstitialPaidEvent(AdImpressionData impressionData)
+        private void OnInterstitialPaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
         {
-            var data = impressionData.BuildEventData();
-            if(string.IsNullOrEmpty(_iadsCategory)) _iadsCategory = "not_set";
-            data["item_category"] = _iadsCategory;
-            data.Remove("ad_format");
-            Analytics.ADIadsPaid(data);
+            AppendImpressionData(adInfo, eventName:Analytics.EventIadsPaid, itemCategory: _iadsCategory);
         }
 
 
@@ -808,20 +748,14 @@ namespace Guru
         {
             this.Log("OnRewardedAdDisplayedEvent");
             // Analytics.ADRadsImp(adUnitId, _rewardCategory);
-            string reviewCreativeId = GetReviewCreativeId(adInfo.CreativeIdentifier);
-            Analytics.ADRadsImp(AdParams.Build(adUnitId, adInfo, category: _rewardCategory, reviewCreativeId:reviewCreativeId));
+            AppendImpressionData(adInfo, eventName:Analytics.EventRadsImp, itemCategory: _rewardCategory);
         }
 
         protected virtual void OnRewardedAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
         {
             this.Log("OnRewardedAdClickedEvent");
             // Analytics.ADRadsClick(adUnitId, _rewardCategory);
-            var impressionData = CreateImpressionData(adInfo, GetReviewCreativeId(adInfo.CreativeIdentifier));
-            var data = impressionData.BuildEventData();
-            if(string.IsNullOrEmpty(_rewardCategory)) _rewardCategory = "not_set";
-            data["item_category"] = _rewardCategory;
-            data.Remove("ad_format");
-            Analytics.ADRadsClick(data);
+            AppendImpressionData(adInfo, eventName:Analytics.EventRadsClick, itemCategory: _rewardCategory);
         }
         
         // rads_close
@@ -833,7 +767,13 @@ namespace Guru
             OnRewardClosed?.Invoke();
             
             // Analytics.ADRadsClose(adUnitId, _rewardCategory);
-            Analytics.ADRadsClose(AdParams.Build(adUnitId, duration:GetActionDuration(_radsShowStartTime), category: _rewardCategory));
+            Analytics.ADRadsClose(new Dictionary()
+            {
+                [Analytics.ParameterItemCategory] = _rewardCategory,
+                [Analytics.ParameterDuration] = GetActionDuration(_radsShowStartTime),
+            });
+
+            _impressionDriver.CleanCreativeId(adInfo.CreativeIdentifier);
             
             //延时加载下一个广告
             DelayCall(2.0f, RequestRewardedAD);
@@ -845,25 +785,18 @@ namespace Guru
         {
             this.Log("OnRewardedAdReceivedRewardEvent");
             // Analytics.ADRadsRewarded(adUnitId, _rewardCategory);
-            var impressionData = CreateImpressionData(adInfo, GetReviewCreativeId(adInfo.CreativeIdentifier)); 
-            var data = impressionData.BuildEventData();
-            if(string.IsNullOrEmpty(_rewardCategory)) _rewardCategory = "not_set";
-            data["item_category"] = _rewardCategory;
-            data.Remove("ad_format");
-            Analytics.ADRadsRewarded(data);
-            // Rewarded ad was displayed and user should receive the reward
+            AppendImpressionData(adInfo, eventName:Analytics.EventRadsRewarded, itemCategory: _rewardCategory);
             _rvRewardAction?.Invoke();
         }
 
         // rads_paid
-        private void OnRewardedAdPaidEvent(AdImpressionData impressionData)
+        private void OnRewardedAdPaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
         {
-            var data = impressionData.BuildEventData();
-            if(string.IsNullOrEmpty(_rewardCategory)) _rewardCategory = "not_set";
-            data["item_category"] = _rewardCategory;
-            data.Remove("ad_format");
-            Analytics.ADRadsPaid(data);
+            this.Log("OnRewardedAdReceivedRewardEvent");
+            AppendImpressionData(adInfo, eventName:Analytics.EventRadsPaid, itemCategory: _rewardCategory);
         }
+        
+        
         #endregion
 
         #region Ad Settings
@@ -906,39 +839,54 @@ namespace Guru
 
         #endregion
 
-        #region CreativeID
-
-        private string GetReviewCreativeId(string creativeId)
-        {
-            if (_reviewCreativeIds == null)
-            {
-                return "";
-            }
-            
-            if (_reviewCreativeIds.TryGetValue(creativeId, out var reviewCreativeId))
-            {
-                return reviewCreativeId;
-            }
-            return "";
-        }
-
-        private void SetReviewCreativeId(string creativeId, string reviewCreativeId)
-        {
-            if (_reviewCreativeIds == null) _reviewCreativeIds = new Dictionary(10);
-
-            if (string.IsNullOrEmpty(reviewCreativeId)) return;
-
-            _reviewCreativeIds[creativeId] = reviewCreativeId;
-        }
-
-        private void SetImpressionData(MaxSdkBase.AdInfo adInfo, string reviewCreativeId = "", string platform = "")
-        {
-            if (string.IsNullOrEmpty(platform)) platform = Analytics.AdMAX;
-            _impressionCache[adInfo.CreativeIdentifier] = CreateImpressionData(adInfo, reviewCreativeId, platform);
-        }
-
+        #region ImpressionData
+        
+        const int MAX_BADS_CID_NUMBER = 6;
+        private List _badsCreativeIds = new List(MAX_BADS_CID_NUMBER);
+        
         /// 
-        /// 获取 AdReviewCreativeId
+        /// 构建 Impression 数据
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        private AdImpressionData CreateImpressionData(MaxSdkBase.AdInfo adInfo, 
+            string reviewCreativeId = "", string platform = "", 
+            string eventName = "", string itemCategory = "", int duration = 0)
+        {
+            var impression = AdImpressionDriver.Build(adInfo.Revenue, Analytics.USD, platform,
+                adInfo.NetworkName,
+                adInfo.AdFormat,
+                adInfo.AdUnitIdentifier,
+                adInfo.NetworkPlacement,
+                adInfo.CreativeIdentifier, reviewCreativeId, 
+                eventName, itemCategory, duration);
+            
+            return impression;
+        }
+        
+        /// 
+        /// 添加一条ImpressionData 数据
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        private void AppendImpressionData(MaxSdkBase.AdInfo adInfo, string reviewCreativeId = "", string platform = "", string eventName = "", string itemCategory = "", int duration = 0)
+        {
+            var data =  CreateImpressionData(adInfo, reviewCreativeId, platform, eventName, itemCategory, duration);
+            _impressionDriver.Append(data);
+        }
+        
+        /// 
+        /// 获取 AdReviewCreativeId 后的回调
         /// 
         /// 
         /// 
@@ -946,61 +894,31 @@ namespace Guru
         private void OnAdReviewCreativeIdGeneratedEvent(string adUnitId, string reviewCreativeId, MaxSdkBase.AdInfo adInfo)
         {
             Debug.Log($"{Tag} --- ReviewCreativeId:{reviewCreativeId}  adUnitId: {adUnitId}  Type:{adInfo?.AdFormat ?? "NULL"}  CreativeId: {adInfo?.CreativeIdentifier ?? "NULL"}    Revenue:{adInfo.Revenue}");
-            if (adInfo == null || string.IsNullOrEmpty(adInfo.CreativeIdentifier))
+            if (string.IsNullOrEmpty(adInfo.CreativeIdentifier))
             {
                 Debug.LogError($"{Tag} --- Get ReviewCreativeId:{reviewCreativeId} but CreativeIdentifier is null");
                 return;
             }
 
-            // 尝试直接上报广告收益 (可能存在异步上报的情况)
-            TryReportImpression(adInfo, reviewCreativeId);
-        }
+            _impressionDriver.SetReviewCreativeId(adInfo.CreativeIdentifier, reviewCreativeId); // 缓存 ReviewCreateId
 
-        /// 
-        /// 尝试上报数据
-        /// 
-        /// 
-        /// 
-        /// 
-        private void TryReportImpression(MaxSdk.AdInfo adInfo, string reviewCreativeId = "")
-        {
-            string creativeId = adInfo.CreativeIdentifier;
-            List removeList = new List();
-            
-            if (_impressionCache.TryGetValue(creativeId, out var impressionData))
+            if (adUnitId == GetBannerID() || adInfo.AdFormat.ToUpper().Contains("BANNER"))
             {
-                if(string.IsNullOrEmpty(impressionData.review_creative_id)) 
-                    impressionData.review_creative_id = reviewCreativeId;
-                
-                ReportAdsRevenue(impressionData);
-                removeList.Add(creativeId);
-            }
-            else
-            {
-                // 如果上报未成功, 则缓存reviewCreativeId 
-                SetReviewCreativeId(adInfo.CreativeIdentifier, reviewCreativeId);  
-            }
-
-            // 清理超过 3 秒未上报的数据
-            foreach (var imp in _impressionCache.Values)
-            {
-                if (imp.GetPassedSecond() > 3.0)
+                // 清理 BADS CID 缓存
+                _badsCreativeIds.Add(adInfo.CreativeIdentifier);
+                if (_badsCreativeIds.Count > MAX_BADS_CID_NUMBER)
                 {
-                    ReportAdsRevenue(imp);
-                    removeList.Add(imp.ad_creative_id);
-                }
-            }
-
-            if (removeList.Count > 0)
-            {
-                foreach (var k in removeList)
-                {
-                    _impressionCache.Remove(k);
-                    _reviewCreativeIds.Remove(k);
+                    var cid = _badsCreativeIds[0];
+                    _badsCreativeIds.Remove(cid);
+                    _impressionDriver.CleanCreativeId(cid);
                 }
             }
         }
-
         #endregion
     }
+    
+    
+    
+    
+    
 }
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Ads/Data.meta b/Runtime/GuruCore/Runtime/Ads/Data.meta
new file mode 100644
index 0000000..8948b76
--- /dev/null
+++ b/Runtime/GuruCore/Runtime/Ads/Data.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 1866d6a2a7d7447b867e491b9354a49b
+timeCreated: 1722313457
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionData.cs b/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionData.cs
new file mode 100644
index 0000000..8c4b137
--- /dev/null
+++ b/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionData.cs
@@ -0,0 +1,185 @@
+
+
+
+namespace Guru.Ads
+{
+    using System;
+    using System.Collections.Generic;
+
+    
+    /// 
+    /// AdImpression 对象
+    /// 
+    public class AdImpressionData
+    {
+        private const int MAX_VALUE_LENGTH = 96;
+        
+        public double value;
+        public string currency = "USD";
+        public string ad_platform = "MAX";
+        public string ad_source;
+        public string ad_format;
+        public string ad_unit_name;
+        public string ad_placement;
+        public string ad_creative_id;
+        public string review_creative_id;
+        public string event_name;
+        public DateTime createTime;
+        public string item_category;
+        public int duration;
+        
+        public AdImpressionData()
+        {
+            createTime = DateTime.UtcNow;
+        }
+        
+        public override string ToString()
+        {
+            return $"[AdImpressionData] ad_unit_name:{ad_unit_name} value:{value} currency:{currency} ad_platform:{ad_platform} ad_source:{ad_source} ad_format:{ad_format} ad_placement:{ad_placement} ad_creative_id:{ad_creative_id} review_creative_id:{review_creative_id} event_name:{event_name} duration:{duration} item_category:{item_category}";
+        }
+
+
+        public bool EqualsCreativeId(string cid)
+        {
+            if (string.IsNullOrEmpty(cid)) return false;
+            return ad_creative_id.Equals(cid);
+        }
+        
+        public bool EqualsReviewCreativeId(string rcid)
+        {
+            if (string.IsNullOrEmpty(rcid)) return false;
+            return review_creative_id.Equals(rcid);
+        }
+
+        /// 
+        /// 设置 CreativeId
+        /// 
+        /// 
+        public void SetCreativeId(string creativeId)
+        {
+            ad_creative_id = FixStringLength(creativeId);
+        }
+        
+        /// 
+        /// 设置 ReviewCreativeId
+        /// 
+        /// 
+        public void SetReviewCreativeId(string reviewCreativeId)
+        {
+            if (string.IsNullOrEmpty(reviewCreativeId)) return;
+            review_creative_id = FixStringLength(reviewCreativeId);
+        }
+        
+        /// 
+        /// 限制字符串长度为 96
+        /// 
+        /// 
+        /// 
+        private string FixStringLength(string source)
+        {
+            return source.Length <= MAX_VALUE_LENGTH ? source : source.Substring(0, MAX_VALUE_LENGTH);
+        }
+        
+        /// 
+        /// 获取自创建开始经过的秒数
+        /// 
+        /// 
+        public double GetPassedSecond()
+        {
+            return (DateTime.UtcNow - createTime).TotalSeconds;
+        }
+
+
+        public Dictionary BuildEventData()
+        {
+            var data = new Dictionary()
+            {
+                { "value", value },
+                { "currency", currency },
+                { "ad_platform", ad_platform },
+                { "ad_format", ad_format },
+                { "ad_source", ad_source },
+                { "ad_unit_name", ad_unit_name },
+                { "ad_placement", ad_placement },
+                { "ad_creative_id", ad_creative_id },
+                { "review_creative_id", review_creative_id },
+            };
+            
+            return data;
+        }
+
+
+        public Dictionary BuildEventAdImpData()
+        {
+            var data = new Dictionary()
+            {
+                { "ad_platform", ad_platform },
+                { "ad_source", ad_source },
+                { "ad_unit_name", ad_unit_name },
+                { "ad_placement", ad_placement },
+                { "ad_creative_id", ad_creative_id },
+                { "review_creative_id", review_creative_id },
+                { "item_category", item_category}
+            };
+            
+            return data;
+        }
+
+        public Dictionary BuildEventAdClickData()
+        {
+            var data = new Dictionary()
+            {
+                { "value", value },
+                { "currency", currency },
+                { "ad_platform", ad_platform },
+                { "ad_source", ad_source },
+                { "ad_unit_name", ad_unit_name },
+                { "ad_placement", ad_placement },
+                { "ad_creative_id", ad_creative_id },
+                { "review_creative_id", review_creative_id },
+                { "item_category", item_category}
+            };
+            
+            return data;
+        }
+        
+        public Dictionary BuildEventAdPaidData()
+        {
+            var data = new Dictionary()
+            {
+                { "value", value },
+                { "currency", currency },
+                { "ad_platform", ad_platform },
+                { "ad_source", ad_source },
+                { "ad_unit_name", ad_unit_name },
+                { "ad_placement", ad_placement },
+                { "ad_creative_id", ad_creative_id },
+                { "review_creative_id", review_creative_id },
+                { "item_category", item_category}
+            };
+            
+            return data;
+        }
+        
+        public Dictionary BuildEventAdRewardedData()
+        {
+            var data = new Dictionary()
+            {
+                { "value", value },
+                { "currency", currency },
+                { "ad_platform", ad_platform },
+                { "ad_source", ad_source },
+                { "ad_unit_name", ad_unit_name },
+                { "ad_placement", ad_placement },
+                { "ad_creative_id", ad_creative_id },
+                { "review_creative_id", review_creative_id },
+                { "item_category", item_category}
+            };
+            
+            return data;
+        }
+        
+        
+        
+    }
+}
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Analytics/AdImpressionData.cs.meta b/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionData.cs.meta
similarity index 100%
rename from Runtime/GuruCore/Runtime/Analytics/AdImpressionData.cs.meta
rename to Runtime/GuruCore/Runtime/Ads/Data/AdImpressionData.cs.meta
diff --git a/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionDriver.cs b/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionDriver.cs
new file mode 100644
index 0000000..7578a41
--- /dev/null
+++ b/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionDriver.cs
@@ -0,0 +1,251 @@
+
+
+namespace Guru.Ads
+{
+    // using System.Collections.Concurrent;
+    using System;
+    using System.Collections.Generic;
+    using UnityEngine;
+
+    
+    public class AdImpressionDriver
+    {
+        private const string Tag = "[SDK][ADS]";
+        private const double NEED_FLUSH_TIME = 40.0;  // 单条 Impression data 存在的最大间隔时间(秒)
+        private List _impressionData; // 所有缓存待上报的 impression data
+        private Dictionary _savedReviewCreativeIds;
+ 
+        private Action _onReportAdsRevenue;
+
+        
+        public static AdImpressionData Build(double value, string currency, 
+            string adPlatform, string adSource, string adFormat, 
+            string adUnitName, string adPlacement, string adCreativeID, string reviewCreativeID, 
+            string eventName = "", string itemCategory = "", int duration = 0)
+        {
+            if (string.IsNullOrEmpty(adPlatform)) adPlatform = Analytics.AdMAX;
+            if (string.IsNullOrEmpty(itemCategory)) itemCategory = "not_set";
+            if (string.IsNullOrEmpty(eventName)) eventName = Analytics.EventAdImpression;
+            
+            var data = new AdImpressionData()
+            {
+                value = value,
+                currency = currency,
+                ad_platform = adPlatform,
+                ad_source = adSource,
+                ad_format = adFormat,
+                ad_unit_name = adUnitName,
+                ad_placement = adPlacement,
+                ad_creative_id = adCreativeID,
+                event_name = eventName,
+                item_category = itemCategory,
+                duration = duration,
+            };
+            
+            data.SetCreativeId(adCreativeID);
+            data.SetReviewCreativeId(reviewCreativeID);
+
+            return data;
+        }
+        
+        
+        public void Init(Action onReportRevenue)
+        {
+            _impressionData = new List(20);
+            _savedReviewCreativeIds = new Dictionary(100);
+
+            _onReportAdsRevenue = onReportRevenue;
+        }
+
+        
+        public bool IsCreativeIdExists(string creativeId) => _savedReviewCreativeIds.ContainsKey(creativeId);
+        
+        public void SetReviewCreativeId(string creativeId, string reviewCreativeId)
+        {
+            bool isCidExists = IsCreativeIdExists(creativeId);
+            _savedReviewCreativeIds[creativeId] = reviewCreativeId;
+            
+            if (isCidExists && !string.IsNullOrEmpty(reviewCreativeId))
+            {
+                FlushAllImpressionData(creativeId, reviewCreativeId);
+            }
+        }
+        
+        /// 
+        /// 强制发送相关的数据
+        /// 
+        /// 
+        public void CleanCreativeId(string creativeId)
+        {
+            if (string.IsNullOrEmpty(creativeId)) return;
+            
+            if (IsCreativeIdExists(creativeId))
+            {
+                FlushAllImpressionData(creativeId, "", true);
+            }
+            RemoveCreativeId(creativeId); //清理对应的 createId
+        }
+
+
+        private string GetReviewCreativeId(string creativeId)
+        {
+            if(string.IsNullOrEmpty(creativeId)) return "";
+            return _savedReviewCreativeIds.GetValueOrDefault(creativeId, "");
+        }
+
+
+        public void RemoveCreativeId(string creativeId)
+        {
+            if (IsCreativeIdExists(creativeId))
+            {
+                _savedReviewCreativeIds.Remove(creativeId);
+            }
+        }
+
+        /// 
+        /// 添加一条Impression数据
+        /// 
+        /// 
+        public void Append(AdImpressionData data)
+        {
+            if (CanFlushData(data))
+            {
+                // 立即触发数据
+                FlushImpressionData(data);
+            }
+            else
+            {
+                if (!IsCreativeIdExists(data.ad_creative_id))
+                {
+                    SetReviewCreativeId(data.ad_creative_id, "");
+                }
+                
+                // 缓存数据
+                PushImpressionData(data);
+            }
+        }
+
+
+        private void PushImpressionData(AdImpressionData data)
+        {
+            _impressionData.Add(data);
+        }
+
+
+        private bool CanFlushData(AdImpressionData data)
+        {
+            // #1 如果超时, 强制上报
+            if (data.GetPassedSecond() > NEED_FLUSH_TIME) return true;
+            // #2 如果 cid 和 rcid 都赋值了 则上报
+            if (!string.IsNullOrEmpty(data.review_creative_id)) return true;
+            // #3 如果 rcid 为空, 但是可以找到,也上报
+            var rcid = GetReviewCreativeId(data.ad_creative_id);
+            if (!string.IsNullOrEmpty(rcid))
+            {
+                data.SetReviewCreativeId(rcid);
+                return true;
+            }
+
+            return false;
+        }
+
+
+        /// 
+        /// 触发所有相关的 cid 和 reviewCreateId
+        /// 
+        /// 
+        /// 
+        /// 强制触发
+        private void FlushAllImpressionData(string creativeId, string reviewCreativeId = "", bool force = false)
+        {
+            List tmp = new List(_impressionData.Count);
+            
+            if(string.IsNullOrEmpty(reviewCreativeId)) reviewCreativeId = GetReviewCreativeId(creativeId); //获取 reviewCreativeId
+            
+            foreach(var data in _impressionData)
+            {
+                if (data.EqualsCreativeId(creativeId))
+                {
+                    data.SetReviewCreativeId(reviewCreativeId);
+                    if (CanFlushData(data) || force)
+                    {
+                        FlushImpressionData(data);
+                    }
+                    else
+                    {
+                        tmp.Add(data);
+                    }
+                }
+                else if (CanFlushData(data))
+                {
+                    FlushImpressionData(data);
+                }
+                else
+                {
+                    tmp.Add(data);
+                }
+            }
+
+            _impressionData = tmp;
+        }
+        
+        
+        /// 
+        /// 输出一个 Impression 事件
+        /// 
+        /// 
+        private void FlushImpressionData(AdImpressionData data)
+        {
+            Debug.Log($"{Tag} --- FlushImpressionData: {data}");
+            switch (data.event_name)
+            {
+                case Analytics.EventBadsPaid:
+                    // BADS 收入事件
+                    // BADS 尚未统计 bads_paid 打点
+                    _onReportAdsRevenue?.Invoke(data);
+                    break;
+                
+                case Analytics.EventIadsImp:
+                    Analytics.ADIadsImp(data.BuildEventAdImpData());
+                    break;
+                
+                case Analytics.EventIadsClick:
+                    Analytics.ADIadsClick(data.BuildEventAdClickData());
+                    break;
+                
+                case Analytics.EventIadsPaid:
+                    // IADS 收入事件
+                    Analytics.ADIadsPaid(data.BuildEventAdPaidData());
+                    _onReportAdsRevenue?.Invoke(data);
+                    break;
+                
+                case Analytics.EventRadsImp:
+                    Analytics.ADRadsImp(data.BuildEventAdImpData());
+                    break;
+                
+                case Analytics.EventRadsClick:
+                    Analytics.ADRadsClick(data.BuildEventAdClickData());
+                    break;
+                
+                case Analytics.EventRadsRewarded:
+                    Analytics.ADRadsRewarded(data.BuildEventAdRewardedData());
+                    break;
+                
+                case Analytics.EventRadsPaid:
+                    // RADS 收入事件
+                    Analytics.ADRadsPaid(data.BuildEventAdPaidData());
+                    _onReportAdsRevenue?.Invoke(data);
+                    break;
+
+            }
+        }
+        
+
+
+
+
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionDriver.cs.meta b/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionDriver.cs.meta
new file mode 100644
index 0000000..d7a2088
--- /dev/null
+++ b/Runtime/GuruCore/Runtime/Ads/Data/AdImpressionDriver.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 7194cdd8ed1447508011264371e2c23d
+timeCreated: 1722313472
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Analytics/AdImpressionData.cs b/Runtime/GuruCore/Runtime/Analytics/AdImpressionData.cs
deleted file mode 100644
index d78a8c7..0000000
--- a/Runtime/GuruCore/Runtime/Analytics/AdImpressionData.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-using System.Collections.Generic;
-
-namespace Guru
-{
-    using System;
-    
-    /// 
-    /// AdImpression 对象
-    /// 
-    public class AdImpressionData
-    {
-        public double value;
-        public string currency = "USD";
-        public string ad_platform = "MAX";
-        public string ad_source;
-        public string ad_format;
-        public string ad_unit_name;
-        public string ad_placement;
-        public string ad_creative_id;
-        public string review_creative_id;
-
-        public DateTime createTime;
-
-        public AdImpressionData()
-        {
-            createTime = DateTime.UtcNow;
-        }
-
-        /// 
-        /// 获取自创建开始经过的秒数
-        /// 
-        /// 
-        public double GetPassedSecond()
-        {
-            return (DateTime.UtcNow - createTime).TotalSeconds;
-        }
-
-
-        public Dictionary BuildEventData()
-        {
-            var data = new Dictionary()
-            {
-                { "value", value },
-                { "currency", currency },
-                { "ad_platform", ad_platform },
-                { "ad_format", ad_format },
-                { "ad_source", ad_source },
-                { "ad_unit_name", ad_unit_name },
-                { "ad_placement", ad_placement },
-                { "ad_creative_id", ad_creative_id },
-                { "review_creative_id", review_creative_id },
-            };
-            
-            return data;
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.Ads.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.Ads.cs
index 3009471..1b855dc 100644
--- a/Runtime/GuruCore/Runtime/Analytics/Analytics.Ads.cs
+++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.Ads.cs
@@ -142,7 +142,12 @@ namespace Guru
 		/// 
 		public static void ADIadsImp(AdParams adParams)
 		{
-			TrackEvent(EventIadsImp, BuildAdEventData(adParams));
+			ADIadsImp(BuildAdEventData(adParams));
+		}
+		
+		public static void ADIadsImp(Dictionary data)
+		{
+			TrackEvent(EventIadsImp, data);
 		}
 
 		/// 
@@ -163,7 +168,12 @@ namespace Guru
 		/// 
 		public static void ADIadsClose(AdParams adParams)
 		{
-			TrackEvent(EventIadsClose, BuildAdEventData(adParams));
+			ADIadsClose(BuildAdEventData(adParams));
+		}
+		
+		public static void ADIadsClose(Dictionary data)
+		{
+			TrackEvent(EventIadsClose, data);
 		}
 		
 		/// 
@@ -202,8 +212,16 @@ namespace Guru
 		/// 
 		public static void ADRadsImp(AdParams adParams)
 		{
-			TrackEvent(EventRadsImp, BuildAdEventData(adParams));
+			ADRadsImp(BuildAdEventData(adParams));
 		}
+		
+		public static void ADRadsImp(Dictionary data)
+		{
+			TrackEvent(EventRadsImp, data);
+		}
+		
+		
+		
 		/// 
 		/// 广告完成观看发奖励
 		/// 
@@ -265,7 +283,12 @@ namespace Guru
 		/// 
 		public static void ADRadsClose(AdParams adParams)
 		{
-			TrackEvent(EventRadsClose, BuildAdEventData(adParams));
+			ADRadsClose( BuildAdEventData(adParams));
+		}
+		
+		public static void ADRadsClose(Dictionary data)
+		{
+			TrackEvent(EventRadsClose, data);
 		}
 	    #endregion
         	
diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs
index f236857..20b2249 100644
--- a/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs
+++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs
@@ -11,118 +11,119 @@ namespace Guru
 	//打点常量定义
 	public static partial class Analytics
 	{
-		public static readonly string TAG = "Analytics";
+		public const string TAG = "Analytics";
 		// 美元符号
-		public static readonly string USD = "USD"; 
+		public const string USD = "USD"; 
 		// 广告平台
-		public static readonly string AdMAX = "MAX";
-		public static readonly string AdIronSource = "IronSource";
+		public const string AdMAX = "MAX";
+		public const string AdIronSource = "IronSource";
 		
 		//IAP打点事件
-		public static readonly string EventIAPFirst = "first_iap";
-		public static readonly string EventIAPImp = "iap_imp";
-		public static readonly string EventIAPClose = "iap_close";
-		public static readonly string EventIAPClick = "iap_clk";
-		public static readonly string EventIAPReturnTrue = "iap_ret_true";
-		public static readonly string EventIAPReturnFalse = "iap_ret_false";
+		public const string EventIAPFirst = "first_iap";
+		public const string EventIAPImp = "iap_imp";
+		public const string EventIAPClose = "iap_close";
+		public const string EventIAPClick = "iap_clk";
+		public const string EventIAPReturnTrue = "iap_ret_true";
+		public const string EventIAPReturnFalse = "iap_ret_false";
 		
 		// 关卡打点
-		public static readonly string EventLevelFirstEnd = "level_first_end";
+		public const string EventLevelFirstEnd = "level_first_end";
 		
 		//横幅广告打点事件
-		public static readonly string EventBadsLoad = "bads_load";
-		public static readonly string EventBadsLoaded = "bads_loaded";
-		public static readonly string EventBadsFailed = "bads_failed";
-		public static readonly string EventBadsClick = "bads_clk";
-		public static readonly string EventBadsImp = "bads_imp";
-		public static readonly string EventBadsHide = "bads_hide";
+		public const string EventBadsLoad = "bads_load";
+		public const string EventBadsLoaded = "bads_loaded";
+		public const string EventBadsFailed = "bads_failed";
+		public const string EventBadsClick = "bads_clk";
+		public const string EventBadsImp = "bads_imp";
+		public const string EventBadsHide = "bads_hide";
+		public const string EventBadsPaid = "bads_paid";
 
 		//插屏广告打点事件
-		public static readonly string EventIadsLoad = "iads_load";
-		public static readonly string EventIadsLoaded = "iads_loaded";
-		public static readonly string EventIadsFailed = "iads_failed";
-		public static readonly string EventIadsImp = "iads_imp";
-		public static readonly string EventIadsClick = "iads_clk";
-		public static readonly string EventIadsPaid = "iads_paid";
-		public static readonly string EventIadsClose = "iads_close";
+		public const string EventIadsLoad = "iads_load";
+		public const string EventIadsLoaded = "iads_loaded";
+		public const string EventIadsFailed = "iads_failed";
+		public const string EventIadsImp = "iads_imp";
+		public const string EventIadsClick = "iads_clk";
+		public const string EventIadsClose = "iads_close";
+		public const string EventIadsPaid = "iads_paid";
     
 		//激励视频广告打点事件
-		public static readonly string EventRadsLoad = "rads_load";
-		public static readonly string EventRadsLoaded = "rads_loaded";
-		public static readonly string EventRadsFailed = "rads_failed";
-		public static readonly string EventRadsImp = "rads_imp";
-		public static readonly string EventRadsRewarded = "rads_rewarded";
-		public static readonly string EventRadsClick = "rads_clk";
-		public static readonly string EventRadsPaid = "rads_paid";
-		public static readonly string EventRadsClose = "rads_close";
-		public static readonly string EventFirstRadsRewarded = "first_rads_rewarded";
+		public const string EventRadsLoad = "rads_load";
+		public const string EventRadsLoaded = "rads_loaded";
+		public const string EventRadsFailed = "rads_failed";
+		public const string EventRadsImp = "rads_imp";
+		public const string EventRadsRewarded = "rads_rewarded";
+		public const string EventRadsClick = "rads_clk";
+		public const string EventRadsClose = "rads_close";
+		public const string EventRadsPaid = "rads_paid";
+		public const string EventFirstRadsRewarded = "first_rads_rewarded";
 		
 		//广告收益打点事件
-		public static readonly string EventTchAdRev001Impression = "tch_ad_rev_roas_001";
-		public static readonly string EventTchAdRev02Impression = "tch_ad_rev_roas_02";
-		public static readonly string EventTchAdRevAbnormal = "tch_ad_rev_value_abnormal";
+		public const string EventTchAdRev001Impression = "tch_ad_rev_roas_001";
+		public const string EventTchAdRev02Impression = "tch_ad_rev_roas_02";
+		public const string EventTchAdRevAbnormal = "tch_ad_rev_value_abnormal";
 		
 		
 		//内购成功事件上报
-		public static readonly string EventIAPPurchase = "iap_purchase";
-		public static readonly string EventSubPurchase = "sub_purchase";
-		public static readonly string IAPStoreCategory = "Store";
-		public static readonly string IAPTypeProduct = "product";
-		public static readonly string IAPTypeSubscription = "subscription";
+		public const string EventIAPPurchase = "iap_purchase";
+		public const string EventSubPurchase = "sub_purchase";
+		public const string IAPStoreCategory = "Store";
+		public const string IAPTypeProduct = "product";
+		public const string IAPTypeSubscription = "subscription";
 		
 		//打点参数名
-		public static readonly string ParameterResult = "result";
-		public static readonly string ParameterStep = "step";
-		public static readonly string ParameterDuration = "duration";
-		public static readonly string ParameterErrorCode = "error_code";
-		public static readonly string ParameterProductId = "product_id";
-		public static readonly string ParameterPlatform = "platform";
-		public static readonly string ParameterStartType = "start_type"; // 游戏启动类型
-		public static readonly string ParameterReplay =  "replay"; // 游戏重玩
-		public static readonly string ParameterContinue = "continue"; // 游戏继续
-		public static readonly string ParameterAdUnitName = "ad_unit_name";
-		public static readonly string ParameterAdPlacement = "ad_placement";
-		public static readonly string ParameterAdCreativeId = "ad_creative_id";
-		public static readonly string ParameterReviewCreativeId = "review_creative_id";
+		public const string ParameterResult = "result";
+		public const string ParameterStep = "step";
+		public const string ParameterDuration = "duration";
+		public const string ParameterErrorCode = "error_code";
+		public const string ParameterProductId = "product_id";
+		public const string ParameterPlatform = "platform";
+		public const string ParameterStartType = "start_type"; // 游戏启动类型
+		public const string ParameterReplay =  "replay"; // 游戏重玩
+		public const string ParameterContinue = "continue"; // 游戏继续
+		public const string ParameterAdUnitName = "ad_unit_name";
+		public const string ParameterAdPlacement = "ad_placement";
+		public const string ParameterAdCreativeId = "ad_creative_id";
+		public const string ParameterReviewCreativeId = "review_creative_id";
 		
 		
 		// 评价参数
-		public static readonly string EventRateImp = "rate_imp"; // 评价弹窗展示
-		public static readonly string EventRateNow = "rate_now"; // 点击评分引导弹窗中的评分
+		public const string EventRateImp = "rate_imp"; // 评价弹窗展示
+		public const string EventRateNow = "rate_now"; // 点击评分引导弹窗中的评分
 		
 		//打点内部执行错误
 		public static string ParameterEventError => "event_error";
 		
 		//ios ATT打点
-		public static readonly string ATTGuideShow = "att_guide_show";
-		public static readonly string ATTGuideOK = "att_guide_ok";
-		public static readonly string ATTWindowShow = "att_window_show";
-		public static readonly string ATTOptIn = "att_opt_in";
-		public static readonly string ATTOpOut = "att_opt_out";
-		public static readonly string ParameterATTStatus = "att_status";
-		public static readonly string EventATTResult = "att_result";
+		public const string ATTGuideShow = "att_guide_show";
+		public const string ATTGuideOK = "att_guide_ok";
+		public const string ATTWindowShow = "att_window_show";
+		public const string ATTOptIn = "att_opt_in";
+		public const string ATTOpOut = "att_opt_out";
+		public const string ParameterATTStatus = "att_status";
+		public const string EventATTResult = "att_result";
 		
 		// 用户属性
-		public static readonly string PropertyFirstOpenTime = "first_open_time"; 		//用户第一次first_open的时间
-		public static readonly string PropertyDeviceID = "device_id"; //用户的设备ID
-		public static readonly string PropertyUserID = "user_id";
-		public static readonly string PropertyLevel = "b_level"; //"每次完成通关上升一次,显示用户完成的最大关卡数。只针对主关卡和主玩法的局数做累加,初始值为0。"
-		public static readonly string PropertyPlay = "b_play"; //每完成一局或者游戏触发,
-		public static readonly string PropertyLastPlayedLevel = "last_played_level";
-		public static readonly string PropertyGrade = "grade"; //当游戏玩家角色升级时触发
-		public static readonly string PropertyIsIAPUser = "is_iap_user"; 		//付费成功后设置属性参数为true,如果没有发生付费可以不用设置该属性
-		public static readonly string PropertyIAPCoin = "iap_coin"; //付费所得的总金币数(iap获取累计值)\
-		public static readonly string PropertyNonIAPCoin = "noniap_coin"; //非付费iap获取累计值
-		public static readonly string PropertyCoin = "coin"; //当前金币数
-		public static readonly string PropertyExp = "exp"; // 经验值
-		public static readonly string PropertyHp = "hp"; // 生命值/体力
-		public static readonly string PropertyAndroidID = "android_id"; // Android 平台 AndroidID
-		public static readonly string PropertyIDFV = "idfv"; // iOS  平台 IDFV
-		public static readonly string PropertyIDFA = "idfa"; // iOS  平台 IDFA
-		public static readonly string PropertyPicture = "picture"; // 玩家在主线的mapid
-		public static readonly string PropertyNoAds = "no_ads"; // 玩家是否去广告
-		public static readonly string PropertyATTStatus = "att_status";  // ATT 状态
-		public static readonly string PropertyGDPR = "gdpr"; // GDPR状态
+		public const string PropertyFirstOpenTime = "first_open_time"; 		//用户第一次first_open的时间
+		public const string PropertyDeviceID = "device_id"; //用户的设备ID
+		public const string PropertyUserID = "user_id";
+		public const string PropertyLevel = "b_level"; //"每次完成通关上升一次,显示用户完成的最大关卡数。只针对主关卡和主玩法的局数做累加,初始值为0。"
+		public const string PropertyPlay = "b_play"; //每完成一局或者游戏触发,
+		public const string PropertyLastPlayedLevel = "last_played_level";
+		public const string PropertyGrade = "grade"; //当游戏玩家角色升级时触发
+		public const string PropertyIsIAPUser = "is_iap_user"; 		//付费成功后设置属性参数为true,如果没有发生付费可以不用设置该属性
+		public const string PropertyIAPCoin = "iap_coin"; //付费所得的总金币数(iap获取累计值)\
+		public const string PropertyNonIAPCoin = "noniap_coin"; //非付费iap获取累计值
+		public const string PropertyCoin = "coin"; //当前金币数
+		public const string PropertyExp = "exp"; // 经验值
+		public const string PropertyHp = "hp"; // 生命值/体力
+		public const string PropertyAndroidID = "android_id"; // Android 平台 AndroidID
+		public const string PropertyIDFV = "idfv"; // iOS  平台 IDFV
+		public const string PropertyIDFA = "idfa"; // iOS  平台 IDFA
+		public const string PropertyPicture = "picture"; // 玩家在主线的mapid
+		public const string PropertyNoAds = "no_ads"; // 玩家是否去广告
+		public const string PropertyATTStatus = "att_status";  // ATT 状态
+		public const string PropertyGDPR = "gdpr"; // GDPR状态
 		
 		// 经济相关
 		public const string ParameterBalance = "balance"; // 用于余额
@@ -130,6 +131,6 @@ namespace Guru
 		public const string ParameterVirtualCurrencyName = "virtual_currency_name"; // 虚拟货币名称
 		
 		// 中台
-		public static readonly string EventDevAudit = "dev_audit"; // 中台事件异常
+		public const string EventDevAudit = "dev_audit"; // 中台事件异常
 	}
 }
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.FirebaseDefine.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.FirebaseDefine.cs
index 2cfffdb..a34d3e4 100644
--- a/Runtime/GuruCore/Runtime/Analytics/Analytics.FirebaseDefine.cs
+++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.FirebaseDefine.cs
@@ -5,104 +5,104 @@ namespace Guru
 	//Firebase内置定义事件名称和参数名称
 	public static partial class Analytics
 	{
-		internal static readonly string EventAdImpression = "ad_impression";
-		internal static readonly string EventAddPaymentInfo = "add_payment_info";
-		internal static readonly string EventAddShippingInfo = "add_shipping_info";
-		internal static readonly string EventAddToCart = "add_to_cart";
-		internal static readonly string EventAddToWishlist = "add_to_wishlist";
-		internal static readonly string EventAppOpen = "app_open";
-		internal static readonly string EventBeginCheckout = "begin_checkout";
-		internal static readonly string EventCampaignDetails = "campaign_details";
-		internal static readonly string EventEarnVirtualCurrency = "earn_virtual_currency";
-		internal static readonly string EventGenerateLead = "generate_lead";
-		internal static readonly string EventJoinGroup = "join_group";
-		internal static readonly string EventLevelEnd = "level_end";
-		internal static readonly string EventLevelStart = "level_start";
-		internal static readonly string EventLevelUp = "level_up";
-		internal static readonly string EventLogin = "login";
-		internal static readonly string EventPostScore = "post_score";
-		internal static readonly string EventPurchase = "purchase";
-		internal static readonly string EventRefund = "refund";
-		internal static readonly string EventRemoveFromCart = "remove_from_cart";
-		internal static readonly string EventScreenView = "screen_view";
-		internal static readonly string EventSearch = "search";
-		internal static readonly string EventSelectContent = "select_content";
-		internal static readonly string EventSelectItem = "select_item";
-		internal static readonly string EventSelectPromotion = "select_promotion";
-		internal static readonly string EventShare = "share";
-		internal static readonly string EventSignUp = "sign_up";
-		internal static readonly string EventSpendVirtualCurrency = "spend_virtual_currency";
-		internal static readonly string EventTutorialBegin = "tutorial_begin";
-		internal static readonly string EventTutorialComplete = "tutorial_complete";
-		internal static readonly string EventUnlockAchievement = "unlock_achievement";
-		internal static readonly string EventViewCart = "view_cart";
-		internal static readonly string EventViewItem = "view_item";
-		internal static readonly string EventViewItemList = "view_item_list";
-		internal static readonly string EventViewPromotion = "view_promotion";
-		internal static readonly string EventViewSearchResults = "view_search_results";
-		internal static readonly string ParameterAchievementId = "achievement_id";
-		internal static readonly string ParameterAdFormat = "ad_format";
-		internal static readonly string ParameterAdNetworkClickID = "aclid";
-		internal static readonly string ParameterAdPlatform = "ad_platform";
-		internal static readonly string ParameterAdSource = "ad_source";
+		internal const string EventAdImpression = "ad_impression";
+		internal const string EventAddPaymentInfo = "add_payment_info";
+		internal const string EventAddShippingInfo = "add_shipping_info";
+		internal const string EventAddToCart = "add_to_cart";
+		internal const string EventAddToWishlist = "add_to_wishlist";
+		internal const string EventAppOpen = "app_open";
+		internal const string EventBeginCheckout = "begin_checkout";
+		internal const string EventCampaignDetails = "campaign_details";
+		internal const string EventEarnVirtualCurrency = "earn_virtual_currency";
+		internal const string EventGenerateLead = "generate_lead";
+		internal const string EventJoinGroup = "join_group";
+		internal const string EventLevelEnd = "level_end";
+		internal const string EventLevelStart = "level_start";
+		internal const string EventLevelUp = "level_up";
+		internal const string EventLogin = "login";
+		internal const string EventPostScore = "post_score";
+		internal const string EventPurchase = "purchase";
+		internal const string EventRefund = "refund";
+		internal const string EventRemoveFromCart = "remove_from_cart";
+		internal const string EventScreenView = "screen_view";
+		internal const string EventSearch = "search";
+		internal const string EventSelectContent = "select_content";
+		internal const string EventSelectItem = "select_item";
+		internal const string EventSelectPromotion = "select_promotion";
+		internal const string EventShare = "share";
+		internal const string EventSignUp = "sign_up";
+		internal const string EventSpendVirtualCurrency = "spend_virtual_currency";
+		internal const string EventTutorialBegin = "tutorial_begin";
+		internal const string EventTutorialComplete = "tutorial_complete";
+		internal const string EventUnlockAchievement = "unlock_achievement";
+		internal const string EventViewCart = "view_cart";
+		internal const string EventViewItem = "view_item";
+		internal const string EventViewItemList = "view_item_list";
+		internal const string EventViewPromotion = "view_promotion";
+		internal const string EventViewSearchResults = "view_search_results";
+		internal const string ParameterAchievementId = "achievement_id";
+		internal const string ParameterAdFormat = "ad_format";
+		internal const string ParameterAdNetworkClickID = "aclid";
+		internal const string ParameterAdPlatform = "ad_platform";
+		internal const string ParameterAdSource = "ad_source";
 		
-		internal static readonly string ParameterAffiliation = "affiliation";
-		internal static readonly string ParameterCP1 = "cp1";
-		internal static readonly string ParameterCampaign =  "campaign";
-		internal static readonly string ParameterCharacter = "character";
-		internal static readonly string ParameterContent = "content";
-		internal static readonly string ParameterContentType = "content_type";
-		internal static readonly string ParameterCoupon = "coupon";
-		internal static readonly string ParameterCreativeName = "creative_name";
-		internal static readonly string ParameterCreativeSlot = "creative_slot";
-		internal static readonly string ParameterCurrency = "currency";
-		internal static readonly string ParameterDestination = "destination";
-		internal static readonly string ParameterDiscount = "discount";
-		internal static readonly string ParameterEndDate = "end_date";
-		internal static readonly string ParameterExtendSession = "extend_session";
-		internal static readonly string ParameterFlightNumber =  "flight_number";
-		internal static readonly string ParameterGroupId = "group_id";
-		internal static readonly string ParameterIndex = "index";
-		internal static readonly string ParameterItemBrand =  "item_brand";
-		internal static readonly string ParameterItemCategory = "item_category";
-		internal static readonly string ParameterItemCategory2 = "item_category2";
-		internal static readonly string ParameterItemCategory3 = "item_category3";
-		internal static readonly string ParameterItemCategory4 = "item_category4";
-		internal static readonly string ParameterItemCategory5 = "item_category5";
-		internal static readonly string ParameterItemId = "item_id";
-		internal static readonly string ParameterItemList = "item_list";
-		internal static readonly string ParameterItemListID = "item_list_id";
-		internal static readonly string ParameterItemListName = "item_list_name";
-		internal static readonly string ParameterItemName = "item_name";
-		internal static readonly string ParameterLevel =  "level";
-		internal static readonly string ParameterLevelName = "level_name";
-		internal static readonly string ParameterLocation = "location";
-		internal static readonly string ParameterLocationID = "location_id";
-		internal static readonly string ParameterMedium =  "medium";
-		internal static readonly string ParameterMethod = "method";
-		internal static readonly string ParameterNumberOfNights = "number_of_nights";
-		internal static readonly string ParameterNumberOfPassengers = "number_of_passengers";
-		internal static readonly string ParameterNumberOfRooms = "number_of_rooms";
-		internal static readonly string ParameterOrigin = "origin";
-		internal static readonly string ParameterPaymentType = "payment_type";
-		internal static readonly string ParameterPrice = "price";
-		internal static readonly string ParameterPromotionID = "promotion_id";
-		internal static readonly string ParameterPromotionName = "promotion_name";
-		internal static readonly string ParameterQuantity = "quantity";
-		internal static readonly string ParameterScore = "score";
-		internal static readonly string ParameterScreenClass = "screen_class";
-		internal static readonly string ParameterScreenName = "screen_name";
-		internal static readonly string ParameterSearchTerm = "search_term";
-		internal static readonly string ParameterShipping = "shipping";
-		internal static readonly string ParameterShippingTier = "shipping_tier";
-		internal static readonly string ParameterSignUpMethod =  "sign_up_method";
-		internal static readonly string ParameterSource = "source";
-		internal static readonly string ParameterStartDate = "start_date";
-		internal static readonly string ParameterSuccess = "success";
-		internal static readonly string ParameterTax = "tax";
-		internal static readonly string ParameterTerm = "term";
-		internal static readonly string ParameterTransactionId = "transaction_id";
-		internal static readonly string ParameterTravelClass = "travel_class";
-		internal static readonly string ParameterValue = "value"; 
+		internal const string ParameterAffiliation = "affiliation";
+		internal const string ParameterCP1 = "cp1";
+		internal const string ParameterCampaign =  "campaign";
+		internal const string ParameterCharacter = "character";
+		internal const string ParameterContent = "content";
+		internal const string ParameterContentType = "content_type";
+		internal const string ParameterCoupon = "coupon";
+		internal const string ParameterCreativeName = "creative_name";
+		internal const string ParameterCreativeSlot = "creative_slot";
+		internal const string ParameterCurrency = "currency";
+		internal const string ParameterDestination = "destination";
+		internal const string ParameterDiscount = "discount";
+		internal const string ParameterEndDate = "end_date";
+		internal const string ParameterExtendSession = "extend_session";
+		internal const string ParameterFlightNumber =  "flight_number";
+		internal const string ParameterGroupId = "group_id";
+		internal const string ParameterIndex = "index";
+		internal const string ParameterItemBrand =  "item_brand";
+		internal const string ParameterItemCategory = "item_category";
+		internal const string ParameterItemCategory2 = "item_category2";
+		internal const string ParameterItemCategory3 = "item_category3";
+		internal const string ParameterItemCategory4 = "item_category4";
+		internal const string ParameterItemCategory5 = "item_category5";
+		internal const string ParameterItemId = "item_id";
+		internal const string ParameterItemList = "item_list";
+		internal const string ParameterItemListID = "item_list_id";
+		internal const string ParameterItemListName = "item_list_name";
+		internal const string ParameterItemName = "item_name";
+		internal const string ParameterLevel =  "level";
+		internal const string ParameterLevelName = "level_name";
+		internal const string ParameterLocation = "location";
+		internal const string ParameterLocationID = "location_id";
+		internal const string ParameterMedium =  "medium";
+		internal const string ParameterMethod = "method";
+		internal const string ParameterNumberOfNights = "number_of_nights";
+		internal const string ParameterNumberOfPassengers = "number_of_passengers";
+		internal const string ParameterNumberOfRooms = "number_of_rooms";
+		internal const string ParameterOrigin = "origin";
+		internal const string ParameterPaymentType = "payment_type";
+		internal const string ParameterPrice = "price";
+		internal const string ParameterPromotionID = "promotion_id";
+		internal const string ParameterPromotionName = "promotion_name";
+		internal const string ParameterQuantity = "quantity";
+		internal const string ParameterScore = "score";
+		internal const string ParameterScreenClass = "screen_class";
+		internal const string ParameterScreenName = "screen_name";
+		internal const string ParameterSearchTerm = "search_term";
+		internal const string ParameterShipping = "shipping";
+		internal const string ParameterShippingTier = "shipping_tier";
+		internal const string ParameterSignUpMethod =  "sign_up_method";
+		internal const string ParameterSource = "source";
+		internal const string ParameterStartDate = "start_date";
+		internal const string ParameterSuccess = "success";
+		internal const string ParameterTax = "tax";
+		internal const string ParameterTerm = "term";
+		internal const string ParameterTransactionId = "transaction_id";
+		internal const string ParameterTravelClass = "travel_class";
+		internal const string ParameterValue = "value"; 
 	}
 }
\ No newline at end of file
diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.TemplateDefine.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.TemplateDefine.cs
index 1f4b2b0..57b3b93 100644
--- a/Runtime/GuruCore/Runtime/Analytics/Analytics.TemplateDefine.cs
+++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.TemplateDefine.cs
@@ -6,6 +6,7 @@ namespace Guru
 	using System.Collections.Generic;
 	using Facebook.Unity;
 	using UnityEngine;
+	using Guru.Ads;
 	
 	//游戏通用模版打点定义
     public static partial class Analytics