update: 重构 AdImpressionData 用于记录相关的数据

Signed-off-by: huyufei <yufei.hu@castbox.fm>
dev
胡宇飞 2024-07-30 15:45:48 +08:00
parent 23eb7ff7b4
commit a67185679b
12 changed files with 776 additions and 453 deletions

View File

@ -370,24 +370,22 @@ namespace Guru
/// <summary> /// <summary>
/// 广告收入上报 (Adjust 特有的接口) /// 广告收入上报 (Adjust 特有的接口)
/// </summary> /// </summary>
/// <param name="adInfo"></param> /// <param name="value"></param>
public static void TrackADRevenue(AdImpressionData impressionData) /// <param name="currency"></param>
/// <param name="adSource"></param>
/// <param name="adUnitId"></param>
/// <param name="adPlacement"></param>
public static void TrackADRevenue(double value, string currency, string adSource, string adUnitId, string adPlacement)
{ {
if (impressionData == null)
return;
var adRevenue = new AdjustAdRevenue(AdjustConfig.AdjustAdRevenueSourceAppLovinMAX); var adRevenue = new AdjustAdRevenue(AdjustConfig.AdjustAdRevenueSourceAppLovinMAX);
adRevenue.setRevenue(impressionData.value, "USD"); if (string.IsNullOrEmpty(currency)) currency = "USD";
adRevenue.setAdRevenueNetwork(impressionData.ad_source); adRevenue.setRevenue(value, currency);
adRevenue.setAdRevenueUnit(impressionData.ad_unit_name); adRevenue.setAdRevenueNetwork(adSource);
adRevenue.setAdRevenuePlacement(impressionData.ad_placement); adRevenue.setAdRevenueUnit(adUnitId);
adRevenue.setAdRevenuePlacement(adPlacement);
Adjust.trackAdRevenue(adRevenue); Adjust.trackAdRevenue(adRevenue);
} }
#endregion #endregion
#region 关键属性上报 #region 关键属性上报

View File

