update: 更新自打点原生实现接口, 对齐 Android 和 iOS 的初始化接口参数

Signed-off-by: huyufei <yufei.hu@castbox.fm>
胡宇飞 2024-08-07 13:48:40 +08:00
parent d37c1c4216
commit ac96959649
17 changed files with 257 additions and 233 deletions

View File

@ -1,28 +1,29 @@
namespace Guru namespace Guru
{ {
using UnityEngine; using UnityEngine;
using com.adjust.sdk; using com.adjust.sdk;
using System; using System;
using System.Collections; using System.Threading.Tasks;
public class AdjustService public class AdjustService
{ {
public const string Version = "1.6.1"; private const string Version = "1.6.1";
public const string AdjustVersion = "4.38.0"; // Adjust SDK Version private const string AdjustVersion = "4.38.0"; // Adjust SDK Version
public static readonly string LOG_TAG = "Adjust"; private const string LOG_TAG = "[ADJUST]";
public static readonly float DelayTime = 1f; // 延迟启动时间 private const double delayTime = 1; // 延迟启动时间(s)
public const string K_IAP_PURCHASE = "iap_purchase"; // 固定点位事件 private const string K_IAP_PURCHASE = "iap_purchase"; // 固定点位事件
public const string K_SUB_PURCHASE = "sub_purchase"; // 固定点位事件 private const string K_SUB_PURCHASE = "sub_purchase"; // 固定点位事件
private static Action<string, string, string> _onInitComplete; private static Action<string, string, string> _onInitComplete;
private static Action<string> _onGetGoogleAdidHandler; private static Action<string> _onGetGoogleAdidHandler;
private static string _googleAdId = ""; private string _googleAdId = "";
public static string GoogleAdId // GPS = Google Play Service public string GoogleAdId // GPS = Google Play Service
{ {
get get
{ {
@ -31,11 +32,11 @@ namespace Guru
} }
} }
public static string IDFA => Adjust.getIdfa(); public string IDFA => Adjust.getIdfa();
public static string IDFV => Adjust.getIdfv(); public string IDFV => Adjust.getIdfv();
private static string _adjustId = ""; private string _adjustId = "";
public static string AdjustId public string AdjustId
{ {
get get
{ {
@ -47,6 +48,18 @@ namespace Guru
private static bool _isReady = false; private static bool _isReady = false;
public static bool IsReady => _isReady; public static bool IsReady => _isReady;
private static AdjustService _instance;
public static AdjustService Instance
{
get
{
if (_instance == null) _instance = new AdjustService();
return _instance;
}
}
#region 启动服务 #region 启动服务
/// <summary> /// <summary>
@ -59,8 +72,12 @@ namespace Guru
/// <param name="onInitComplete">初始化完成的时候会返回 AdjustId </param> /// <param name="onInitComplete">初始化完成的时候会返回 AdjustId </param>
/// <param name="onDeeplinkCallback"></param> /// <param name="onDeeplinkCallback"></param>
/// <param name="onGetGoogleAdIdCallback"></param> /// <param name="onGetGoogleAdIdCallback"></param>
public static void StartService(string appToken, string fbAppId = "", string firebaseId = "", string deviceId = "", /// <param name="showLogs"></param>
Action<string, string, string> onInitComplete = null, Action<string> onDeeplinkCallback = null, Action<string> onGetGoogleAdIdCallback = null) public void StartService(string appToken, string fbAppId = "", string firebaseId = "", string deviceId = "",
Action<string, string, string> onInitComplete = null,
Action<string> onDeeplinkCallback = null,
Action<string> onGetGoogleAdIdCallback = null,
bool showLogs = false)
{ {
if (string.IsNullOrEmpty(appToken)) if (string.IsNullOrEmpty(appToken))
{ {
@ -75,46 +92,55 @@ namespace Guru
AdjustEnvironment environment = GetAdjustEnvironment(); AdjustEnvironment environment = GetAdjustEnvironment();
AdjustConfig config = new AdjustConfig(appToken, environment); AdjustConfig config = new AdjustConfig(appToken, environment);
config.setLogLevel(GetAdjustLogLevel());
config.setDelayStart(DelayTime);
config.setPreinstallTrackingEnabled(true); // Adjust Preinstall config.setPreinstallTrackingEnabled(true); // Adjust Preinstall
config.setSessionSuccessDelegate(OnSessionSuccessCallback); // SessionSuccess config.setLogLevel(GetLogLevel(showLogs));
config.setSessionFailureDelegate(OnSessionFailureCallback); // SessionFailed config.setDelayStart(delayTime);
if(onDeeplinkCallback != null)
config.setDeferredDeeplinkDelegate(onDeeplinkCallback);
#if UNITY_ANDROID #if UNITY_ANDROID
if (!string.IsNullOrEmpty(fbAppId)) config.setFbAppId(fbAppId); // 注入 MIR ID if (!string.IsNullOrEmpty(fbAppId)) config.setFbAppId(fbAppId); // 注入 MIR ID
#endif #endif
// Deeplink Callback
if(onDeeplinkCallback != null)
config.setDeferredDeeplinkDelegate(onDeeplinkCallback);
/*
#if UNITY_EDITOR || DEBUG #if UNITY_EDITOR || DEBUG
config.setSessionSuccessDelegate(OnSessionSuccessCallback); // SessionSuccess
config.setSessionFailureDelegate(OnSessionFailureCallback); // SessionFailed
config.setLogDelegate(log => LogI(LOG_TAG, log)); config.setLogDelegate(log => LogI(LOG_TAG, log));
config.setEventSuccessDelegate(OnEventSuccessCallback); config.setEventSuccessDelegate(OnEventSuccessCallback);
config.setEventFailureDelegate(OnEventFailureCallback); config.setEventFailureDelegate(OnEventFailureCallback);
config.setAttributionChangedDelegate(OnAttributionChangedCallback); config.setAttributionChangedDelegate(OnAttributionChangedCallback);
#endif #endif
// 检查场景实例 */
SetupInstance(); // SetupInstance(); // 初始化场景示例
Adjust.start(config);
Adjust.start(config); // 启动服务
// 异步加载AdId // 异步加载AdId
FetchGoogleAdIdAsync(); FetchGoogleAdIdAsync();
LogI(LOG_TAG, $"----- Start AdjustService[{Version}] AdjustVer:{AdjustVersion} -----"); LogI(LOG_TAG, $"----- Start AdjustService[{Version}] AdjustVer:{AdjustVersion} -----");
}
DelayedInitComplete(delayTime);
}
private async void DelayedInitComplete(double delaySeconds)
{
await Task.Delay(TimeSpan.FromMilliseconds(delaySeconds * 1000));
_isReady = true;
_onInitComplete?.Invoke(Adjust.getAdid(), Adjust.getIdfv(), Adjust.getIdfa());
}
/// <summary> /// <summary>
/// 异步拉取 Google Ad Id /// 异步拉取 Google Ad Id
/// </summary> /// </summary>
private static void FetchGoogleAdIdAsync() private void FetchGoogleAdIdAsync()
{ {
Adjust.getGoogleAdId(gid => Adjust.getGoogleAdId(gid =>
{ {
if (!string.IsNullOrEmpty(gid)) if (!string.IsNullOrEmpty(gid))
{ {
_googleAdId = gid; // 获取Google AD ID _googleAdId = gid; // 获取Google AD ID
_onGetGoogleAdidHandler?.Invoke(_googleAdId); // 返回 GSADID _onGetGoogleAdidHandler?.Invoke(_googleAdId); // 返回 GoogleAdid
} }
}); });
} }
@ -122,7 +148,7 @@ namespace Guru
/// <summary> /// <summary>
/// 确保 Adjust 实例在场景中 /// 确保 Adjust 实例在场景中
/// </summary> /// </summary>
private static void SetupInstance() private void SetupInstance()
{ {
var go = UnityEngine.GameObject.Find(nameof(Adjust)); var go = UnityEngine.GameObject.Find(nameof(Adjust));
if (go == null) if (go == null)
@ -147,7 +173,7 @@ namespace Guru
/// </summary> /// </summary>
/// <param name="pseudoId"></param> /// <param name="pseudoId"></param>
/// <param name="deviceId"></param> /// <param name="deviceId"></param>
public static void InstallEvent(string pseudoId, string deviceId) private static void InstallEvent(string pseudoId, string deviceId)
{ {
if (string.IsNullOrEmpty(pseudoId)) if (string.IsNullOrEmpty(pseudoId))
{ {
@ -169,24 +195,19 @@ namespace Guru
#endregion #endregion
#region 事件回调函数 #region 事件回调函数
/*
/// <summary> /// <summary>
/// Session 启动后回调 /// Session 启动后回调
/// 回调中可以获取实际的 AdjustID /// 回调中可以获取实际的 AdjustID
/// </summary> /// </summary>
/// <param name="sessionSuccessData"></param> /// <param name="sessionSuccessData"></param>
private static void OnSessionSuccessCallback(AdjustSessionSuccess sessionSuccessData) private void OnSessionSuccessCallback(AdjustSessionSuccess sessionSuccessData)
{ {
LogI(LOG_TAG,$"{LOG_TAG} --- Session tracked successfully!");
var adid = sessionSuccessData.Adid; var adid = sessionSuccessData.Adid;
_adjustId = adid; LogI(LOG_TAG,$"{LOG_TAG} --- Session tracked successfully! Get Adid: {adid}");
_isReady = true;
_onInitComplete?.Invoke(adid, Adjust.getIdfv(), Adjust.getIdfa());
} }
private void OnAttributionChangedCallback(AdjustAttribution attributionData)
private static void OnAttributionChangedCallback(AdjustAttribution attributionData)
{ {
LogI(LOG_TAG, "Attribution changed!"); LogI(LOG_TAG, "Attribution changed!");
@ -231,7 +252,7 @@ namespace Guru
} }
} }
private static void OnEventSuccessCallback(AdjustEventSuccess eventSuccessData) private void OnEventSuccessCallback(AdjustEventSuccess eventSuccessData)
{ {
LogI(LOG_TAG, "Event tracked successfully!"); LogI(LOG_TAG, "Event tracked successfully!");
@ -266,7 +287,7 @@ namespace Guru
} }
} }
private static void OnEventFailureCallback(AdjustEventFailure eventFailureData) private void OnEventFailureCallback(AdjustEventFailure eventFailureData)
{ {
LogI(LOG_TAG, "Event tracking failed!"); LogI(LOG_TAG, "Event tracking failed!");
@ -303,7 +324,7 @@ namespace Guru
LogI(LOG_TAG, "WillRetry: " + eventFailureData.WillRetry.ToString()); LogI(LOG_TAG, "WillRetry: " + eventFailureData.WillRetry.ToString());
} }
private static void OnSessionFailureCallback(AdjustSessionFailure sessionFailureData) private void OnSessionFailureCallback(AdjustSessionFailure sessionFailureData)
{ {
LogE(LOG_TAG,"Session tracking failed!"); LogE(LOG_TAG,"Session tracking failed!");
@ -329,7 +350,7 @@ namespace Guru
LogI(LOG_TAG,"WillRetry: " + sessionFailureData.WillRetry.ToString()); LogI(LOG_TAG,"WillRetry: " + sessionFailureData.WillRetry.ToString());
} }
*/
#endregion #endregion
#region IAP收入上报 #region IAP收入上报
@ -339,7 +360,7 @@ namespace Guru
/// </summary> /// </summary>
/// <param name="revenue"></param> /// <param name="revenue"></param>
/// <param name="productID"></param> /// <param name="productID"></param>
public static void TrackIAPPurchase(double revenue, string productID) public void TrackIAPPurchase(double revenue, string productID)
{ {
string tokenID = Analytics.GetAdjustEventToken(K_IAP_PURCHASE); string tokenID = Analytics.GetAdjustEventToken(K_IAP_PURCHASE);
if (string.IsNullOrEmpty(tokenID)) if (string.IsNullOrEmpty(tokenID))
@ -358,7 +379,7 @@ namespace Guru
/// </summary> /// </summary>
/// <param name="revenue"></param> /// <param name="revenue"></param>
/// <param name="productID"></param> /// <param name="productID"></param>
public static void TrackSubPurchase(double revenue, string productID) public void TrackSubPurchase(double revenue, string productID)
{ {
string tokenID = Analytics.GetAdjustEventToken(K_SUB_PURCHASE); string tokenID = Analytics.GetAdjustEventToken(K_SUB_PURCHASE);
if (string.IsNullOrEmpty(tokenID)) if (string.IsNullOrEmpty(tokenID))
@ -380,7 +401,7 @@ namespace Guru
/// <param name="adSource"></param> /// <param name="adSource"></param>
/// <param name="adUnitId"></param> /// <param name="adUnitId"></param>
/// <param name="adPlacement"></param> /// <param name="adPlacement"></param>
public static void TrackADRevenue(double value, string currency, string adSource, string adUnitId, string adPlacement) public void TrackADRevenue(double value, string currency, string adSource, string adUnitId, string adPlacement)
{ {
var adRevenue = new AdjustAdRevenue(AdjustConfig.AdjustAdRevenueSourceAppLovinMAX); var adRevenue = new AdjustAdRevenue(AdjustConfig.AdjustAdRevenueSourceAppLovinMAX);
if (string.IsNullOrEmpty(currency)) currency = "USD"; if (string.IsNullOrEmpty(currency)) currency = "USD";
@ -392,35 +413,7 @@ namespace Guru
} }
#endregion #endregion
#region 关键属性上报
/// <summary>
/// 上报PseudoId
/// </summary>
/// <param name="firebaseId"></param>
public static void ReportPseudoID(string firebaseId)
{
if (!string.IsNullOrEmpty(firebaseId))
{
Adjust.addSessionCallbackParameter("user_pseudo_id", firebaseId); // 关联 user_pseudo_id
}
}
/// <summary>
/// 上报DeviceId
/// </summary>
/// <param name="deviceId"></param>
public static void ReportDeviceId(string deviceId)
{
if (!string.IsNullOrEmpty(deviceId))
{
Adjust.addSessionCallbackParameter("device_id", deviceId); // 关联 user_pseudo_id
}
}
#endregion
#region 工具接口 #region 工具接口
private static AdjustEnvironment GetAdjustEnvironment() private static AdjustEnvironment GetAdjustEnvironment()
@ -432,23 +425,22 @@ namespace Guru
#endif #endif
} }
private static AdjustLogLevel GetAdjustLogLevel() private static AdjustLogLevel GetLogLevel(bool showLogs)
{ {
#if UNITY_EDITOR || DEBUG #if UNITY_EDITOR || DEBUG
return AdjustLogLevel.Verbose; return AdjustLogLevel.Verbose;
#else
return AdjustLogLevel.Suppress;
#endif #endif
return showLogs? AdjustLogLevel.Verbose : AdjustLogLevel.Suppress;
} }
public static void LogI(string tag, object conent) private static void LogI(string tag, object content)
{ {
Debug.Log($"{tag} {conent}"); Debug.Log($"{tag} {content}");
} }
public static void LogE(string tag, object conent) private static void LogE(string tag, object content)
{ {
Debug.LogError($"{tag} {conent}"); Debug.LogError($"{tag} {content}");
} }
#endregion #endregion

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: b4c3c75418e9c43c0a14510620fadda4 guid: 8a4c66f5ced9b4b17ae3bc306f01e33f
PluginImporter: PluginImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2

View File

@ -18,7 +18,7 @@
@end @end
static NSString *gameobjectName = @"GuruCallback"; static NSString *gameObjectName = @"GuruCallback";
static NSString *callbackName =@"OnCallback"; static NSString *callbackName =@"OnCallback";
static GuruAnalytics *_analytics; static GuruAnalytics *_analytics;
@ -38,6 +38,9 @@ static double tch001MaxValue = 0.01;
static double tch02MaxValue = 0.2; static double tch02MaxValue = 0.2;
static bool enableErrorLog = false; static bool enableErrorLog = false;
static int eventCountAll;
static int eventCountUploaded;
NSString * const TchAdRevRoas001 = @"tch_ad_rev_roas_001"; NSString * const TchAdRevRoas001 = @"tch_ad_rev_roas_001";
NSString * const TchAdRevRoas02 = @"tch_ad_rev_roas_02"; NSString * const TchAdRevRoas02 = @"tch_ad_rev_roas_02";
NSString * const TchError = @"tch_error"; NSString * const TchError = @"tch_error";
@ -94,6 +97,31 @@ NSString * const TchError = @"tch_error";
} }
} }
// 事件上报回调
+(void) getEventsStatistics {
[GuruAnalytics debug_eventsStatistics:^(NSInteger uploadedEventsCount, NSInteger loggedEventsCount) {
// 上报事件总量
eventCountAll = (int)uploadedEventsCount;
// 上报成功数量
eventCountUploaded = (int)loggedEventsCount;
}];
}
// 设置 BaseUrl
+(void) setBaseUrl: (const char *) baseUrl{
if (baseUrl != nullptr && strlen(baseUrl) == 0) {
return; // baseUrl 为空
}
[GuruAnalytics setEventsUploadEndPointWithHost:[U3DAnalytics charToString:baseUrl]];
}
// 事件上报回调 // 事件上报回调
+(void) onEventCallback: (NSInteger)code andInfo:(NSString *) info{ +(void) onEventCallback: (NSInteger)code andInfo:(NSString *) info{
[U3DAnalytics sendMessage: [U3DAnalytics buildLogEventString: code andMessage:info]]; [U3DAnalytics sendMessage: [U3DAnalytics buildLogEventString: code andMessage:info]];
@ -203,9 +231,9 @@ NSString * const TchError = @"tch_error";
// 向Unity发送数据 // 向Unity发送数据
+(void) sendMessage: (NSString *)msg +(void) sendMessage: (NSString *)msg
{ {
// NSLog(@"--- unityInitSDK222: %@:%@", gameobjectName, callbackName); // NSLog(@"--- unityInitSDK222: %@:%@", gameObjectName, callbackName);
if(gameobjectName != nil && callbackName != nil){ if(gameObjectName != nil && callbackName != nil){
char *t1 = [U3DAnalytics finalChar: gameobjectName]; char *t1 = [U3DAnalytics finalChar: gameObjectName];
char *t2 = [U3DAnalytics finalChar: callbackName]; char *t2 = [U3DAnalytics finalChar: callbackName];
char *t3 = [U3DAnalytics finalChar: msg]; char *t3 = [U3DAnalytics finalChar: msg];
@ -250,7 +278,7 @@ NSString * const TchError = @"tch_error";
extern "C" { extern "C" {
// 请求GDPR // 请求GDPR
void unityInitAnalytics(const char *appId, const char *deviceInfo, bool isDebug, const char *baseUrl, const char *uploadIpAddress) void unityInitAnalytics(const char *appId, const char *deviceInfo, bool isDebug, const char *baseUrl, const char *uploadIpAddressStr)
{ {
// NSLog(@"--- [iOS] init Analytics libs"); // NSLog(@"--- [iOS] init Analytics libs");
[GuruAnalytics initializeLibWithUploadPeriodInSecond:kUploadPeriodInSecond [GuruAnalytics initializeLibWithUploadPeriodInSecond:kUploadPeriodInSecond
@ -260,11 +288,18 @@ extern "C" {
saasXAPPID:[U3DAnalytics charToString:appId] saasXAPPID:[U3DAnalytics charToString:appId]
saasXDEVICEINFO:[U3DAnalytics charToString:deviceInfo] saasXDEVICEINFO:[U3DAnalytics charToString:deviceInfo]
loggerDebug:isDebug]; loggerDebug:isDebug];
// 设置 baseUrl
[U3DAnalytics setBaseUrl:baseUrl];
// 设置 uploadIpAddress
// TODO: 当前的版本并不支持 uploadIpAddress, 后面的版本将 uploadIpAddressStr 转化为 Array<NSString> 传入接口
} }
void unityInitCallback(const char *gameobject, const char *method){ void unityInitCallback(const char *gameObject, const char *method){
// NSLog(@"--- unityInitSDK111: %s:%s", gameobject, method); // NSLog(@"--- unityInitSDK111: %s:%s", gameObject, method);
gameobjectName = [NSString stringWithUTF8String:gameobject]; gameObjectName = [NSString stringWithUTF8String:gameObject];
callbackName = [NSString stringWithUTF8String:method]; callbackName = [NSString stringWithUTF8String:method];
} }
@ -297,11 +332,7 @@ extern "C" {
void unitySetDeviceId(const char *did){ void unitySetDeviceId(const char *did){
[GuruAnalytics setDeviceId:[U3DAnalytics charToString:did]]; [GuruAnalytics setDeviceId:[U3DAnalytics charToString:did]];
} }
// 设置 EndHostUrl
void unitySetEndPointWithHost(const char *host){
[GuruAnalytics setEventsUploadEndPointWithHost:[U3DAnalytics charToString:host]];
}
// 设置用户属性 // 设置用户属性
void unitySetUserProperty(const char *key, const char *value){ void unitySetUserProperty(const char *key, const char *value){
@ -325,23 +356,38 @@ extern "C" {
// 打点事件成功率 // 打点事件成功率
void unityReportEventRate(void){ void unityReportEventRate(void){
[GuruAnalytics debug_eventsStatistics:^(NSInteger uploadedEventsCount, NSInteger loggedEventsCount) { [U3DAnalytics getEventsStatistics];
// 上报事件总量
// 上报事件总量 [GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%d", eventCountAll]
[GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", loggedEventsCount] forName:@"lgd"];
forName:@"lgd"]; // 上报成功数量
// 上报成功数量 [GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%d", eventCountUploaded]
[GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", uploadedEventsCount] forName:@"uld"];
forName:@"uld"];
}];
// [GuruAnalytics debug_eventsStatistics:^(NSInteger uploadedEventsCount, NSInteger loggedEventsCount) {
//
// // 上报事件总量
// [GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", loggedEventsCount]
// forName:@"lgd"];
// // 上报成功数量
// [GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", uploadedEventsCount]
// forName:@"uld"];
// }];
} }
// 注册内部日志 Error 监听 // 注册内部日志 Error 监听
void unitySetEnableErrorLog(bool value){ void unitySetEnableErrorLog(bool value){
[U3DAnalytics setEnableErrorLog:value]; [U3DAnalytics setEnableErrorLog:value];
} }
// 上报事件数量总数
int unityGetEventsCountAll(){
return eventCountAll;
}
// 上报事件数量成功数量
int unityGetEventsCountUploaded(){
return eventCountUploaded;
}
} }

View File

@ -21,10 +21,13 @@ GuruAnalyticsLib 的 Unity 插件库
## Change Logs ## Change Logs
- [SDK Repo [ guru_analytics ] ](git@github.com:castbox/guru_analytics.git)
- [SDK Repo [ GuruAnalytics_iOS ] ](git@github.com:castbox/GuruAnalytics_iOS.git)
### 1.12.0 ### 1.12.0
- Android 端对齐 `1.1.1` - Android 端对齐 `1.1.1` 24 Jul 25
> Hash: bdb41ae118dcf438e8efe4f27d0ec856bc3147b0 > Hash: 6cb6a889022147511fb6bc8a632aa24a54f57c7c
- iOS 端对齐 `0.3.6` - iOS 端对齐 `0.3.6` 24 May 31
> Hash: 0cd5ce7aa64e12caa7413c938a3164687b973843 > Hash: 0cd5ce7aa64e12caa7413c938a3164687b973843
- Pod 库改为 本地文件引用 (配合外部发行项目) - Pod 库改为 本地文件引用 (配合外部发行项目)

View File

@ -19,6 +19,7 @@ namespace Guru
private static GuruAnalytics _instance; private static GuruAnalytics _instance;
public static GuruAnalytics Instance public static GuruAnalytics Instance
{ {
get get
@ -109,41 +110,40 @@ namespace Guru
{ {
Debug.Log($"{Tag} --- Guru Analytics [{Version}] initialing..."); Debug.Log($"{Tag} --- Guru Analytics [{Version}] initialing...");
if (_isReady) return; if (_isReady) return;
if (Agent == null)
{
// Agent 不存在则抛异常
throw new NotImplementedException($"{Tag} Agent is null, please check your implementation of IAnalyticsAgent.");
}
string groupId = "not_set"; string groupId = "not_set";
#if UNITY_ANDROID string baseUrl = "";
string[] uploadIpAddress = null;
bool enabelErrorLog = true;
// 获取云控参数 // 获取云控参数
// TODO: 针对 GuruSDK 整体的云控值做一个分组的解决方案 // TODO: 针对 GuruSDK 整体的云控值做一个分组的解决方案
var guruInitParams = GuruAnalyticsConfigManager.GetInitParams(); var guruInitParams = GuruAnalyticsConfigManager.GetInitParams();
// 记录分组数据
groupId = guruInitParams.groupId; if (guruInitParams != null)
{
// 如果分组实验打开
groupId = guruInitParams.groupId;
baseUrl = guruInitParams.baseUrl;
uploadIpAddress = guruInitParams.uploadIpAddress;
enabelErrorLog = guruInitParams.enableErrorLog;
}
if (!string.IsNullOrEmpty(firebaseId)) if (!string.IsNullOrEmpty(firebaseId))
{ Agent.SetFirebaseId(firebaseId); // 需要提前设置 Firebase ID
// 设置 Firebase ID
Instance.Agent?.SetFirebaseId(firebaseId); // 分组ID赋值
} _experimentGroupId = groupId;
EnableErrorLog = enabelErrorLog;
if (guruInitParams.enabled && Instance.Agent is AnalyticsAgentAndroid androidAgent)
{ // 初始化参数
Instance.EnableErrorLog = true; Agent.Init(appId, deviceInfo, baseUrl, uploadIpAddress, onInitComplete, isDebug);
Instance._experimentGroupId = groupId;
// 强制转换为 Android 的自打点初始化接口
androidAgent.InitAndroidConfig(appId, deviceInfo,
guruInitParams.baseUrl, guruInitParams.uploadIpAddress, // <--- Android 附加参数
onInitComplete, isDebug);
}
else
{
// 外部(云控)如果关闭使用 Android 自打点附加参数, 则使用正常的启动接口
Instance.Agent.Init(appId, deviceInfo, onInitComplete, isDebug);
}
#else
Instance.EnableErrorLog = false;
Instance._experimentGroupId = groupId;
// iOS 使用正常的启动接口
Instance.Agent.Init(appId, deviceInfo, onInitComplete, isDebug);
#endif
_isReady = true; _isReady = true;
Debug.Log($"{Tag} --- Guru Analytics [{Version}] initialized."); Debug.Log($"{Tag} --- Guru Analytics [{Version}] initialized.");

View File

@ -75,11 +75,13 @@ namespace Guru
""experiments"": [{ ""experiments"": [{
""groupId"": ""B"", ""groupId"": ""B"",
""baseUrl"": ""https://collect.saas.castbox.fm"", ""baseUrl"": ""https://collect.saas.castbox.fm"",
""uploadIpAddress"": [""13.248.248.135"", ""3.33.195.44""] ""uploadIpAddress"": [""13.248.248.135"", ""3.33.195.44""],
""enableErrorLog"": true
}, { }, {
""groupId"": ""C"", ""groupId"": ""C"",
""baseUrl"": ""https://collect3.saas.castbox.fm"", ""baseUrl"": ""https://collect3.saas.castbox.fm"",
""uploadIpAddress"": [""34.107.185.54""] ""uploadIpAddress"": [""34.107.185.54""],
""enableErrorLog"": true
}] }]
}"; }";
@ -97,12 +99,8 @@ namespace Guru
/// <param name="baseUrl"></param> /// <param name="baseUrl"></param>
/// <param name="uploadIpAddress"></param> /// <param name="uploadIpAddress"></param>
/// <param name="isEnable"></param> /// <param name="isEnable"></param>
internal static GuruInitParams GetInitParams() internal static GuruAnalyticsExperimentConfig GetInitParams()
{ {
var groupId = "";
var baseUrl = "";
string[] uploadIpAddress = null;
var isEnabled = true;
GuruAnalyticsExperimentConfig config; GuruAnalyticsExperimentConfig config;
if(IsDebug) Debug.LogWarning($"{Tag} --- #0 Analytics EXP saved groupId :{LocalExperimentGroupId}"); if(IsDebug) Debug.LogWarning($"{Tag} --- #0 Analytics EXP saved groupId :{LocalExperimentGroupId}");
@ -147,31 +145,8 @@ namespace Guru
if(IsDebug) Debug.LogWarning($"{Tag} --- #3.1 Try get config is Null -> using Default config"); if(IsDebug) Debug.LogWarning($"{Tag} --- #3.1 Try get config is Null -> using Default config");
} }
if (config != null) return config;
{
baseUrl = config.baseUrl;
groupId = config.groupId;
uploadIpAddress = config.uploadIpAddress;
LocalExperimentGroupId = groupId;
Debug.LogWarning($"{Tag} --- #3 Using Default config:: baseUrl:{baseUrl} groupId:{groupId} uploadIpAddress:[{ (uploadIpAddress != null ? string.Join(",", uploadIpAddress) : "null")}]");
}
else
{
isEnabled = false;
}
Debug.Log($"{Tag} --- Analytics EXP params:: groupId:{groupId} baseUrl:{baseUrl} uploadIpAddress:[{ (uploadIpAddress != null ? string.Join(",", uploadIpAddress) : "null")}]");
return new GuruInitParams()
{
groupId = groupId,
baseUrl = baseUrl,
uploadIpAddress = uploadIpAddress,
enabled = isEnabled
};
} }
private static GuruAnalyticsExperimentConfig GetDefaultGuruAnalyticsExpConfig() private static GuruAnalyticsExperimentConfig GetDefaultGuruAnalyticsExpConfig()
{ {
@ -261,20 +236,11 @@ namespace Guru
public string groupId; public string groupId;
public string baseUrl; public string baseUrl;
public string[] uploadIpAddress; public string[] uploadIpAddress;
public bool enableErrorLog;
public override string ToString() public override string ToString()
{ {
return JsonParser.ToJson(this); return JsonParser.ToJson(this);
} }
} }
[Serializable]
internal class GuruInitParams
{
public string groupId;
public string baseUrl;
public string[] uploadIpAddress;
public bool enabled;
}
} }

View File

@ -7,7 +7,7 @@ namespace Guru
/// </summary> /// </summary>
public interface IAnalyticsAgent public interface IAnalyticsAgent
{ {
void Init(string appId, string deviceInfo, Action onInitComplete, bool isDebug = false); void Init(string appId, string deviceInfo, string baseUrl, string[] uploadIpAddress, Action onInitComplete, bool isDebug = false);
void SetScreen(string screenName); void SetScreen(string screenName);
void SetAdId(string id); void SetAdId(string id);
void SetUserProperty(string key, string value); void SetUserProperty(string key, string value);

View File

@ -71,20 +71,7 @@ namespace Guru
#endregion #endregion
#region 接口实现 #region 接口实现
/// <summary>
/// 默认的启动参数
/// </summary>
/// <param name="appId"></param>
/// <param name="deviceInfo"></param>
/// <param name="onInitComplete"></param>
/// <param name="isDebug"></param>
public void Init(string appId, string deviceInfo, Action onInitComplete, bool isDebug = false)
{
InitAndroidConfig(appId, deviceInfo, "", null, onInitComplete, isDebug); // 调用接口
}
/// <summary> /// <summary>
/// 面向 Android 启动专用的 API /// 面向 Android 启动专用的 API
/// </summary> /// </summary>
@ -94,7 +81,7 @@ namespace Guru
/// <param name="uploadIpAddress"></param> /// <param name="uploadIpAddress"></param>
/// <param name="onInitComplete"></param> /// <param name="onInitComplete"></param>
/// <param name="isDebug"></param> /// <param name="isDebug"></param>
public void InitAndroidConfig(string appId, string deviceInfo, string baseUrl, string[]uploadIpAddress,Action onInitComplete = null, bool isDebug = false) public void Init(string appId, string deviceInfo, string baseUrl, string[] uploadIpAddress,Action onInitComplete = null, bool isDebug = false)
{ {
_isDebug = isDebug; _isDebug = isDebug;
string bundleId = Application.identifier; string bundleId = Application.identifier;
@ -104,6 +91,7 @@ namespace Guru
/********* Android API ********** /********* Android API **********
* Ver U3DAnalytics-1.12.0
public static void init(String appId, public static void init(String appId,
String deviceInfo, String deviceInfo,
String bundleId, String bundleId,
@ -122,10 +110,10 @@ namespace Guru
bool useWorker = true, bool useWorker = true,
bool useCronet = false) bool useCronet = false)
{ {
CallStatic("init", appId, deviceInfo, bundleId, isDebug, useWorker, useCronet, baseUrl, string.Join(",", uploadIpAddress ?? Array.Empty<string>())); // 调用接口 string uploadIpAddressStr= string.Join(",", uploadIpAddress ?? Array.Empty<string>());
CallStatic("init", appId, deviceInfo, bundleId, isDebug, useWorker, baseUrl, uploadIpAddressStr, useCronet); // 调用接口 1.12.0 参数顺序有调整
} }
public void SetScreen(string screenName) public void SetScreen(string screenName)
{ {
if (string.IsNullOrEmpty(screenName)) return; if (string.IsNullOrEmpty(screenName)) return;

View File

@ -13,7 +13,8 @@ namespace Guru
#if UNITY_IOS #if UNITY_IOS
// ------------- U3DAnalytics.mm Interface ----------------- // ------------- U3DAnalytics.mm Interface -----------------
[DllImport(K_INTERNAL)] private static extern void unityInitAnalytics(string appId, string deviceInfo, bool isDebug); // object-c: void unityInitAnalytics(const char *appId, const char *deviceInfo, bool isDebug, const char *baseUrl, const char *uploadIpAddressStr)
[DllImport(K_INTERNAL)] private static extern void unityInitAnalytics(string appId, string deviceInfo, bool isDebug, string baseUrl, string uploadIpAddressStr);
[DllImport(K_INTERNAL)] private static extern void unitySetUserID(string uid); [DllImport(K_INTERNAL)] private static extern void unitySetUserID(string uid);
[DllImport(K_INTERNAL)] private static extern void unitySetScreen(string screenName); [DllImport(K_INTERNAL)] private static extern void unitySetScreen(string screenName);
[DllImport(K_INTERNAL)] private static extern void unitySetAdId(string adId); [DllImport(K_INTERNAL)] private static extern void unitySetAdId(string adId);
@ -56,12 +57,23 @@ namespace Guru
#endif #endif
} }
public void Init(string appId, string deviceInfo, Action onInitComplete, bool isDebug = false) /// <summary>
/// 初始化 SDK
/// </summary>
/// <param name="appId"></param>
/// <param name="deviceInfo"></param>
/// <param name="baseUrl"></param>
/// <param name="uploadIpAddress"></param>
/// <param name="onInitComplete"></param>
/// <param name="isDebug"></param>
public void Init(string appId, string deviceInfo, string baseUrl, string[] uploadIpAddress, Action onInitComplete, bool isDebug = false)
{ {
_isDebug = isDebug; _isDebug = isDebug;
#if UNITY_IOS #if UNITY_IOS
unityInitAnalytics(appId, deviceInfo, isDebug); string uploadIpAddressStr = string.Join(",", uploadIpAddress ?? Array.Empty<string>());
unityInitAnalytics(appId, deviceInfo, isDebug, baseUrl, uploadIpAddressStr);
unityInitException(); // 初始化报错守护进程 unityInitException(); // 初始化报错守护进程
#endif #endif
onInitComplete?.Invoke(); onInitComplete?.Invoke();

View File

@ -27,14 +27,14 @@ namespace Guru
} }
public void Init(string appId, string deviceInfo, Action onInitComplete, bool isDebug = false) public void Init(string appId, string deviceInfo, string baseUrl, string[] uploadIpAddress, Action onInitComplete, bool isDebug = false)
{ {
#if UNITY_EDITOR #if UNITY_EDITOR
_isShowLog = true; _isShowLog = true;
#endif #endif
_isDebug = isDebug; _isDebug = isDebug;
if(_isShowLog)
Debug.Log($"{TAG} init with Debug: <color=orange>{isDebug}</color> appId:{appId} deviceInfo:{deviceInfo}"); Debug.Log($"{TAG} Init {nameof(AnalyticsAgentMock)} with Debug:<color=orange>{isDebug}</color> appId:{appId} deviceInfo:{deviceInfo} baseUrl:{baseUrl} uploadIpAddress:{string.Join(",", uploadIpAddress ?? Array.Empty<string>())}");
onInitComplete?.Invoke(); onInitComplete?.Invoke();
} }
@ -106,28 +106,41 @@ namespace Guru
if(string.IsNullOrEmpty(ss)) continue; if(string.IsNullOrEmpty(ss)) continue;
var p = ss.Split(':'); var p = ss.Split(':');
if (p.Length > 1) if (p.Length > 0)
{ {
var key = p[0].Replace("\"", "").Replace("{", "").Replace("}", ""); var key = p[0].Replace("\"", "").Replace("{", "").Replace("}", "");
var t = p[1].Replace("\"", "").Replace("{", "").Replace("}", "").Substring(0,1); string v = "";
if (p.Length > 1)
{
v = p[1].Replace("\"", "").Replace("{", "").Replace("}", "");
if (!string.IsNullOrEmpty(v) && v.Length > 1)
{
var t = v.Substring(0, 1);
int idx = 0;
if (t == "i" || t == "d") idx = 1;
// 字符串解析
switch (t)
{
case "i":
sb.Append($"<color=orange>{key} : [int] {v}</color>\n");
break;
case "d":
sb.Append($"<color=orange>{key} : [double] {v}</color>\n");
break;
default:
sb.Append($"<color=orange>{key} : [string] {v}</color>\n");
break;
int idx = 0; }
if (t == "i" || t == "d") idx = 1; }
var v = p[1].Replace("\"", "").Replace("{", "").Replace("}", "").Substring(idx); else
{
sb.Append($"<color=orange>{key} : [string] {v}</color>\n");
// 字符串解析 }
switch(t){ }
case "i": else
sb.Append($"<color=orange>{key} : [int] {v}</color>\n"); {
break; sb.Append($"<color=orange>{key} : [string] {v}</color>\n");
case "d":
sb.Append($"<color=orange>{key} : [double] {v}</color>\n");
break;
default:
sb.Append($"<color=orange>{key} : [string] {v}</color>\n");
break;
} }
} }
} }

View File

@ -213,7 +213,7 @@ namespace Guru
CalcTch02Value(revenue); CalcTch02Value(revenue);
// #3 adjust_ad_revenue // #3 adjust_ad_revenue
AdjustService.TrackADRevenue(data.value, data.currency, data.adSource, data.adUnitId, data.networkPlacement); AdjustService.Instance.TrackADRevenue(data.value, data.currency, data.adSource, data.adUnitId, data.networkPlacement);
} }
/// <summary> /// <summary>

View File

@ -53,7 +53,7 @@ namespace Guru
} }
else else
{ {
Log.W(AdjustService.LOG_TAG,$"AdjustEventTokenDict 没有添加 event:{eventName}的Token值"); Log.W(TAG,$"AdjustEventTokenDict 没有添加 event:{eventName}的Token值");
return null; return null;
} }
} }

View File

@ -358,10 +358,10 @@ namespace Guru
} }
public static void LogCrashlytics(Exception exp) public static void LogCrashlytics(Exception ex)
{ {
if (!_isInitOnce) return; if (!_isInitOnce) return;
CrashlyticsAgent.LogException(exp); CrashlyticsAgent.LogException(ex);
} }
#endregion #endregion

View File

@ -73,6 +73,10 @@ namespace Guru
public static void LogException(Exception ex) public static void LogException(Exception ex)
{ {
#if UNITY_EDITOR
Debug.LogException(ex);
return;
#endif
if (!IsFirebaseReady) return; if (!IsFirebaseReady) return;
Crashlytics.LogException(ex); Crashlytics.LogException(ex);
} }