init commit
commit
db327b4157
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 729cc47bf56d436ba4c20380ca1e5e59
|
||||||
|
timeCreated: 1673860499
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Sample Dependencies.xml:
|
||||||
|
https://github.com/googlesamples/unity-jar-resolver/blob/master/sample/Assets/ExternalDependencyManager/Editor/SampleDependencies.xml
|
||||||
|
-->
|
||||||
|
<dependencies>
|
||||||
|
<androidPackages>
|
||||||
|
<androidPackage spec="androidx.core:core:1.7.0" />
|
||||||
|
<!-- <androidPackage spec="androidx.appcompat:appcompat:1.5.1" />-->
|
||||||
|
<androidPackage spec="androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" />
|
||||||
|
<androidPackage spec="androidx.work:work-runtime:2.7.1" />
|
||||||
|
<androidPackage spec="androidx.work:work-runtime-ktx:2.7.1" />
|
||||||
|
<androidPackage spec="androidx.work:work-rxjava2:2.7.1" />
|
||||||
|
<androidPackage spec="androidx.lifecycle:lifecycle-process:2.4.0" />
|
||||||
|
<androidPackage spec="com.jakewharton.timber:timber:4.7.1" />
|
||||||
|
<androidPackage spec="com.google.code.gson:gson:2.8.5" />
|
||||||
|
<androidPackage spec="androidx.room:room-runtime:2.4.3" />
|
||||||
|
<androidPackage spec="androidx.room:room-rxjava2:2.4.3" />
|
||||||
|
<androidPackage spec="com.squareup.retrofit2:retrofit:2.7.1" />
|
||||||
|
<androidPackage spec="com.squareup.retrofit2:converter-gson:2.7.1" />
|
||||||
|
<androidPackage spec="com.squareup.retrofit2:adapter-rxjava2:2.7.1" />
|
||||||
|
<androidPackage spec="com.squareup.okhttp3:okhttp:4.9.3" />
|
||||||
|
|
||||||
|
<!-- <androidPackage spec="com.mapzen:on-the-road:0.8.1" />-->
|
||||||
|
<!-- <androidPackage spec="com.squareup.retrofit2:retrofit:2.7.1" />-->
|
||||||
|
</androidPackages>
|
||||||
|
<iosPods>
|
||||||
|
<iosPod name="GuruAnalyticsLib" version="0.2.16" bitcodeEnabled="false">
|
||||||
|
<sources>
|
||||||
|
<source>git@github.com:castbox/GuruSpecs.git</source>
|
||||||
|
</sources>
|
||||||
|
</iosPod>
|
||||||
|
<iosPod name="JJException" bitcodeEnabled="false" />
|
||||||
|
</iosPods>
|
||||||
|
</dependencies>
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b9cafb1d82bb45598fdd566d9b8f6a80
|
||||||
|
timeCreated: 1674110869
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
-keep class com.guru.** { *; }
|
||||||
|
-keep class guru.core.** { *; }
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fb5e4cd53ce674f5ebbb1d5d865a0127
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9285dfb682d54e929bf0072a504e41b7
|
||||||
|
timeCreated: 1690343284
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Guru;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class GuruUnitTest
|
||||||
|
{
|
||||||
|
private void TestInit(Action callback)
|
||||||
|
{
|
||||||
|
FirebaseUtil.InitFirebase(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Test_Tch001()
|
||||||
|
{
|
||||||
|
TestInit(() =>
|
||||||
|
{
|
||||||
|
double value = 0.0100000000899764;
|
||||||
|
Analytics.Tch001ADRev(value);
|
||||||
|
Analytics.Tch02ADRev(value);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b6fe6b4805b4c40a1aea627baf6c976a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cd9f52a72bd884a9382ae92fc9ec2726
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 127 KiB |
|
|
@ -0,0 +1,133 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 82a7793d183b045eeb9591cc4c15bd76
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 12
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 1
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 0
|
||||||
|
wrapV: 0
|
||||||
|
wrapW: 0
|
||||||
|
nPOTScale: 1
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 0
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 0
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 0
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: iPhone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Android
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
spritePackingTag:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
pSDShowRemoveMatteOption: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cbde866c1fe3a4961b2412feddfe68a3
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2b5e2e7c4d1ed49cfb4b27dcfe69ab5a
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,32 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a336b814594434b4092d38e5ce76577a
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,32 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c5a9f9e11213b4bb78856debe4c967ca
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1f7f3e184bd7d457b9e678321a69ad1b
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
source 'https://github.com/CocoaPods/Specs.git'
|
||||||
|
source 'git@github.com:castbox/GuruSpecs.git'
|
||||||
|
|
||||||
|
platform :ios, '11.0'
|
||||||
|
|
||||||
|
target 'UnityFramework' do
|
||||||
|
|
||||||
|
pod 'GuruAnalyticsLib', '~>0.2.2'
|
||||||
|
# pod 'GuruAnalyticsLib', :git => 'git@github.com:castbox/GuruAnalytics_iOS.git', :branch => 'dev'
|
||||||
|
end
|
||||||
|
target 'Unity-iPhone' do
|
||||||
|
end
|
||||||
|
use_frameworks!
|
||||||
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 10035163694574b63b74cd99c7ee5c68
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,294 @@
|
||||||
|
// ==============================================
|
||||||
|
// U3DConsent.mm
|
||||||
|
// UnityFramework
|
||||||
|
//
|
||||||
|
// Created by EricHu on 2022/11/17.
|
||||||
|
// Copyright © 2022 guru. All rights reserved.
|
||||||
|
// ==============================================
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import "UnityAppController+UnityInterface.h"
|
||||||
|
#import <GuruAnalyticsLib/GuruAnalyticsLib-Swift.h>
|
||||||
|
|
||||||
|
@interface U3DAnalytics : NSObject
|
||||||
|
|
||||||
|
//+ (void)requestGDPR: (NSString *)deviceId :(int) debugGeo;
|
||||||
|
//+ (UIViewController *) getUnityViewController;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
static NSString *gameobjectName;
|
||||||
|
static NSString *callbackName;
|
||||||
|
|
||||||
|
static GuruAnalytics *_analytics;
|
||||||
|
|
||||||
|
|
||||||
|
@implementation U3DAnalytics
|
||||||
|
|
||||||
|
// Const value define
|
||||||
|
NSString * const Version = @"1.8.1";
|
||||||
|
|
||||||
|
static const double kUploadPeriodInSecond = 60.0;
|
||||||
|
static const int kBatchLimit = 15;
|
||||||
|
static const double kEventExpiredSeconds = 7 * 24 * 60 * 60;
|
||||||
|
static const double kInitializeTimeout = 5.0;
|
||||||
|
|
||||||
|
static double tch001MaxValue = 0.01;
|
||||||
|
static double tch02MaxValue = 0.2;
|
||||||
|
NSString * const TchAdRevRoas001 = @"tch_ad_rev_roas_001";
|
||||||
|
NSString * const TchAdRevRoas02 = @"tch_ad_rev_roas_02";
|
||||||
|
NSString * const TchError = @"tch_error";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
+(UnityAppController *)GetAppController {
|
||||||
|
return (UnityAppController*)[UIApplication sharedApplication].delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
+(UIViewController *) getUnityViewController {
|
||||||
|
return UnityGetGLViewController();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 字符串转换
|
||||||
|
+(const char*) stringToChar: (NSString *) str{
|
||||||
|
return [str cStringUsingEncoding:NSASCIIStringEncoding];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+(NSString *) charToString: (const char *) c{
|
||||||
|
return [[NSString alloc] initWithUTF8String:c];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取最终字符串
|
||||||
|
+(char*) finalChar: (NSString *) string
|
||||||
|
{
|
||||||
|
const char *tmpChar = [string cStringUsingEncoding:NSASCIIStringEncoding];
|
||||||
|
|
||||||
|
if (string == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
char* res = (char*)malloc(strlen(tmpChar) + 1);
|
||||||
|
strcpy(res, tmpChar);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置太极02的预设值
|
||||||
|
+(void) setTch02MaxValue: (const double) value{
|
||||||
|
tch02MaxValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建数据
|
||||||
|
//+(NSString *) buildDataString: (int)status andMessage: (NSString *)msg{
|
||||||
|
//
|
||||||
|
// NSString *jsonString = [NSString stringWithFormat: @"{\"action\":\"gdpr\",\"data\":{\"status\":%d,\"msg\":\"%@\"}}", status, msg];
|
||||||
|
// return jsonString;
|
||||||
|
//}
|
||||||
|
|
||||||
|
// 构建数据字典
|
||||||
|
+(NSDictionary<NSString*, id> *) buildDataDict: (NSString *) str{
|
||||||
|
|
||||||
|
NSArray *raw = [str componentsSeparatedByString:@","];
|
||||||
|
if( raw == nil || raw.count == 0) return nil;
|
||||||
|
|
||||||
|
NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; //must init before using
|
||||||
|
|
||||||
|
for(NSString *s in raw ){
|
||||||
|
NSArray *kvp = [s componentsSeparatedByString:@":"];
|
||||||
|
if(kvp == nil || kvp.count < 2){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *k = kvp[0];
|
||||||
|
NSString *t = [kvp[1] substringToIndex:1];
|
||||||
|
NSString *v = [kvp[1] substringFromIndex:1];
|
||||||
|
|
||||||
|
// NSLog(@"---[iOS] parse kvp key:%@ type:%@ value:%@", k, t, v);
|
||||||
|
|
||||||
|
//TODO 解析字符值
|
||||||
|
if([t isEqual: @"i"]){
|
||||||
|
// int
|
||||||
|
[dict setValue:@([v integerValue]) forKey:k];
|
||||||
|
}else if([t isEqual: @"d"]){
|
||||||
|
// double
|
||||||
|
[dict setValue:@([v doubleValue]) forKey:k];
|
||||||
|
} else {
|
||||||
|
// String
|
||||||
|
[dict setValue:v forKey:k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建Json格式的数据字典
|
||||||
|
+(NSMutableDictionary *) buildDataWithJson: (NSString *) json andKey: (NSString *) key{
|
||||||
|
|
||||||
|
if( json == nil || json.length == 0) return nil;
|
||||||
|
|
||||||
|
NSData *jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
|
||||||
|
NSError *err;
|
||||||
|
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData
|
||||||
|
options:NSJSONReadingMutableContainers
|
||||||
|
error:&err];
|
||||||
|
|
||||||
|
if(err || dict == nil)
|
||||||
|
{
|
||||||
|
NSLog(@"json解析失败:%@",err);
|
||||||
|
[U3DAnalytics onTchErrorEvent:@"json_error" andRaw:json andOther:@""];
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 太极数据校验 -------------
|
||||||
|
if(key == TchAdRevRoas001){
|
||||||
|
// tch 001 参数修复
|
||||||
|
[U3DAnalytics fixTchParams: dict andJson:json andMaxValue:tch001MaxValue];
|
||||||
|
} else if(key == TchAdRevRoas02){
|
||||||
|
// tch 02 参数修复
|
||||||
|
[U3DAnalytics fixTchParams: dict andJson:json andMaxValue:tch02MaxValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修复自打点数据
|
||||||
|
+(void) fixTchParams: (NSMutableDictionary *)dict andJson: (NSString *)json andMaxValue: (double) targetValue {
|
||||||
|
// --- 保存 raw数据 ---
|
||||||
|
[dict setValue: json forKey:@"raw"];
|
||||||
|
|
||||||
|
id _platform = [dict objectForKey:@"ad_platform"];
|
||||||
|
id _value = [dict objectForKey:@"value"];
|
||||||
|
|
||||||
|
if([U3DAnalytics isNullObject: _platform]) {
|
||||||
|
// 不存在 ad_paltform
|
||||||
|
[U3DAnalytics onTchErrorEvent:@"no_ad_platform" andRaw:json andOther:@""];
|
||||||
|
} else {
|
||||||
|
// 非IAP订单
|
||||||
|
if(![[_platform stringValue] isEqual:@"appstore"] )
|
||||||
|
{
|
||||||
|
if([U3DAnalytics isNullObject: _value] ){
|
||||||
|
[dict setValue: [NSNumber numberWithDouble: targetValue] forKey:@"value"];
|
||||||
|
[U3DAnalytics onTchErrorEvent:@"no_value" andRaw:json andOther:@""];
|
||||||
|
} else {
|
||||||
|
if([_value doubleValue] < targetValue){
|
||||||
|
[dict setValue: [NSNumber numberWithDouble: targetValue] forKey:@"value"];
|
||||||
|
[U3DAnalytics onTchErrorEvent:@"value_error"
|
||||||
|
andRaw:json andOther: [_value stringValue]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 上报 tch_error 事件
|
||||||
|
+(void) onTchErrorEvent:(NSString *) evtName andRaw: (NSString *)raw andOther: (NSString *) other{
|
||||||
|
NSString *json = [NSString stringWithFormat:@"{\"event\":\"%@\", \"raw\":\"%@\", \"other\":\"%@\"}", evtName, raw, other];
|
||||||
|
|
||||||
|
[GuruAnalytics logEvent:TchError
|
||||||
|
parameters:[U3DAnalytics buildDataWithJson:json andKey:evtName]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 对象判空
|
||||||
|
+ (BOOL)isNullObject:(__kindof id) obj{
|
||||||
|
if(!obj){
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(obj == NULL){
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
if([obj isEqual:[NSNull null]]){
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
//============================ UNITY PUBLIC API ============================
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
// 请求GDPR
|
||||||
|
void unityInitAnalytics(const char *appId, const char *deviceInfo, bool isDebug)
|
||||||
|
{
|
||||||
|
// NSLog(@"--- [iOS] init Analytics libs");
|
||||||
|
[GuruAnalytics initializeLibWithUploadPeriodInSecond:kUploadPeriodInSecond
|
||||||
|
batchLimit:kBatchLimit
|
||||||
|
eventExpiredSeconds:kEventExpiredSeconds
|
||||||
|
initializeTimeout:kInitializeTimeout
|
||||||
|
saasXAPPID:[U3DAnalytics charToString:appId]
|
||||||
|
saasXDEVICEINFO:[U3DAnalytics charToString:deviceInfo]
|
||||||
|
loggerDebug:isDebug];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置用户ID
|
||||||
|
void unitySetUserID(const char *uid){
|
||||||
|
[GuruAnalytics setUserID:[U3DAnalytics charToString:uid]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置用户ID
|
||||||
|
void unitySetScreen(const char *screenName){
|
||||||
|
[GuruAnalytics setScreen:[U3DAnalytics charToString:screenName]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置用户ADID
|
||||||
|
void unitySetAdId(const char *adId){
|
||||||
|
[GuruAnalytics setAdId:[U3DAnalytics charToString:adId]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置用户AdjustID
|
||||||
|
void unitySetAdjustID(const char *adjustId){
|
||||||
|
[GuruAnalytics setAdjustId:[U3DAnalytics charToString:adjustId]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置用户FirebaseID
|
||||||
|
void unitySetFirebaseId(const char *firebaseId){
|
||||||
|
[GuruAnalytics setFirebaseId:[U3DAnalytics charToString:firebaseId]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置用户设备ID
|
||||||
|
void unitySetDeviceId(const char *did){
|
||||||
|
[GuruAnalytics setDeviceId:[U3DAnalytics charToString:did]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置用户属性
|
||||||
|
void unitySetUserProperty(const char *key, const char *value){
|
||||||
|
[GuruAnalytics setUserProperty:[U3DAnalytics charToString:value]
|
||||||
|
forName:[U3DAnalytics charToString:key]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 上报事件
|
||||||
|
void unityLogEvent(const char *key, const char *data){
|
||||||
|
NSString *evtName = [U3DAnalytics charToString:key];
|
||||||
|
NSString *json = [U3DAnalytics charToString:data];
|
||||||
|
|
||||||
|
[GuruAnalytics logEvent: evtName
|
||||||
|
parameters:[U3DAnalytics buildDataWithJson:json andKey:evtName]]; // JSON转换
|
||||||
|
}
|
||||||
|
|
||||||
|
// 上报事件
|
||||||
|
void unitySetTch02Value(const double value){
|
||||||
|
[U3DAnalytics setTch02MaxValue:value];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打点事件成功率
|
||||||
|
void unityReportEventRate(void){
|
||||||
|
[GuruAnalytics debug_eventsStatistics:^(NSInteger uploadedEventsCount, NSInteger loggedEventsCount) {
|
||||||
|
|
||||||
|
// 上报事件总量
|
||||||
|
[GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", loggedEventsCount]
|
||||||
|
forName:@"lgd"];
|
||||||
|
// 上报成功数量
|
||||||
|
[GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", uploadedEventsCount]
|
||||||
|
forName:@"uld"];
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 621002eb5acb547ec95af0d804cfb17f
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
//
|
||||||
|
// JJException.m
|
||||||
|
// UnityFramework
|
||||||
|
//
|
||||||
|
// Created by Castbox on 2023/2/28.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
#import "UnityAppController+UnityInterface.h"
|
||||||
|
#import <JJException/JJException.h>
|
||||||
|
#import <FirebaseCrashlytics/FirebaseCrashlytics.h>
|
||||||
|
|
||||||
|
@interface U3DException : NSObject<JJExceptionHandle>
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation U3DException
|
||||||
|
|
||||||
|
static U3DException *_instance;
|
||||||
|
|
||||||
|
+ (instancetype)sharedInstance {
|
||||||
|
static dispatch_once_t oneToken;
|
||||||
|
dispatch_once(&oneToken,^{
|
||||||
|
_instance = [[self alloc]init];
|
||||||
|
});
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (instancetype)allocWithZone:(NSZone *)zone{
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
_instance = [super allocWithZone:zone];
|
||||||
|
});
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)start {
|
||||||
|
[JJException configExceptionCategory:JJExceptionGuardUnrecognizedSelector];
|
||||||
|
[JJException startGuardException];
|
||||||
|
[JJException registerExceptionHandle:self];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Exception Delegate
|
||||||
|
|
||||||
|
- (void)handleCrashException:(NSString*)exceptionMessage extraInfo:(NSDictionary*)info{
|
||||||
|
NSLog(@"handleCrashException: %@ info: %@", exceptionMessage, info);
|
||||||
|
NSArray *messages = [exceptionMessage componentsSeparatedByString:@"\n"];
|
||||||
|
NSString *domain = @"[U3DException]-handler exception";
|
||||||
|
if (messages.count > 2) {
|
||||||
|
// messages.objectat
|
||||||
|
domain = [messages objectAtIndex:2];
|
||||||
|
}
|
||||||
|
NSError *error = [[NSError alloc] initWithDomain:domain code:-1 userInfo:@{NSLocalizedDescriptionKey: exceptionMessage}];
|
||||||
|
[[FIRCrashlytics crashlytics] recordError:error];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void unityInitException() {
|
||||||
|
[[U3DException sharedInstance] start];
|
||||||
|
}
|
||||||
|
|
||||||
|
void unityTestUnrecognizedSelectorCrash() {
|
||||||
|
[[U3DException sharedInstance] performSelector:NSSelectorFromString(@"testUnrecognizedSelectorCrash")];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 66c93bfd67d2e46f887594e87fa16b39
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
iPhone: iOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
tvOS: tvOS
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,252 @@
|
||||||
|
# Guru Unity Analytics
|
||||||
|
|
||||||
|
GuruAnalyticsLib 的 Unity 插件库
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Change Logs
|
||||||
|
|
||||||
|
### 1.8.4
|
||||||
|
- 优化Android 端 Worker 调用逻辑, 重启 Worker 有助于让打点数据更准确
|
||||||
|
|
||||||
|
### 1.8.3
|
||||||
|
- 修复 fg 打点上报时长不正确的问题
|
||||||
|
|
||||||
|
### 1.8.2
|
||||||
|
- 修复参数类型转换的BUG, param数据转换为JSON对象
|
||||||
|
|
||||||
|
### 1.8.1
|
||||||
|
- 修复自打点浮点参数精度问题
|
||||||
|
- 添加太极020数值设置接口
|
||||||
|
|
||||||
|
### 1.7.5
|
||||||
|
- 删除 `androidx.appcompat:appcompat` 库依赖
|
||||||
|
|
||||||
|
|
||||||
|
</br>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Document
|
||||||
|
|
||||||
|
- 项目整合插件后, **请一定要在各插件的初始化后上报各相关ID**:
|
||||||
|
|
||||||
|
- 相关接口如下
|
||||||
|
|
||||||
|
- ### UID
|
||||||
|
|
||||||
|
```C#
|
||||||
|
|
||||||
|
// ---- 需要等待中台初始化后上报:
|
||||||
|
// 上报中台返回的用户ID
|
||||||
|
string uid = IPMConfig.IPM_UID
|
||||||
|
GuruAnalytics.SetUid(uid);
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- ### DeviceID
|
||||||
|
```C#
|
||||||
|
// 上报设备ID
|
||||||
|
string deviceId = IPMConfig.IPM_DEVICE_ID
|
||||||
|
GuruAnalytics.SetDeviceId(DeviceID);
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- ### FirebaseID
|
||||||
|
```C#
|
||||||
|
|
||||||
|
// ---- 需要Firebase Analytic 初始化后, 异步获取对应的ID:
|
||||||
|
private static async void InitFirebaseAnalytics()
|
||||||
|
{
|
||||||
|
Debug.Log($"---[ANA] IPM UID: {IPMConfig.IPM_UID}");
|
||||||
|
|
||||||
|
var task = FirebaseAnalytics.GetAnalyticsInstanceIdAsync();
|
||||||
|
await task;
|
||||||
|
if (task.IsCompleted)
|
||||||
|
{
|
||||||
|
var fid = task.Result;
|
||||||
|
if (!string.IsNullOrEmpty(fid))
|
||||||
|
{
|
||||||
|
Debug.Log($"---[ANA] Firebase ID: {fid}");
|
||||||
|
GuruAnalytics.SetFirebaseId(fid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("---- Get Firebase Analytics Instance Fail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- ### AdjustID
|
||||||
|
|
||||||
|
```C#
|
||||||
|
|
||||||
|
// ---- Adjust 启动后调用:
|
||||||
|
string adjustID = Adjust.getAdid();
|
||||||
|
GuruAnalytics.SetAdjustId(adjustID);
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- ### AdID
|
||||||
|
|
||||||
|
```C#
|
||||||
|
string adId = "";
|
||||||
|
Adjust.getGoogleAdId(id =>
|
||||||
|
{
|
||||||
|
Debug.Log($"---- [ADJ] ADId: {id}");
|
||||||
|
adId = id;
|
||||||
|
GuruAnalytics.SetAdId(id);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- 上报用户属性:
|
||||||
|
|
||||||
|
```C#
|
||||||
|
|
||||||
|
string item_category = "main";
|
||||||
|
int level = 7;
|
||||||
|
|
||||||
|
GuruAnalytics.SetUserProperty("item_category", item_category);
|
||||||
|
GuruAnalytics.SetUserProperty("level", level.ToString());
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
- 上报视图名称
|
||||||
|
|
||||||
|
```C#
|
||||||
|
|
||||||
|
string screenName = "MainView";
|
||||||
|
GuruAnalytics.SetScreen(screenName);
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
- 上报自定义打点:
|
||||||
|
|
||||||
|
```C#
|
||||||
|
|
||||||
|
string eventName = "user_get_coin";
|
||||||
|
Dictionary<string, dynamic> data = new Dictionary<string, dynamic>()
|
||||||
|
{
|
||||||
|
{ "level", 7 },
|
||||||
|
{ "user_coin", 105L },
|
||||||
|
{ "win_rate", 21.25f },
|
||||||
|
{ "b_level", 7 },
|
||||||
|
{ "result", "retry" }
|
||||||
|
};
|
||||||
|
GuruAnalytics.LogEvent(eventName, data);
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
</br>
|
||||||
|
|
||||||
|
## 依赖台配置说明
|
||||||
|
|
||||||
|
本项目已开始使用 `ExternalDependencyManager` 简称 `EDM` 来解决各种库的依赖问题
|
||||||
|
|
||||||
|
详细配置可见: [Dependencies.xml](Editor/Dependencies.xml)
|
||||||
|
|
||||||
|
IOS 项目注意配置如下图:
|
||||||
|
|
||||||
|
--> 取消勾选 **Link frameworks statically**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### Android 项目配置:
|
||||||
|
|
||||||
|
于主菜单 `BuildSettings/PlayerSettings/PubishSettings:`
|
||||||
|
|
||||||
|
开启如下选项:
|
||||||
|
|
||||||
|
- [x] Custom Main Gradle Template
|
||||||
|
- [x] Custom Properties Gradle Template
|
||||||
|
|
||||||
|
之后会在项目的 `Plugins/Android`内生成对应的文件.
|
||||||
|
|
||||||
|
(A) 修改 `gradleTemplate.properties`
|
||||||
|
|
||||||
|
添加一下内容支持 `AndroidX`
|
||||||
|
|
||||||
|
```java
|
||||||
|
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
|
||||||
|
org.gradle.parallel=true
|
||||||
|
android.enableR8=false
|
||||||
|
unityStreamingAssets=.unity3d**STREAMING_ASSETS**
|
||||||
|
android.useAndroidX=true
|
||||||
|
android.enableJetifier=true
|
||||||
|
**ADDITIONAL_PROPERTIES**
|
||||||
|
```
|
||||||
|
|
||||||
|
(B) 修改 `mainTemplate.gradle`
|
||||||
|
|
||||||
|
于 `dependency` 内添加如下依赖 (目前会自动添加, 无需手动添加)
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
...
|
||||||
|
|
||||||
|
implementation 'androidx.core:core:1.7.0'
|
||||||
|
compile 'com.mapzen:on-the-road:0.8.1'
|
||||||
|
|
||||||
|
// basicDependencies
|
||||||
|
implementation 'androidx.appcompat:appcompat:1.5.1'
|
||||||
|
implementation 'com.jakewharton.timber:timber:4.7.1'
|
||||||
|
implementation 'com.google.code.gson:gson:2.8.5'
|
||||||
|
// roomDependencies
|
||||||
|
implementation 'androidx.room:room-runtime:2.4.3'
|
||||||
|
implementation 'androidx.room:room-rxjava2:2.4.3'
|
||||||
|
// retrofitDependencies
|
||||||
|
implementation 'com.squareup.retrofit2:retrofit:2.7.1'
|
||||||
|
implementation 'com.squareup.retrofit2:converter-gson:2.7.1'
|
||||||
|
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1'
|
||||||
|
// okhttpDependencies
|
||||||
|
implementation 'androidx.work:work-runtime:2.7.1'
|
||||||
|
implementation 'androidx.work:work-runtime-ktx:2.7.1'
|
||||||
|
implementation 'androidx.work:work-rxjava2:2.7.1'
|
||||||
|
// process
|
||||||
|
implementation 'androidx.lifecycle:lifecycle-process:2.4.0'
|
||||||
|
// okhttp3
|
||||||
|
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
|
||||||
|
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
最低 `minTarget` 设置为 **21**
|
||||||
|
|
||||||
|
(D) 修改 `proguard-user.txt` 文件, 在最后追加此插件的相关代码
|
||||||
|
|
||||||
|
若项目使用了 ProGuard 压缩混淆, 需要修改此文件, 否则可能造成JAVA类无法被找到
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
-keep class com.guru.** { *; }
|
||||||
|
-keep class guru.core.** { *; }
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
</br>
|
||||||
|
|
||||||
|
|
||||||
|
## 示例项目
|
||||||
|
|
||||||
|
- 示例项目位于 [~Sample](~Sample) 目录内. 详见 [CuruAnalyticsDemo.cs](~Sample/CuruAnalyticsDemo.cs)
|
||||||
|
- 示例借用了 BallSortPuzzle 的 `AppID` 和 `BundleID`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8def6937882714f739e50c9b1e011967
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1892c569dc49c456f9ae1d99ea76e3b9
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 30c092dbfbc6d4194b436c91ae7290b9
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,247 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Text;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Guru
|
||||||
|
{
|
||||||
|
|
||||||
|
public class GuruAnalytics
|
||||||
|
{
|
||||||
|
// Plugin Version
|
||||||
|
public const string Version = "1.8.4";
|
||||||
|
|
||||||
|
public static readonly string Tag = "[ANA]";
|
||||||
|
private static IAnalyticsAgent _agent;
|
||||||
|
|
||||||
|
public static IAnalyticsAgent Agent
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_agent == null)
|
||||||
|
{
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
_agent = new AnalyticsAgentStub();
|
||||||
|
#elif UNITY_ANDROID
|
||||||
|
_agent = new AnalyticsAgentAndroid();
|
||||||
|
#elif UNITY_IOS
|
||||||
|
_agent = new AnalyticsAgentIOS();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return _agent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Dictionary<string, string> _userProperties;
|
||||||
|
/// <summary>
|
||||||
|
/// 用户属性缓存字典
|
||||||
|
/// </summary>
|
||||||
|
public static Dictionary<string, string> UserProperties
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_userProperties == null)
|
||||||
|
{
|
||||||
|
_userProperties = new Dictionary<string, string>(10);
|
||||||
|
}
|
||||||
|
return _userProperties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region 公用接口
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化接口
|
||||||
|
/// </summary>
|
||||||
|
public static void Init(string appId, string deviceInfo, bool isDebug = false)
|
||||||
|
{
|
||||||
|
Agent?.Init(appId, deviceInfo, isDebug);
|
||||||
|
#if UNITY_IOS
|
||||||
|
// AnalyticsAgentIOS.TestCrashEvent(); // 测试触发一下崩溃事件
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置视图名称
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="screenName"></param>
|
||||||
|
public static void SetScreen(string screenName)
|
||||||
|
{
|
||||||
|
CacheUserProperty($"screen_name", screenName);
|
||||||
|
Agent?.SetScreen(screenName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置广告ID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
public static void SetAdId(string id)
|
||||||
|
{
|
||||||
|
CacheUserProperty($"ad_id", id);
|
||||||
|
Agent?.SetAdId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置用户属性
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
public static void SetUserProperty(string key, string value)
|
||||||
|
{
|
||||||
|
CacheUserProperty(key, value); // 添加用户属性
|
||||||
|
Agent?.SetUserProperty(key, value);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 设置Firebase ID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
public static void SetFirebaseId(string id)
|
||||||
|
{
|
||||||
|
CacheUserProperty($"firebase_id", id);
|
||||||
|
Agent?.SetFirebaseId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置Adjust ID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
public static void SetAdjustId(string id)
|
||||||
|
{
|
||||||
|
CacheUserProperty($"adjust_id", id);
|
||||||
|
Agent?.SetAdjustId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置设备ID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="deviceId"></param>
|
||||||
|
public static void SetDeviceId(string deviceId)
|
||||||
|
{
|
||||||
|
CacheUserProperty($"device_id", deviceId);
|
||||||
|
Agent?.SetDeviceId(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置用户ID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uid"></param>
|
||||||
|
public static void SetUid(string uid)
|
||||||
|
{
|
||||||
|
CacheUserProperty($"uid", uid);
|
||||||
|
Agent?.SetUid(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上报事件成功率
|
||||||
|
/// </summary>
|
||||||
|
public static void ReportEventSuccessRate() => Agent?.ReportEventSuccessRate();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上报打点事件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventName">事件名称</param>
|
||||||
|
/// <param name="data">INT类型的值</param>
|
||||||
|
public static void LogEvent(string eventName, Dictionary<string, dynamic> data = null)
|
||||||
|
{
|
||||||
|
string raw = "";
|
||||||
|
if (data != null && data.Count > 0)
|
||||||
|
{
|
||||||
|
raw = BuildParamsJson(data);
|
||||||
|
}
|
||||||
|
Debug.Log($"{Tag} event:{eventName} | raw: {raw}");
|
||||||
|
Agent?.LogEvent(eventName, raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string BuildParamsString(Dictionary<string, dynamic> data)
|
||||||
|
{
|
||||||
|
string raw = "";
|
||||||
|
List<string> strList = new List<string>(data.Count);
|
||||||
|
foreach (var kvp in data)
|
||||||
|
{
|
||||||
|
strList.Add(BuildStringValue(kvp));
|
||||||
|
raw = string.Join(",", strList);
|
||||||
|
}
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string BuildParamsJson(Dictionary<string, dynamic> data)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 强制转换加入国家设置
|
||||||
|
return JsonConvert.SerializeObject(data, new JsonSerializerSettings()
|
||||||
|
{
|
||||||
|
Culture = new CultureInfo("en-US"),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建带有类型格式的Str值
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="kvp"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string BuildStringValue(KeyValuePair<string, dynamic> kvp)
|
||||||
|
{
|
||||||
|
if (kvp.Value is int || kvp.Value is long)
|
||||||
|
{
|
||||||
|
return $"{kvp.Key}:i{kvp.Value}";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kvp.Value is double || kvp.Value is float)
|
||||||
|
{
|
||||||
|
double dValue = (double)((object)kvp.Value);
|
||||||
|
return $"{kvp.Key}:d{dValue.ToString("F11", new CultureInfo("en-US"))}"; // 保留精度进行转换
|
||||||
|
}
|
||||||
|
|
||||||
|
return $"{kvp.Key}:s{kvp.Value}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置太极02值
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
public static void SetTch02Value(double value)
|
||||||
|
{
|
||||||
|
Debug.Log($"{Tag} set tch_02_value:{value}");
|
||||||
|
Agent?.SetTch02Value(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region iOS独有接口
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
// 触发测试崩溃埋点
|
||||||
|
public static void TestCrash() => AnalyticsAgentIOS.TestCrashEvent();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 用户属性
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 记录用户属性
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
private static void CacheUserProperty(string key, string value)
|
||||||
|
{
|
||||||
|
UserProperties[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 09fd5c799d5d24931a3974af59d496a3
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
namespace Guru
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 自打点代理接口
|
||||||
|
/// </summary>
|
||||||
|
public interface IAnalyticsAgent
|
||||||
|
{
|
||||||
|
void Init(string appId, string deviceInfo, bool isDebug = false);
|
||||||
|
void SetScreen(string screenName);
|
||||||
|
void SetAdId(string id);
|
||||||
|
void SetUserProperty(string key, string value);
|
||||||
|
void SetFirebaseId(string id);
|
||||||
|
void SetAdjustId(string id);
|
||||||
|
void SetDeviceId(string deviceId);
|
||||||
|
void SetUid(string uid);
|
||||||
|
bool IsDebug { get; }
|
||||||
|
void LogEvent(string eventName, string parameters);
|
||||||
|
void ReportEventSuccessRate(); // 上报任务成功率
|
||||||
|
void SetTch02Value(double value); // 设置太极02数值
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0541b7a79e6e44a5aa8ab5cc00218c9b
|
||||||
|
timeCreated: 1672388238
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e9a20f30f62248ac88252dc5958a338b
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
using System;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Guru
|
||||||
|
{
|
||||||
|
public class AnalyticsAgentAndroid: IAnalyticsAgent
|
||||||
|
{
|
||||||
|
|
||||||
|
#if UNITY_ANDROID
|
||||||
|
|
||||||
|
public static readonly string AnalyticsClassName = "com.guru.unity.analytics.Analytics";
|
||||||
|
private static AndroidJavaClass _classAnalytics;
|
||||||
|
private static AndroidJavaClass ClassAnalytics => _classAnalytics ??= new AndroidJavaClass(AnalyticsClassName);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
private static bool _isDebug = false;
|
||||||
|
public static bool UseWorker = true;
|
||||||
|
|
||||||
|
#region 工具方法
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 调用静态方法
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="methodName"></param>
|
||||||
|
/// <param name="args"></param>
|
||||||
|
private static void CallStatic(string methodName, params object[] args)
|
||||||
|
{
|
||||||
|
#if UNITY_ANDROID
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (ClassAnalytics != null)
|
||||||
|
{
|
||||||
|
ClassAnalytics.CallStatic(methodName, args);
|
||||||
|
if(_isDebug) Debug.Log($"{GuruAnalytics.Tag} Android call static :: {methodName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogError(e.Message);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 调用静态方法
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="methodName"></param>
|
||||||
|
/// <param name="args"></param>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
private static T CallStatic<T>(string methodName, params object[] args)
|
||||||
|
{
|
||||||
|
#if UNITY_ANDROID
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (ClassAnalytics != null)
|
||||||
|
{
|
||||||
|
if(_isDebug) Debug.Log($"{GuruAnalytics.Tag} Android call static <{typeof(T).ToString()}> :: {methodName}");
|
||||||
|
return ClassAnalytics.CallStatic<T>(methodName, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogError(e.Message);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return default(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 接口实现
|
||||||
|
|
||||||
|
public void Init(string appId, string deviceInfo, bool isDebug = false)
|
||||||
|
{
|
||||||
|
_isDebug = isDebug;
|
||||||
|
string bundleId = Application.identifier;
|
||||||
|
CallStatic("init", appId, deviceInfo, bundleId, UseWorker, isDebug); // 调用接口
|
||||||
|
}
|
||||||
|
public void SetScreen(string screenName) => CallStatic("setScreen", screenName);
|
||||||
|
public void SetAdId(string id) => CallStatic("setAdId", id);
|
||||||
|
public void SetUserProperty(string key, string value) => CallStatic("setUserProperty", key, value);
|
||||||
|
public void SetFirebaseId(string id) => CallStatic("setFirebaseId", id);
|
||||||
|
public void SetAdjustId(string id) => CallStatic("setAdjustId", id);
|
||||||
|
public void SetDeviceId(string deviceId) => CallStatic("setDeviceId", deviceId);
|
||||||
|
public void SetUid(string uid) => CallStatic("setUid", uid);
|
||||||
|
public bool IsDebug => CallStatic<bool>("isDebug");
|
||||||
|
public void LogEvent(string eventName, string parameters) => CallStatic("logEvent", eventName, parameters);
|
||||||
|
public void ReportEventSuccessRate() => CallStatic("reportEventRate");
|
||||||
|
public void SetTch02Value(double value) => CallStatic("setTch02Value", value);
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 27181ab00e124c639b1f4468c535047c
|
||||||
|
timeCreated: 1672389052
|
||||||
|
|
@ -0,0 +1,124 @@
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Guru
|
||||||
|
{
|
||||||
|
public class AnalyticsAgentIOS: IAnalyticsAgent
|
||||||
|
{
|
||||||
|
|
||||||
|
#region 属性定义
|
||||||
|
|
||||||
|
private const string K_INTERNAL = "__Internal";
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
// ------------- U3DAnalytics.mm Interface -----------------
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unityInitAnalytics(string appId, string deviceInfo, bool isDebug);
|
||||||
|
[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 unitySetAdId(string adId);
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unitySetAdjustID(string adjustId);
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unitySetFirebaseId(string fid);
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unitySetDeviceId(string did);
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unitySetUserProperty(string key, string value);
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unityLogEvent(string key, string data);
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unityReportEventRate();
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unityInitException();
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unityTestUnrecognizedSelectorCrash();
|
||||||
|
[DllImport(K_INTERNAL)] private static extern void unitySetTch02Value(double value);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private static bool _isDebug = false;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 接口实现
|
||||||
|
|
||||||
|
public void Init(string appId, string deviceInfo, bool isDebug = false)
|
||||||
|
{
|
||||||
|
_isDebug = isDebug;
|
||||||
|
#if UNITY_IOS
|
||||||
|
unityInitAnalytics(appId, deviceInfo, isDebug);
|
||||||
|
unityInitException(); // 初始化报错守护进程
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetScreen(string screenName)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetScreen(screenName);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAdId(string id)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetAdId(id);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetUserProperty(string key, string value)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetUserProperty(key, value);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFirebaseId(string fid)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetFirebaseId(fid);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAdjustId(string id)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetAdjustID(id);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDeviceId(string deviceId)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetDeviceId(deviceId);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetUid(string uid)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetUserID(uid);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsDebug => _isDebug;
|
||||||
|
|
||||||
|
public void LogEvent(string eventName, string data)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unityLogEvent(eventName, data);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReportEventSuccessRate()
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unityReportEventRate();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTch02Value(double value)
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
unitySetTch02Value(value);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UNITY_IOS
|
||||||
|
// iOS 测试用事件
|
||||||
|
public static void TestCrashEvent()=> unityTestUnrecognizedSelectorCrash();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 93f0211868c14c60aed081f928dc114e
|
||||||
|
timeCreated: 1672901309
|
||||||
|
|
@ -0,0 +1,122 @@
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Guru
|
||||||
|
{
|
||||||
|
public class AnalyticsAgentStub: IAnalyticsAgent
|
||||||
|
{
|
||||||
|
|
||||||
|
public static readonly string TAG = "[EDT]";
|
||||||
|
|
||||||
|
private bool _isShowLog = false;
|
||||||
|
private bool _isDebug = false;
|
||||||
|
|
||||||
|
|
||||||
|
public void Init(string appId, string deviceInfo, bool isDebug = false)
|
||||||
|
{
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
_isShowLog = true;
|
||||||
|
#endif
|
||||||
|
_isDebug = isDebug;
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} init with Debug: <color=orange>{isDebug}</color> appId:{appId} deviceInfo:{deviceInfo}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetScreen(string screenName)
|
||||||
|
{
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} SetScreen: <color=orange>{screenName}</color>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAdId(string id)
|
||||||
|
{
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} SetAdId: <color=orange>{id}</color>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetUserProperty(string key, string value)
|
||||||
|
{
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} SetUserProperty: <color=orange>{key} : {value}</color>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFirebaseId(string id)
|
||||||
|
{
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} SetFirebaseId: <color=orange>{id}</color>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAdjustId(string id)
|
||||||
|
{
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} SetAdjustId: <color=orange>{id}</color>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetDeviceId(string deviceId)
|
||||||
|
{
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} SetDeviceId: <color=orange>{deviceId}</color>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetUid(string uid)
|
||||||
|
{
|
||||||
|
if(_isShowLog)
|
||||||
|
Debug.Log($"{TAG} SetUid: <color=orange>{uid}</color>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsDebug => _isDebug;
|
||||||
|
|
||||||
|
|
||||||
|
public void LogEvent(string eventName, string parameters)
|
||||||
|
{
|
||||||
|
if (_isShowLog)
|
||||||
|
{
|
||||||
|
var raw = parameters.Split(',');
|
||||||
|
if (raw.Length > 0)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < raw.Length; i++)
|
||||||
|
{
|
||||||
|
var ss = raw[i];
|
||||||
|
if(string.IsNullOrEmpty(ss)) continue;
|
||||||
|
|
||||||
|
var p = ss.Split(':');
|
||||||
|
if (p.Length > 1)
|
||||||
|
{
|
||||||
|
|
||||||
|
var key = p[0];
|
||||||
|
var t = p[1].Substring(0, 1);
|
||||||
|
var v = p[1].Substring(1, p[1].Length - 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Log($"{TAG} LogEvent: event:<color=orange>{eventName}</color> Properties:\n{sb.ToString()}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReportEventSuccessRate()
|
||||||
|
{
|
||||||
|
Debug.Log($"{TAG} Log Event Success Rate");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTch02Value(double value)
|
||||||
|
{
|
||||||
|
Debug.Log($"{TAG} Tch02MaxValue: {value}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8fd78c80a8d44637819c9803c1b71724
|
||||||
|
timeCreated: 1672389623
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"name": "com.guru.unity.analytics",
|
||||||
|
"displayName": "Guru SDK",
|
||||||
|
"version": "1.8.4",
|
||||||
|
"description": "Guru Custom Analytics",
|
||||||
|
"unity": "2020.3",
|
||||||
|
"author":{
|
||||||
|
"name": "Guru Fungames Studio"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"category": "Game,Tool,Development",
|
||||||
|
"dependencies": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 249b5c6c7b433404ea44e9eb2bd35066
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 82693d012b64748c8ac997389b0426a7
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,138 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
namespace Guru
|
||||||
|
{
|
||||||
|
public class CuruAnalyticsDemo: MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private bool _isDebug = true;
|
||||||
|
[SerializeField] private Button _btnInitSDK;
|
||||||
|
[SerializeField] private Button _btnStatus;
|
||||||
|
[SerializeField] private Button _btnUserProperties;
|
||||||
|
[SerializeField] private Button _btnEvents;
|
||||||
|
[SerializeField] private Button _btnEvents2;
|
||||||
|
[SerializeField] private Button _btnReport;
|
||||||
|
[SerializeField] private Button _btnTestCrash;
|
||||||
|
|
||||||
|
// ----------- All Status IDs -----------
|
||||||
|
private static readonly string AdjustID = "e35b41522140fa2db9089ef3c78eb8f9";
|
||||||
|
private static readonly string FirebaseID = "b7ab5fc399a7bc8725c004943fa82837";
|
||||||
|
private static readonly string UID = "BS-YYYYF";
|
||||||
|
private static readonly string AdID = "dda3cc2b-5a5e-44cb-8a59-4a0b1b3780fd";
|
||||||
|
private static readonly string DeviceID = "e2fb3c5a4c36473648c989bd86a41153";
|
||||||
|
private static readonly string AppID = "";
|
||||||
|
private static readonly string DeviceInfo = "";
|
||||||
|
|
||||||
|
|
||||||
|
private static readonly string ScreenName = "MainMenu";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
_btnInitSDK.onClick.AddListener(OnClickInit);
|
||||||
|
_btnStatus.onClick.AddListener(OnClickStatus);
|
||||||
|
_btnUserProperties.onClick.AddListener(OnClickUserProperties);
|
||||||
|
_btnEvents.onClick.AddListener(OnClickEvents);
|
||||||
|
_btnEvents2.onClick.AddListener(OnClickEvents2);
|
||||||
|
_btnReport.onClick.AddListener(OnClickReport);
|
||||||
|
_btnTestCrash.onClick.AddListener(OnClickTestCrash);
|
||||||
|
#if !UNITY_IOS
|
||||||
|
_btnTestCrash.gameObject.SetActive(false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region Button Callbacks
|
||||||
|
|
||||||
|
|
||||||
|
private void OnClickInit()
|
||||||
|
{
|
||||||
|
Debug.Log($"---- [DEMO] Call Analytics init");
|
||||||
|
GuruAnalytics.Init(AppID, DeviceInfo, _isDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnClickStatus()
|
||||||
|
{
|
||||||
|
Debug.Log($"---- [DEMO] Report Stats IDs: UID:{UID} DeviceID:{DeviceID} FirebaseID:{FirebaseID} AdID:{AdID} AdjustID:{AdjustID}");
|
||||||
|
GuruAnalytics.SetUid(UID);
|
||||||
|
GuruAnalytics.SetDeviceId(DeviceID);
|
||||||
|
GuruAnalytics.SetFirebaseId(FirebaseID);
|
||||||
|
GuruAnalytics.SetAdId(AdID);
|
||||||
|
GuruAnalytics.SetAdjustId(AdjustID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnClickUserProperties()
|
||||||
|
{
|
||||||
|
string item_category = "main";
|
||||||
|
int level = 7;
|
||||||
|
Debug.Log($"---- [DEMO] Call SetUserProperty: item_category:{item_category} level:{level}");
|
||||||
|
GuruAnalytics.SetUserProperty("item_category", item_category);
|
||||||
|
GuruAnalytics.SetUserProperty("level", level.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnClickEvents()
|
||||||
|
{
|
||||||
|
Debug.Log($"---- [DEMO] Report Screen: {ScreenName}");
|
||||||
|
GuruAnalytics.SetScreen(ScreenName);
|
||||||
|
|
||||||
|
string eventName = "user_get_coin";
|
||||||
|
Dictionary<string, dynamic> data = new Dictionary<string, dynamic>()
|
||||||
|
{
|
||||||
|
{ "level", 7 },
|
||||||
|
{ "user_coin", 105L },
|
||||||
|
{ "win_rate", 21.25f },
|
||||||
|
{ "b_level", 7 },
|
||||||
|
{ "result", "retry" }
|
||||||
|
};
|
||||||
|
|
||||||
|
string s = "---- Data ----\n";
|
||||||
|
foreach (var k in data.Keys)
|
||||||
|
{
|
||||||
|
s += $"-- K:{k} V:{data[k]}\n";
|
||||||
|
}
|
||||||
|
Debug.Log(s);
|
||||||
|
|
||||||
|
Debug.Log($"---- [DEMO] Call LogEvent");
|
||||||
|
GuruAnalytics.LogEvent(eventName, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnClickEvents2()
|
||||||
|
{
|
||||||
|
string eventName = "user_data_loaded";
|
||||||
|
GuruAnalytics.LogEvent(eventName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void OnClickReport()
|
||||||
|
{
|
||||||
|
GuruAnalytics.ReportEventSuccessRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void OnClickTestCrash()
|
||||||
|
{
|
||||||
|
#if UNITY_IOS
|
||||||
|
Debug.Log($"--> OnClickTestCrash");
|
||||||
|
GuruAnalytics.TestCrash();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8fde2a18f7d347408a6b869ee03e7de9
|
||||||
|
timeCreated: 1672712830
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,7 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ea095a004daab4fc096aa297c21fca99
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Loading…
Reference in New Issue