@ -5,6 +5,7 @@ namespace Guru
using System; using System;
using UnityEngine; using UnityEngine;
using System.Collections.Generic; using System.Collections.Generic;
using Guru.Ads;
public abstract class ADServiceBase<T> : IADService where T : new() public abstract class ADServiceBase<T> : IADService where T : new()
{ {
@ -44,11 +45,13 @@ namespace Guru
public static Action OnRewardClosed; public static Action OnRewardClosed;
private Dictionary<string, string> _reviewCreativeIds = new Dictionary<string, string>(10); // Creative ID 缓存: Cid : RCid private Dictionary<string, string> _reviewCreativeIds = new Dictionary<string, string>(10); // Creative ID 缓存: Cid : RCid
private Dictionary<string, AdImpressionData> _impressionCache = new Dictionary<string, AdImpressionData>(10); private Dictionary<string, List<AdImpressionData>> _impressionCache = new Dictionary<string, List<AdImpressionData>>(10);
protected AdsModel _model; protected AdsModel _model;
protected AdsInitSpec _initSpec = null; protected AdsInitSpec _initSpec = null;
private AdImpressionDriver _impressionDriver;
public AdsModel Model public AdsModel Model
{ {
get get
@ -79,6 +82,9 @@ namespace Guru
if(_model == null) _model = AdsModel.Create(); if(_model == null) _model = AdsModel.Create();
this.Log("AD SDK Start Init"); this.Log("AD SDK Start Init");
_impressionDriver = new AdImpressionDriver();
_impressionDriver.Init(ReportAdsRevenue); // 初始化 Impression 驱动器
InitMaxCallbacks(); // 初始化 MAX 广告 InitMaxCallbacks(); // 初始化 MAX 广告
InitService(); // 内部继承接口 InitService(); // 内部继承接口
} }
@ -90,15 +96,15 @@ namespace Guru
{ {
//-------------- 初始化回调 ------------------ //-------------- 初始化回调 ------------------
MaxSdkCallbacks.OnSdkInitializedEvent += OnMaxSdkInitializedCallBack; 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 回调 ----------------- //--------------- Banner 回调 -----------------
MaxSdkCallbacks.Banner.OnAdLoadedEvent += OnBannerLoadedEvent; MaxSdkCallbacks.Banner.OnAdLoadedEvent += OnBannerLoadedEvent;
MaxSdkCallbacks.Banner.OnAdLoadFailedEvent += OnBannerFailedEvent; MaxSdkCallbacks.Banner.OnAdLoadFailedEvent += OnBannerFailedEvent;
MaxSdkCallbacks.Banner.OnAdClickedEvent += OnBannerClickedEvent; MaxSdkCallbacks.Banner.OnAdClickedEvent += OnBannerClickedEvent;
MaxSdkCallbacks.Banner.OnAdRevenuePaidEvent += OnBannerRevenuePaidEvent;
MaxSdkCallbacks.Banner.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent; MaxSdkCallbacks.Banner.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent;
//--------------- IV 回调 ----------------- //--------------- IV 回调 -----------------
MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialLoadedEvent; MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialLoadedEvent;
@ -107,6 +113,7 @@ namespace Guru
MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnInterstitialClickEvent; MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnInterstitialClickEvent;
MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialDisplayEvent; MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialDisplayEvent;
MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialDismissedEvent; MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialDismissedEvent;
MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnInterstitialPaidEvent;
MaxSdkCallbacks.Interstitial.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent; MaxSdkCallbacks.Interstitial.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent;
//--------------- RV 回调 ----------------- //--------------- RV 回调 -----------------
MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnRewardedAdLoadedEvent; MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnRewardedAdLoadedEvent;
@ -116,6 +123,7 @@ namespace Guru
MaxSdkCallbacks.Rewarded.OnAdClickedEvent += OnRewardedAdClickedEvent; MaxSdkCallbacks.Rewarded.OnAdClickedEvent += OnRewardedAdClickedEvent;
MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnRewardedAdDismissedEvent; MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnRewardedAdDismissedEvent;
MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent += OnRewardedAdReceivedRewardEvent; MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent += OnRewardedAdReceivedRewardEvent;
MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnRewardedAdPaidEvent;
MaxSdkCallbacks.Rewarded.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent; MaxSdkCallbacks.Rewarded.OnAdReviewCreativeIdGeneratedEvent += OnAdReviewCreativeIdGeneratedEvent;
//--------------- Creative 回调 ----------------- //--------------- Creative 回调 -----------------
@ -126,6 +134,8 @@ namespace Guru
MaxSdk.SetExtraParameter("enable_black_screen_fixes", "true"); // 修复黑屏 MaxSdk.SetExtraParameter("enable_black_screen_fixes", "true"); // 修复黑屏
} }
protected virtual void InitService() protected virtual void InitService()
{ {
} }
@ -206,88 +216,22 @@ namespace Guru
/// </summary> /// </summary>
/// <param name="adInfo"></param> /// <param name="adInfo"></param>
/// <param name="reviewedCreativeId"></param> /// <param name="reviewedCreativeId"></param>
private void ReportAdsRevenue(AdImpressionData impressionData) private void ReportAdsRevenue(AdImpressionData data)
{ {
// #1 ad_impression // #1 ad_impression
Analytics.ADImpression(impressionData); Analytics.ADImpression(data);
// #2 tch_001 // #2 tch_001 和 tch_02
double revenue = impressionData.value; double revenue = data.value;
CalcTch001Value(revenue); CalcTch001Value(revenue);
CalcTch02Value(revenue); CalcTch02Value(revenue);
// #3 adjust_ad_revenue // #3 adjust_ad_revenue
AdjustService.TrackADRevenue(impressionData); AdjustService.TrackADRevenue(data.value, data.currency, data.ad_source, data.ad_unit_name, data.ad_placement);
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);
}
} }
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);
}
}
/// <summary>
/// 构建 Impression 数据
/// </summary>
/// <param name="adInfo"></param>
/// <param name="reviewCreativeId"></param>
/// <param name="platform"></param>
/// <returns></returns>
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;
}
/// <summary> /// <summary>
@ -339,7 +283,6 @@ namespace Guru
private int _badsloadedNum = 0; private int _badsloadedNum = 0;
private int _badsLoadFailNum = 0; private int _badsLoadFailNum = 0;
/// <summary> /// <summary>
/// 获取动作间隔之间的毫秒数 /// 获取动作间隔之间的毫秒数
/// </summary> /// </summary>
@ -495,7 +438,8 @@ namespace Guru
{ {
if (_bannerVisible) 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, Analytics.ADIadsFailed(AdParams.Build(adUnitId,
duration: GetActionDuration(_iadsDisplayStartTime), category: _iadsCategory, duration: GetActionDuration(_iadsDisplayStartTime), category: _iadsCategory,
errorCode: (int)errorInfo.Code, errorCode: (int)errorInfo.Code,
waterfallName: errorInfo?.WaterfallInfo?.Name ?? "")); waterfallName: errorInfo.WaterfallInfo?.Name ?? ""));
DelayCall(2.0f, RequestInterstitialAD); DelayCall(2.0f, RequestInterstitialAD);
} }
@ -625,20 +569,16 @@ namespace Guru
protected virtual void OnInterstitialDisplayEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) protected virtual void OnInterstitialDisplayEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
{ {
// Analytics.ADIadsImp(adUnitId, _iadsCategory); // Analytics.ADIadsImp(adUnitId, _iadsCategory);
string reviewCreativeId = GetReviewCreativeId(adInfo.CreativeIdentifier); AppendImpressionData(adInfo, eventName:Analytics.EventIadsImp, itemCategory:_iadsCategory);
Analytics.ADIadsImp(AdParams.Build(adUnitId, adInfo, category: _iadsCategory, reviewCreativeId:reviewCreativeId));
} }
protected virtual void OnInterstitialClickEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) protected virtual void OnInterstitialClickEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
{ {
// Analytics.ADIadsClick(adUnitId, _iadsCategory); // 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"; if(string.IsNullOrEmpty(_iadsCategory)) _iadsCategory = "not_set";
data["item_category"] = _iadsCategory; AppendImpressionData(adInfo,
data.Remove("ad_format"); eventName:Analytics.EventIadsClick,
Analytics.ADIadsClick(data); itemCategory:_iadsCategory);
} }
// Close // Close
@ -648,21 +588,21 @@ namespace Guru
_interCloseAction?.Invoke(); _interCloseAction?.Invoke();
OnInterstitialClosed?.Invoke(); OnInterstitialClosed?.Invoke();
// Analytics.ADIadsClose(adUnitId, _iadsCategory); // Analytics.ADIadsClose(adUnitId, _iadsCategory);
Analytics.ADIadsClose(AdParams.Build(adUnitId, Analytics.ADIadsClose(new Dictionary<string, object>()
duration:GetActionDuration(_iadsDisplayStartTime), {
category: _iadsCategory)); [Analytics.ParameterItemCategory] = _iadsCategory,
[Analytics.ParameterDuration] = GetActionDuration(_iadsDisplayStartTime),
});
_impressionDriver.CleanCreativeId(adInfo.CreativeIdentifier);
//延时加载下一个广告 //延时加载下一个广告
DelayCall(2.0f, RequestInterstitialAD); DelayCall(2.0f, RequestInterstitialAD);
} }
private void OnInterstitialPaidEvent(AdImpressionData impressionData) private void OnInterstitialPaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
{ {
var data = impressionData.BuildEventData(); AppendImpressionData(adInfo, eventName:Analytics.EventIadsPaid, itemCategory: _iadsCategory);
if(string.IsNullOrEmpty(_iadsCategory)) _iadsCategory = "not_set";
data["item_category"] = _iadsCategory;
data.Remove("ad_format");
Analytics.ADIadsPaid(data);
} }
@ -808,20 +748,14 @@ namespace Guru
{ {
this.Log("OnRewardedAdDisplayedEvent"); this.Log("OnRewardedAdDisplayedEvent");
// Analytics.ADRadsImp(adUnitId, _rewardCategory); // Analytics.ADRadsImp(adUnitId, _rewardCategory);
string reviewCreativeId = GetReviewCreativeId(adInfo.CreativeIdentifier); AppendImpressionData(adInfo, eventName:Analytics.EventRadsImp, itemCategory: _rewardCategory);
Analytics.ADRadsImp(AdParams.Build(adUnitId, adInfo, category: _rewardCategory, reviewCreativeId:reviewCreativeId));
} }
protected virtual void OnRewardedAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) protected virtual void OnRewardedAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
{ {
this.Log("OnRewardedAdClickedEvent"); this.Log("OnRewardedAdClickedEvent");
// Analytics.ADRadsClick(adUnitId, _rewardCategory); // Analytics.ADRadsClick(adUnitId, _rewardCategory);
var impressionData = CreateImpressionData(adInfo, GetReviewCreativeId(adInfo.CreativeIdentifier)); AppendImpressionData(adInfo, eventName:Analytics.EventRadsClick, itemCategory: _rewardCategory);
var data = impressionData.BuildEventData();
if(string.IsNullOrEmpty(_rewardCategory)) _rewardCategory = "not_set";
data["item_category"] = _rewardCategory;
data.Remove("ad_format");
Analytics.ADRadsClick(data);
} }
// rads_close // rads_close
@ -833,7 +767,13 @@ namespace Guru
OnRewardClosed?.Invoke(); OnRewardClosed?.Invoke();
// Analytics.ADRadsClose(adUnitId, _rewardCategory); // Analytics.ADRadsClose(adUnitId, _rewardCategory);
Analytics.ADRadsClose(AdParams.Build(adUnitId, duration:GetActionDuration(_radsShowStartTime), category: _rewardCategory)); Analytics.ADRadsClose(new Dictionary<string, object>()
{
[Analytics.ParameterItemCategory] = _rewardCategory,
[Analytics.ParameterDuration] = GetActionDuration(_radsShowStartTime),
});
_impressionDriver.CleanCreativeId(adInfo.CreativeIdentifier);
//延时加载下一个广告 //延时加载下一个广告
DelayCall(2.0f, RequestRewardedAD); DelayCall(2.0f, RequestRewardedAD);
@ -845,25 +785,18 @@ namespace Guru
{ {
this.Log("OnRewardedAdReceivedRewardEvent"); this.Log("OnRewardedAdReceivedRewardEvent");
// Analytics.ADRadsRewarded(adUnitId, _rewardCategory); // Analytics.ADRadsRewarded(adUnitId, _rewardCategory);
var impressionData = CreateImpressionData(adInfo, GetReviewCreativeId(adInfo.CreativeIdentifier)); AppendImpressionData(adInfo, eventName:Analytics.EventRadsRewarded, itemCategory: _rewardCategory);
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
_rvRewardAction?.Invoke(); _rvRewardAction?.Invoke();
} }
// rads_paid // rads_paid
private void OnRewardedAdPaidEvent(AdImpressionData impressionData) private void OnRewardedAdPaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
{ {
var data = impressionData.BuildEventData(); this.Log("OnRewardedAdReceivedRewardEvent");
if(string.IsNullOrEmpty(_rewardCategory)) _rewardCategory = "not_set"; AppendImpressionData(adInfo, eventName:Analytics.EventRadsPaid, itemCategory: _rewardCategory);
data["item_category"] = _rewardCategory;
data.Remove("ad_format");
Analytics.ADRadsPaid(data);
} }
#endregion #endregion
#region Ad Settings #region Ad Settings
@ -906,39 +839,54 @@ namespace Guru
#endregion #endregion
#region CreativeID #region ImpressionData
private string GetReviewCreativeId(string creativeId) const int MAX_BADS_CID_NUMBER = 6;
{ private List<string> _badsCreativeIds = new List<string>(MAX_BADS_CID_NUMBER);
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<string, string>(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);
}
/// <summary> /// <summary>
/// 获取 AdReviewCreativeId /// 构建 Impression 数据
/// </summary>
/// <param name="adInfo"></param>
/// <param name="reviewCreativeId"></param>
/// <param name="platform"></param>
/// <param name="eventName"></param>
/// <param name="itemCategory"></param>
/// <param name="duration"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 添加一条ImpressionData 数据
/// </summary>
/// <param name="adInfo"></param>
/// <param name="reviewCreativeId"></param>
/// <param name="platform"></param>
/// <param name="eventName"></param>
/// <param name="itemCategory"></param>
/// <param name="duration"></param>
/// <returns></returns>
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);
}
/// <summary>
/// 获取 AdReviewCreativeId 后的回调
/// </summary> /// </summary>
/// <param name="adUnitId"></param> /// <param name="adUnitId"></param>
/// <param name="reviewCreativeId"></param> /// <param name="reviewCreativeId"></param>
@ -946,61 +894,31 @@ namespace Guru
private void OnAdReviewCreativeIdGeneratedEvent(string adUnitId, string reviewCreativeId, MaxSdkBase.AdInfo adInfo) 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}"); 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"); Debug.LogError($"{Tag} --- Get ReviewCreativeId:{reviewCreativeId} but CreativeIdentifier is null");
return; return;
} }
// 尝试直接上报广告收益 (可能存在异步上报的情况) _impressionDriver.SetReviewCreativeId(adInfo.CreativeIdentifier, reviewCreativeId); // 缓存 ReviewCreateId
TryReportImpression(adInfo, reviewCreativeId);
}
/// <summary> if (adUnitId == GetBannerID() || adInfo.AdFormat.ToUpper().Contains("BANNER"))
/// 尝试上报数据
/// </summary>
/// <param name="adInfo"></param>
/// <param name="reviewCreativeId"></param>
/// <returns></returns>
private void TryReportImpression(MaxSdk.AdInfo adInfo, string reviewCreativeId = "")
{
string creativeId = adInfo.CreativeIdentifier;
List<string> removeList = new List<string>();
if (_impressionCache.TryGetValue(creativeId, out var impressionData))
{ {
if(string.IsNullOrEmpty(impressionData.review_creative_id)) // 清理 BADS CID 缓存
impressionData.review_creative_id = reviewCreativeId; _badsCreativeIds.Add(adInfo.CreativeIdentifier);
if (_badsCreativeIds.Count > MAX_BADS_CID_NUMBER)
ReportAdsRevenue(impressionData);
removeList.Add(creativeId);
}
else
{
// 如果上报未成功, 则缓存reviewCreativeId
SetReviewCreativeId(adInfo.CreativeIdentifier, reviewCreativeId);
}
// 清理超过 3 秒未上报的数据
foreach (var imp in _impressionCache.Values)
{
if (imp.GetPassedSecond() > 3.0)
{ {
ReportAdsRevenue(imp); var cid = _badsCreativeIds[0];
removeList.Add(imp.ad_creative_id); _badsCreativeIds.Remove(cid);
} _impressionDriver.CleanCreativeId(cid);
}
if (removeList.Count > 0)
{
foreach (var k in removeList)
{
_impressionCache.Remove(k);
_reviewCreativeIds.Remove(k);
} }
} }
} }
#endregion #endregion
} }
} }

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1866d6a2a7d7447b867e491b9354a49b
timeCreated: 1722313457

View File

@ -0,0 +1,185 @@
namespace Guru.Ads
{
using System;
using System.Collections.Generic;
/// <summary>
/// AdImpression 对象
/// </summary>
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);
}
/// <summary>
/// 设置 CreativeId
/// </summary>
/// <param name="creativeId"></param>
public void SetCreativeId(string creativeId)
{
ad_creative_id = FixStringLength(creativeId);
}
/// <summary>
/// 设置 ReviewCreativeId
/// </summary>
/// <param name="reviewCreativeId"></param>
public void SetReviewCreativeId(string reviewCreativeId)
{
if (string.IsNullOrEmpty(reviewCreativeId)) return;
review_creative_id = FixStringLength(reviewCreativeId);
}
/// <summary>
/// 限制字符串长度为 96
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
private string FixStringLength(string source)
{
return source.Length <= MAX_VALUE_LENGTH ? source : source.Substring(0, MAX_VALUE_LENGTH);
}
/// <summary>
/// 获取自创建开始经过的秒数
/// </summary>
/// <returns></returns>
public double GetPassedSecond()
{
return (DateTime.UtcNow - createTime).TotalSeconds;
}
public Dictionary<string, object> BuildEventData()
{
var data = new Dictionary<string, object>()
{
{ "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<string, object> BuildEventAdImpData()
{
var data = new Dictionary<string, object>()
{
{ "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<string, object> BuildEventAdClickData()
{
var data = new Dictionary<string, object>()
{
{ "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<string, object> BuildEventAdPaidData()
{
var data = new Dictionary<string, object>()
{
{ "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<string, object> BuildEventAdRewardedData()
{
var data = new Dictionary<string, object>()
{
{ "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;
}
}
}

View File

@ -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<AdImpressionData> _impressionData; // 所有缓存待上报的 impression data
private Dictionary<string, string> _savedReviewCreativeIds;
private Action<AdImpressionData> _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<AdImpressionData> onReportRevenue)
{
_impressionData = new List<AdImpressionData>(20);
_savedReviewCreativeIds = new Dictionary<string, string>(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);
}
}
/// <summary>
/// 强制发送相关的数据
/// </summary>
/// <param name="creativeId"></param>
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);
}
}
/// <summary>
/// 添加一条Impression数据
/// </summary>
/// <param name="data"></param>
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;
}
/// <summary>
/// 触发所有相关的 cid 和 reviewCreateId
/// </summary>
/// <param name="creativeId"></param>
/// <param name="reviewCreativeId"></param>
/// <param name="force">强制触发</param>
private void FlushAllImpressionData(string creativeId, string reviewCreativeId = "", bool force = false)
{
List<AdImpressionData> tmp = new List<AdImpressionData>(_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;
}
/// <summary>
/// 输出一个 Impression 事件
/// </summary>
/// <param name="data"></param>
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;
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7194cdd8ed1447508011264371e2c23d
timeCreated: 1722313472

View File

@ -1,60 +0,0 @@
using System.Collections.Generic;
namespace Guru
{
using System;
/// <summary>
/// AdImpression 对象
/// </summary>
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;
}
/// <summary>
/// 获取自创建开始经过的秒数
/// </summary>
/// <returns></returns>
public double GetPassedSecond()
{
return (DateTime.UtcNow - createTime).TotalSeconds;
}
public Dictionary<string, object> BuildEventData()
{
var data = new Dictionary<string, object>()
{
{ "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;
}
}
}

View File

@ -142,7 +142,12 @@ namespace Guru
/// </summary> /// </summary>
public static void ADIadsImp(AdParams adParams) public static void ADIadsImp(AdParams adParams)
{ {
TrackEvent(EventIadsImp, BuildAdEventData(adParams)); ADIadsImp(BuildAdEventData(adParams));
}
public static void ADIadsImp(Dictionary<string, dynamic> data)
{
TrackEvent(EventIadsImp, data);
} }
/// <summary> /// <summary>
@ -163,7 +168,12 @@ namespace Guru
/// </summary> /// </summary>
public static void ADIadsClose(AdParams adParams) public static void ADIadsClose(AdParams adParams)
{ {
TrackEvent(EventIadsClose, BuildAdEventData(adParams)); ADIadsClose(BuildAdEventData(adParams));
}
public static void ADIadsClose(Dictionary<string, object> data)
{
TrackEvent(EventIadsClose, data);
} }
/// <summary> /// <summary>
@ -202,8 +212,16 @@ namespace Guru
/// </summary> /// </summary>
public static void ADRadsImp(AdParams adParams) public static void ADRadsImp(AdParams adParams)
{ {
TrackEvent(EventRadsImp, BuildAdEventData(adParams)); ADRadsImp(BuildAdEventData(adParams));
} }
public static void ADRadsImp(Dictionary<string, dynamic> data)
{
TrackEvent(EventRadsImp, data);
}
/// <summary> /// <summary>
/// 广告完成观看发奖励 /// 广告完成观看发奖励
/// </summary> /// </summary>
@ -265,7 +283,12 @@ namespace Guru
/// </summary> /// </summary>
public static void ADRadsClose(AdParams adParams) public static void ADRadsClose(AdParams adParams)
{ {
TrackEvent(EventRadsClose, BuildAdEventData(adParams)); ADRadsClose( BuildAdEventData(adParams));
}
public static void ADRadsClose(Dictionary<string, dynamic> data)
{
TrackEvent(EventRadsClose, data);
} }
#endregion #endregion

View File

@ -11,118 +11,119 @@ namespace Guru
//打点常量定义 //打点常量定义
public static partial class Analytics 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 const string AdMAX = "MAX";
public static readonly string AdIronSource = "IronSource"; public const string AdIronSource = "IronSource";
//IAP打点事件 //IAP打点事件
public static readonly string EventIAPFirst = "first_iap"; public const string EventIAPFirst = "first_iap";
public static readonly string EventIAPImp = "iap_imp"; public const string EventIAPImp = "iap_imp";
public static readonly string EventIAPClose = "iap_close"; public const string EventIAPClose = "iap_close";
public static readonly string EventIAPClick = "iap_clk"; public const string EventIAPClick = "iap_clk";
public static readonly string EventIAPReturnTrue = "iap_ret_true"; public const string EventIAPReturnTrue = "iap_ret_true";
public static readonly string EventIAPReturnFalse = "iap_ret_false"; 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 const string EventBadsLoad = "bads_load";
public static readonly string EventBadsLoaded = "bads_loaded"; public const string EventBadsLoaded = "bads_loaded";
public static readonly string EventBadsFailed = "bads_failed"; public const string EventBadsFailed = "bads_failed";
public static readonly string EventBadsClick = "bads_clk"; public const string EventBadsClick = "bads_clk";
public static readonly string EventBadsImp = "bads_imp"; public const string EventBadsImp = "bads_imp";
public static readonly string EventBadsHide = "bads_hide"; public const string EventBadsHide = "bads_hide";
public const string EventBadsPaid = "bads_paid";
//插屏广告打点事件 //插屏广告打点事件
public static readonly string EventIadsLoad = "iads_load"; public const string EventIadsLoad = "iads_load";
public static readonly string EventIadsLoaded = "iads_loaded"; public const string EventIadsLoaded = "iads_loaded";
public static readonly string EventIadsFailed = "iads_failed"; public const string EventIadsFailed = "iads_failed";
public static readonly string EventIadsImp = "iads_imp"; public const string EventIadsImp = "iads_imp";
public static readonly string EventIadsClick = "iads_clk"; public const string EventIadsClick = "iads_clk";
public static readonly string EventIadsPaid = "iads_paid"; public const string EventIadsClose = "iads_close";
public static readonly string EventIadsClose = "iads_close"; public const string EventIadsPaid = "iads_paid";
//激励视频广告打点事件 //激励视频广告打点事件
public static readonly string EventRadsLoad = "rads_load"; public const string EventRadsLoad = "rads_load";
public static readonly string EventRadsLoaded = "rads_loaded"; public const string EventRadsLoaded = "rads_loaded";
public static readonly string EventRadsFailed = "rads_failed"; public const string EventRadsFailed = "rads_failed";
public static readonly string EventRadsImp = "rads_imp"; public const string EventRadsImp = "rads_imp";
public static readonly string EventRadsRewarded = "rads_rewarded"; public const string EventRadsRewarded = "rads_rewarded";
public static readonly string EventRadsClick = "rads_clk"; public const string EventRadsClick = "rads_clk";
public static readonly string EventRadsPaid = "rads_paid"; public const string EventRadsClose = "rads_close";
public static readonly string EventRadsClose = "rads_close"; public const string EventRadsPaid = "rads_paid";
public static readonly string EventFirstRadsRewarded = "first_rads_rewarded"; public const string EventFirstRadsRewarded = "first_rads_rewarded";
//广告收益打点事件 //广告收益打点事件
public static readonly string EventTchAdRev001Impression = "tch_ad_rev_roas_001"; public const string EventTchAdRev001Impression = "tch_ad_rev_roas_001";
public static readonly string EventTchAdRev02Impression = "tch_ad_rev_roas_02"; public const string EventTchAdRev02Impression = "tch_ad_rev_roas_02";
public static readonly string EventTchAdRevAbnormal = "tch_ad_rev_value_abnormal"; public const string EventTchAdRevAbnormal = "tch_ad_rev_value_abnormal";
//内购成功事件上报 //内购成功事件上报
public static readonly string EventIAPPurchase = "iap_purchase"; public const string EventIAPPurchase = "iap_purchase";
public static readonly string EventSubPurchase = "sub_purchase"; public const string EventSubPurchase = "sub_purchase";
public static readonly string IAPStoreCategory = "Store"; public const string IAPStoreCategory = "Store";
public static readonly string IAPTypeProduct = "product"; public const string IAPTypeProduct = "product";
public static readonly string IAPTypeSubscription = "subscription"; public const string IAPTypeSubscription = "subscription";
//打点参数名 //打点参数名
public static readonly string ParameterResult = "result"; public const string ParameterResult = "result";
public static readonly string ParameterStep = "step"; public const string ParameterStep = "step";
public static readonly string ParameterDuration = "duration"; public const string ParameterDuration = "duration";
public static readonly string ParameterErrorCode = "error_code"; public const string ParameterErrorCode = "error_code";
public static readonly string ParameterProductId = "product_id"; public const string ParameterProductId = "product_id";
public static readonly string ParameterPlatform = "platform"; public const string ParameterPlatform = "platform";
public static readonly string ParameterStartType = "start_type"; // 游戏启动类型 public const string ParameterStartType = "start_type"; // 游戏启动类型
public static readonly string ParameterReplay = "replay"; // 游戏重玩 public const string ParameterReplay = "replay"; // 游戏重玩
public static readonly string ParameterContinue = "continue"; // 游戏继续 public const string ParameterContinue = "continue"; // 游戏继续
public static readonly string ParameterAdUnitName = "ad_unit_name"; public const string ParameterAdUnitName = "ad_unit_name";
public static readonly string ParameterAdPlacement = "ad_placement"; public const string ParameterAdPlacement = "ad_placement";
public static readonly string ParameterAdCreativeId = "ad_creative_id"; public const string ParameterAdCreativeId = "ad_creative_id";
public static readonly string ParameterReviewCreativeId = "review_creative_id"; public const string ParameterReviewCreativeId = "review_creative_id";
// 评价参数 // 评价参数
public static readonly string EventRateImp = "rate_imp"; // 评价弹窗展示 public const string EventRateImp = "rate_imp"; // 评价弹窗展示
public static readonly string EventRateNow = "rate_now"; // 点击评分引导弹窗中的评分 public const string EventRateNow = "rate_now"; // 点击评分引导弹窗中的评分
//打点内部执行错误 //打点内部执行错误
public static string ParameterEventError => "event_error"; public static string ParameterEventError => "event_error";
//ios ATT打点 //ios ATT打点
public static readonly string ATTGuideShow = "att_guide_show"; public const string ATTGuideShow = "att_guide_show";
public static readonly string ATTGuideOK = "att_guide_ok"; public const string ATTGuideOK = "att_guide_ok";
public static readonly string ATTWindowShow = "att_window_show"; public const string ATTWindowShow = "att_window_show";
public static readonly string ATTOptIn = "att_opt_in"; public const string ATTOptIn = "att_opt_in";
public static readonly string ATTOpOut = "att_opt_out"; public const string ATTOpOut = "att_opt_out";
public static readonly string ParameterATTStatus = "att_status"; public const string ParameterATTStatus = "att_status";
public static readonly string EventATTResult = "att_result"; public const string EventATTResult = "att_result";
// 用户属性 // 用户属性
public static readonly string PropertyFirstOpenTime = "first_open_time"; //用户第一次first_open的时间 public const string PropertyFirstOpenTime = "first_open_time"; //用户第一次first_open的时间
public static readonly string PropertyDeviceID = "device_id"; //用户的设备ID public const string PropertyDeviceID = "device_id"; //用户的设备ID
public static readonly string PropertyUserID = "user_id"; public const string PropertyUserID = "user_id";
public static readonly string PropertyLevel = "b_level"; //"每次完成通关上升一次显示用户完成的最大关卡数。只针对主关卡和主玩法的局数做累加初始值为0。" public const string PropertyLevel = "b_level"; //"每次完成通关上升一次显示用户完成的最大关卡数。只针对主关卡和主玩法的局数做累加初始值为0。"
public static readonly string PropertyPlay = "b_play"; //每完成一局或者游戏触发, public const string PropertyPlay = "b_play"; //每完成一局或者游戏触发,
public static readonly string PropertyLastPlayedLevel = "last_played_level"; public const string PropertyLastPlayedLevel = "last_played_level";
public static readonly string PropertyGrade = "grade"; //当游戏玩家角色升级时触发 public const string PropertyGrade = "grade"; //当游戏玩家角色升级时触发
public static readonly string PropertyIsIAPUser = "is_iap_user"; //付费成功后设置属性参数为true如果没有发生付费可以不用设置该属性 public const string PropertyIsIAPUser = "is_iap_user"; //付费成功后设置属性参数为true如果没有发生付费可以不用设置该属性
public static readonly string PropertyIAPCoin = "iap_coin"; //付费所得的总金币数(iap获取累计值)\ public const string PropertyIAPCoin = "iap_coin"; //付费所得的总金币数(iap获取累计值)\
public static readonly string PropertyNonIAPCoin = "noniap_coin"; //非付费iap获取累计值 public const string PropertyNonIAPCoin = "noniap_coin"; //非付费iap获取累计值
public static readonly string PropertyCoin = "coin"; //当前金币数 public const string PropertyCoin = "coin"; //当前金币数
public static readonly string PropertyExp = "exp"; // 经验值 public const string PropertyExp = "exp"; // 经验值
public static readonly string PropertyHp = "hp"; // 生命值/体力 public const string PropertyHp = "hp"; // 生命值/体力
public static readonly string PropertyAndroidID = "android_id"; // Android 平台 AndroidID public const string PropertyAndroidID = "android_id"; // Android 平台 AndroidID
public static readonly string PropertyIDFV = "idfv"; // iOS 平台 IDFV public const string PropertyIDFV = "idfv"; // iOS 平台 IDFV
public static readonly string PropertyIDFA = "idfa"; // iOS 平台 IDFA public const string PropertyIDFA = "idfa"; // iOS 平台 IDFA
public static readonly string PropertyPicture = "picture"; // 玩家在主线的mapid public const string PropertyPicture = "picture"; // 玩家在主线的mapid
public static readonly string PropertyNoAds = "no_ads"; // 玩家是否去广告 public const string PropertyNoAds = "no_ads"; // 玩家是否去广告
public static readonly string PropertyATTStatus = "att_status"; // ATT 状态 public const string PropertyATTStatus = "att_status"; // ATT 状态
public static readonly string PropertyGDPR = "gdpr"; // GDPR状态 public const string PropertyGDPR = "gdpr"; // GDPR状态
// 经济相关 // 经济相关
public const string ParameterBalance = "balance"; // 用于余额 public const string ParameterBalance = "balance"; // 用于余额
@ -130,6 +131,6 @@ namespace Guru
public const string ParameterVirtualCurrencyName = "virtual_currency_name"; // 虚拟货币名称 public const string ParameterVirtualCurrencyName = "virtual_currency_name"; // 虚拟货币名称
// 中台 // 中台
public static readonly string EventDevAudit = "dev_audit"; // 中台事件异常 public const string EventDevAudit = "dev_audit"; // 中台事件异常
} }
} }

View File

@ -5,104 +5,104 @@ namespace Guru
//Firebase内置定义事件名称和参数名称 //Firebase内置定义事件名称和参数名称
public static partial class Analytics public static partial class Analytics
{ {
internal static readonly string EventAdImpression = "ad_impression"; internal const string EventAdImpression = "ad_impression";
internal static readonly string EventAddPaymentInfo = "add_payment_info"; internal const string EventAddPaymentInfo = "add_payment_info";
internal static readonly string EventAddShippingInfo = "add_shipping_info"; internal const string EventAddShippingInfo = "add_shipping_info";
internal static readonly string EventAddToCart = "add_to_cart"; internal const string EventAddToCart = "add_to_cart";
internal static readonly string EventAddToWishlist = "add_to_wishlist"; internal const string EventAddToWishlist = "add_to_wishlist";
internal static readonly string EventAppOpen = "app_open"; internal const string EventAppOpen = "app_open";
internal static readonly string EventBeginCheckout = "begin_checkout"; internal const string EventBeginCheckout = "begin_checkout";
internal static readonly string EventCampaignDetails = "campaign_details"; internal const string EventCampaignDetails = "campaign_details";
internal static readonly string EventEarnVirtualCurrency = "earn_virtual_currency"; internal const string EventEarnVirtualCurrency = "earn_virtual_currency";
internal static readonly string EventGenerateLead = "generate_lead"; internal const string EventGenerateLead = "generate_lead";
internal static readonly string EventJoinGroup = "join_group"; internal const string EventJoinGroup = "join_group";
internal static readonly string EventLevelEnd = "level_end"; internal const string EventLevelEnd = "level_end";
internal static readonly string EventLevelStart = "level_start"; internal const string EventLevelStart = "level_start";
internal static readonly string EventLevelUp = "level_up"; internal const string EventLevelUp = "level_up";
internal static readonly string EventLogin = "login"; internal const string EventLogin = "login";
internal static readonly string EventPostScore = "post_score"; internal const string EventPostScore = "post_score";
internal static readonly string EventPurchase = "purchase"; internal const string EventPurchase = "purchase";
internal static readonly string EventRefund = "refund"; internal const string EventRefund = "refund";
internal static readonly string EventRemoveFromCart = "remove_from_cart"; internal const string EventRemoveFromCart = "remove_from_cart";
internal static readonly string EventScreenView = "screen_view"; internal const string EventScreenView = "screen_view";
internal static readonly string EventSearch = "search"; internal const string EventSearch = "search";
internal static readonly string EventSelectContent = "select_content"; internal const string EventSelectContent = "select_content";
internal static readonly string EventSelectItem = "select_item"; internal const string EventSelectItem = "select_item";
internal static readonly string EventSelectPromotion = "select_promotion"; internal const string EventSelectPromotion = "select_promotion";
internal static readonly string EventShare = "share"; internal const string EventShare = "share";
internal static readonly string EventSignUp = "sign_up"; internal const string EventSignUp = "sign_up";
internal static readonly string EventSpendVirtualCurrency = "spend_virtual_currency"; internal const string EventSpendVirtualCurrency = "spend_virtual_currency";
internal static readonly string EventTutorialBegin = "tutorial_begin"; internal const string EventTutorialBegin = "tutorial_begin";
internal static readonly string EventTutorialComplete = "tutorial_complete"; internal const string EventTutorialComplete = "tutorial_complete";
internal static readonly string EventUnlockAchievement = "unlock_achievement"; internal const string EventUnlockAchievement = "unlock_achievement";
internal static readonly string EventViewCart = "view_cart"; internal const string EventViewCart = "view_cart";
internal static readonly string EventViewItem = "view_item"; internal const string EventViewItem = "view_item";
internal static readonly string EventViewItemList = "view_item_list"; internal const string EventViewItemList = "view_item_list";
internal static readonly string EventViewPromotion = "view_promotion"; internal const string EventViewPromotion = "view_promotion";
internal static readonly string EventViewSearchResults = "view_search_results"; internal const string EventViewSearchResults = "view_search_results";
internal static readonly string ParameterAchievementId = "achievement_id"; internal const string ParameterAchievementId = "achievement_id";
internal static readonly string ParameterAdFormat = "ad_format"; internal const string ParameterAdFormat = "ad_format";
internal static readonly string ParameterAdNetworkClickID = "aclid"; internal const string ParameterAdNetworkClickID = "aclid";
internal static readonly string ParameterAdPlatform = "ad_platform"; internal const string ParameterAdPlatform = "ad_platform";
internal static readonly string ParameterAdSource = "ad_source"; internal const string ParameterAdSource = "ad_source";
internal static readonly string ParameterAffiliation = "affiliation"; internal const string ParameterAffiliation = "affiliation";
internal static readonly string ParameterCP1 = "cp1"; internal const string ParameterCP1 = "cp1";
internal static readonly string ParameterCampaign = "campaign"; internal const string ParameterCampaign = "campaign";
internal static readonly string ParameterCharacter = "character"; internal const string ParameterCharacter = "character";
internal static readonly string ParameterContent = "content"; internal const string ParameterContent = "content";
internal static readonly string ParameterContentType = "content_type"; internal const string ParameterContentType = "content_type";
internal static readonly string ParameterCoupon = "coupon"; internal const string ParameterCoupon = "coupon";
internal static readonly string ParameterCreativeName = "creative_name"; internal const string ParameterCreativeName = "creative_name";
internal static readonly string ParameterCreativeSlot = "creative_slot"; internal const string ParameterCreativeSlot = "creative_slot";
internal static readonly string ParameterCurrency = "currency"; internal const string ParameterCurrency = "currency";
internal static readonly string ParameterDestination = "destination"; internal const string ParameterDestination = "destination";
internal static readonly string ParameterDiscount = "discount"; internal const string ParameterDiscount = "discount";
internal static readonly string ParameterEndDate = "end_date"; internal const string ParameterEndDate = "end_date";
internal static readonly string ParameterExtendSession = "extend_session"; internal const string ParameterExtendSession = "extend_session";
internal static readonly string ParameterFlightNumber = "flight_number"; internal const string ParameterFlightNumber = "flight_number";
internal static readonly string ParameterGroupId = "group_id"; internal const string ParameterGroupId = "group_id";
internal static readonly string ParameterIndex = "index"; internal const string ParameterIndex = "index";
internal static readonly string ParameterItemBrand = "item_brand"; internal const string ParameterItemBrand = "item_brand";
internal static readonly string ParameterItemCategory = "item_category"; internal const string ParameterItemCategory = "item_category";
internal static readonly string ParameterItemCategory2 = "item_category2"; internal const string ParameterItemCategory2 = "item_category2";
internal static readonly string ParameterItemCategory3 = "item_category3"; internal const string ParameterItemCategory3 = "item_category3";
internal static readonly string ParameterItemCategory4 = "item_category4"; internal const string ParameterItemCategory4 = "item_category4";
internal static readonly string ParameterItemCategory5 = "item_category5"; internal const string ParameterItemCategory5 = "item_category5";
internal static readonly string ParameterItemId = "item_id"; internal const string ParameterItemId = "item_id";
internal static readonly string ParameterItemList = "item_list"; internal const string ParameterItemList = "item_list";
internal static readonly string ParameterItemListID = "item_list_id"; internal const string ParameterItemListID = "item_list_id";
internal static readonly string ParameterItemListName = "item_list_name"; internal const string ParameterItemListName = "item_list_name";
internal static readonly string ParameterItemName = "item_name"; internal const string ParameterItemName = "item_name";
internal static readonly string ParameterLevel = "level"; internal const string ParameterLevel = "level";
internal static readonly string ParameterLevelName = "level_name"; internal const string ParameterLevelName = "level_name";
internal static readonly string ParameterLocation = "location"; internal const string ParameterLocation = "location";
internal static readonly string ParameterLocationID = "location_id"; internal const string ParameterLocationID = "location_id";
internal static readonly string ParameterMedium = "medium"; internal const string ParameterMedium = "medium";
internal static readonly string ParameterMethod = "method"; internal const string ParameterMethod = "method";
internal static readonly string ParameterNumberOfNights = "number_of_nights"; internal const string ParameterNumberOfNights = "number_of_nights";
internal static readonly string ParameterNumberOfPassengers = "number_of_passengers"; internal const string ParameterNumberOfPassengers = "number_of_passengers";
internal static readonly string ParameterNumberOfRooms = "number_of_rooms"; internal const string ParameterNumberOfRooms = "number_of_rooms";
internal static readonly string ParameterOrigin = "origin"; internal const string ParameterOrigin = "origin";
internal static readonly string ParameterPaymentType = "payment_type"; internal const string ParameterPaymentType = "payment_type";
internal static readonly string ParameterPrice = "price"; internal const string ParameterPrice = "price";
internal static readonly string ParameterPromotionID = "promotion_id"; internal const string ParameterPromotionID = "promotion_id";
internal static readonly string ParameterPromotionName = "promotion_name"; internal const string ParameterPromotionName = "promotion_name";
internal static readonly string ParameterQuantity = "quantity"; internal const string ParameterQuantity = "quantity";
internal static readonly string ParameterScore = "score"; internal const string ParameterScore = "score";
internal static readonly string ParameterScreenClass = "screen_class"; internal const string ParameterScreenClass = "screen_class";
internal static readonly string ParameterScreenName = "screen_name"; internal const string ParameterScreenName = "screen_name";
internal static readonly string ParameterSearchTerm = "search_term"; internal const string ParameterSearchTerm = "search_term";
internal static readonly string ParameterShipping = "shipping"; internal const string ParameterShipping = "shipping";
internal static readonly string ParameterShippingTier = "shipping_tier"; internal const string ParameterShippingTier = "shipping_tier";
internal static readonly string ParameterSignUpMethod = "sign_up_method"; internal const string ParameterSignUpMethod = "sign_up_method";
internal static readonly string ParameterSource = "source"; internal const string ParameterSource = "source";
internal static readonly string ParameterStartDate = "start_date"; internal const string ParameterStartDate = "start_date";
internal static readonly string ParameterSuccess = "success"; internal const string ParameterSuccess = "success";
internal static readonly string ParameterTax = "tax"; internal const string ParameterTax = "tax";
internal static readonly string ParameterTerm = "term"; internal const string ParameterTerm = "term";
internal static readonly string ParameterTransactionId = "transaction_id"; internal const string ParameterTransactionId = "transaction_id";
internal static readonly string ParameterTravelClass = "travel_class"; internal const string ParameterTravelClass = "travel_class";
internal static readonly string ParameterValue = "value"; internal const string ParameterValue = "value";
} }
} }

View File

@ -6,6 +6,7 @@ namespace Guru
using System.Collections.Generic; using System.Collections.Generic;
using Facebook.Unity; using Facebook.Unity;
using UnityEngine; using UnityEngine;
using Guru.Ads;
//游戏通用模版打点定义 //游戏通用模版打点定义
public static partial class Analytics public static partial class Analytics