客户端接入
介绍
TapSDK 提供了一套可供游戏开发者收集账号数据的 API。 系统会收集账号数据并进行分析,最终形成数据报表,帮助游戏开发者分析账号行为并优化游戏。
环境要求
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
- Unity 2019.4 或更高版本
- iOS 11 或更高版本,Xcode 版本 15.3 或更高版本
- Android 5.0(API level 21)或更高版本
Android 5.0(API level 21)或更高版本
Android 5.0(API level 21)或更高版本
iOS 11 或更高版本,Xcode 版本 15.3 或更高版本
iOS 11 或更高版本,Xcode 版本 15.3 或更高版本
权限说明
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
获取网络状态 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
对于可选权限,SDK 不会主动发起申请,只在用户已授权的情况下获取对应数据,需要由开发者决定是否申请。
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
获取网络状态 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
对于可选权限,SDK 不会主动发起申请,只在用户已授权的情况下获取对应数据,需要由开发者决定是否申请。
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
集成前准备
- 参考 准备工作 创建应用、开启应用配置开通数据分析服务;
SDK 集成
请先下载 TapSDK,并添加相关依赖。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
如果只需要单独使用 TapEvent,可以导入依赖 com.taptap.sdk.core
。
接入外部依赖
SDK 内部使用了部分第三方库,开发者接入时需先确保 SDK 外部依赖库已正常接入,具体设置如下:
- SDK 使用的 JSON 解析库为
Newtonsoft-json
,如果当前工程已接入该依赖库,则不需额外处理,否则需在Packages/manifest.json
添加如下依赖:
"com.unity.nuget.newtonsoft-json":"3.2.1"
- SDK 使用
com.google.external-dependency-manager
管理 Android、iOS 依赖,如果当前工程已接入该依赖库,则不需额外处理,否则需在Packages/manifest.json
添加如下依赖:
{
"dependencies": {
"com.google.external-dependency-manager": "1.2.179"
},
"scopedRegistries": [
{
"name": "package.openupm.com",
"url": "https://package.openupm.com",
"scopes": [
"com.google.external-dependency-manager"
]
}
]
}
添加 SDK 依赖
SDK 支持 Unity Package Manager 及本地文件导入两种集成方式,开发者根据需求选择其中一种即可,推荐使用远程依赖。
远程依赖
SDK 支持通过 NPMJS 及 GitHub 两种方式,开发者选择其中一种即可。
1. NPMJS 接入
在项目的 Packages/manifest.json
文件中添加以下依赖:
"dependencies":{
"com.taptap.sdk.core":"4.5.1",
}
但需要注意的是,需在 Packages/manifest.json
中 dependencies
同级下声明 scopedRegistries
:
"scopedRegistries":[
{
"name": "NPMJS",
"url": "https://registry.npmjs.org/",
"scopes": ["com.taptap"]
}
]
2. GitHub 接入
在项目的 Packages/manifest.json
文件中添加以下依赖:
"dependencies":{
"com.taptap.sdk.core":"https://github.com/taptap/TapSDKCore-Unity.git#4.5.1",
}
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
本地文件导入
在 下载页 下载下列模块对应
unitypackage
文件,并在 Unity 项目中依次通过 Assets > Import Packages > Custom Packages 进行导入,包括:TapTapSDK_Core.unitypackage
TapSDK 基础库,必选。
如果当前项目已集成
Newtonsoft.Json
依赖,则忽略该步骤,否则在NuGet.org
Newtonsoft.Json 页面中通过点击右侧 「Download package」 下载库文件,并将下载的文件后缀从.nupkg
修改为.zip
,同时解压该文件并复制内部的Newtonsoft.Json.dll
文件拷贝到工程Assets
的Plugins
目录下,另外为了避免导出 IL2CPP 平台时删除必要数据,需在Assets
目录下创建link.xml
文件(如果已有该文件,则添加如下内容),其内容如下:
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
</assembly>
</linker>
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.5.1'
}
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.5.1'
}
iOS 提供通过添加 cocoaPods 远程依赖和使用本地文件导入两种集成方式,推荐使用远程依赖方式。
远程依赖
- 在工程 Podfile 文件中对应模块下添加依赖:
pod 'TapTapCoreSDK', '~> 4.5.1'
- 执行
Pod install
下载对应依赖文件
本地文件依赖
- 在下载页下载如下文件:
tapsdkcorecpp.xcframework
基础库TapTapBasicToolsSDK.xcframework
基础库TapTapCoreSDK.xcframework
核心库TapTapGidSDK.xcframework
基础库TapTapNetworkSDK.xcframework
基础库THEMISLite.xcframework
基础库
- 在工程中添加
framework
静态库,注意添加时选择 Embed 方式为 Do Not Embed - SDK 内部使用了
Protobuf
依赖库,开发者应提前通过远程或文件导入方式添加对应依赖。
配置编译选项
在 Build Setting 中的 Other Link Flag 中添加
-ObjC
和-Wl -ld_classic
。在 Build Setting 中的 Always Embed Swift Standard Libraries 设置为 YES,即始终引入 Swift 标准库,避免 App 启动时报错「无法找到 Swift 标准库之类」。如果项目中找不到,可以建立一个空 Swift 文件,Xcode 会自动建立桥接关系。
在 Build Setting 中的 Swift Compiler - Language/Swift Language Version 选择 Swift 5。
iOS 提供通过添加 cocoaPods 远程依赖和使用本地文件导入两种集成方式,推荐使用远程依赖方式。
远程依赖
- 在工程 Podfile 文件中对应模块下添加依赖:
pod 'TapTapCoreSDK', '~> 4.5.1'
- 执行
Pod install
下载对应依赖文件
本地文件依赖
- 在下载页下载如下文件:
tapsdkcorecpp.xcframework
基础库TapTapBasicToolsSDK.xcframework
基础库TapTapCoreSDK.xcframework
核心库TapTapGidSDK.xcframework
基础库TapTapNetworkSDK.xcframework
基础库THEMISLite.xcframework
基础库
- 在工程中添加
framework
静态库,注意添加时选择 Embed 方式为 Do Not Embed - SDK 内部使用了
Protobuf
依赖库,开发者应提前通过远程或文件导入方式添加对应依赖。
配置编译选项
在 Build Setting 中的 Other Link Flag 中添加
-ObjC
和-Wl -ld_classic
。在 Build Setting 中的 Always Embed Swift Standard Libraries 设置为 YES,即始终引入 Swift 标准库,避免 App 启动时报错「无法找到 Swift 标准库之类」。如果项目中找不到,可以建立一个空 Swift 文件,Xcode 会自动建立桥接关系。
在 Build Setting 中的 Swift Compiler - Language/Swift Language Version 选择 Swift 5。
如果你曾使用 <3.6.3
的 TapSDK 的数据分析功能,且初始化时区域选择为国际(IO
),那么升级 SDK 至 >=3.6.3
的 TapSDK 前需要先迁移数据。
请提交工单联系我们迁移数据后再升级。
初始化 SDK
在 TapSDK 初始化 时可以配置上报事件所携带的游戏包属性及当前设备的信息,具体使用方式如下:
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
// 核心配置
TapTapSdkOptions coreOptions = new TapTapSdkOptions
{
// 客户端 ID,开发者后台获取
clientId = clientId,
// 客户端令牌,开发者后台获取
clientToken = clientToken,
// 地区,CN 为国内,Overseas 为海外
region = TapTapRegionType.CN,
// 渠道,如 AppStore、GooglePlay
channel = "AppStore",
// 语言,默认为 Auto,默认情况下,国内为 zh_Hans,海外为 en
preferredLanguage = TapTapLanguageType.zh_Hans,
// 游戏版本号,如果不传则默认读取应用的版本号
gameVersion = "1.1.0",
// 初始化时传入的自定义参数,会在初始化时上报到 device_login 事件
propertiesJson = "{\"device_login_custom_key\": \"这是初始化的时候传入的数据,会上报到 device_login 事件\"}",
// CAID,仅国内 iOS
caid = "000-000-0000-00000",
// 是否能够覆盖内置参数,默认为 false
overrideBuiltInParameters = false,
// 是否开启广告商 ID 收集,默认为 false
enableAdvertiserIDCollection = true,
// 是否开启自动上报 IAP 事件
enableAutoIAPEvent = true,
// OAID证书, 仅 Android,用于上报 OAID 仅 [TapTapRegion.CN] 生效
oaidCert = null,
// 是否开启日志,Release 版本请设置为 false
enableLog = true
};
// TapSDK 初始化
TapTapSDK.Init(coreOptions);
// 如果有其他TapTap模块配置可以一起初始化配置, 请使用如下API
// 其他模块配置项
TapTapSdkBaseOptions[] otherOptions = new TapTapSdkBaseOptions[]
{
achievementOptions,
// ...
};
TapTapSDK.Init(coreOptions, otherOptions);
字段 | 可为空 | 说明 |
---|---|---|
clientId | 否 | 客户端 ID,开发者后台获取 |
clientToken | 否 | 客户端令牌,开发者后台获取 |
region | 否 | 地区,CN 为国内,Overseas 为海外 |
preferredLanguage | 是 | 默认为 TapTapLanguageType.Auto, 语言 |
enableLog | 是 | 默认为 false, 是否开启日志,Release 版本请设置为 false |
channel | 是 | 渠道,如 AppStore、GooglePlay |
gameVersion | 是 | 游戏版本号,如果不传则默认读取应用的版本号 |
propertiesJson | 是 | 初始化时传入的自定义参数,会在初始化时上报到 device_login 事件 |
caid | 是 | CAID,仅国内 iOS |
overrideBuiltInParameters | 是 | 是否能够覆盖内置参数,默认为 false |
enableAdvertiserIDCollection | 是 | 是否开启广告商 ID 收集,仅 iOS ,默认为 false,开启时需添加工程配置 |
enableAutoIAPEvent | 是 | 是否开启自动上报 IAP 事件 |
oaidCert | 是 | OAID证书, 仅 Android,用于上报 OAID 仅 [TapTapRegion.CN] 生效 |
TapTapSdkOptions
详细参数见 入门指南#快速开始
import com.taptap.sdk.core.TapTapRegion;
import com.taptap.sdk.core.TapTapSdk;
import com.taptap.sdk.core.TapTapSdkOptions;
/* 必选配置 */
// 开发者中心对应 Client ID
String clientId = "";
// 开发者中心对应 Client Token
String clientToken = "";
// 是否开启 log,建议 Debug 开启,Release 关闭,默认关闭 log
boolean enableLog = BuildConfig.DEBUG;
TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
clientId, // 游戏 Client ID
clientToken, // 游戏 Client Token
TapTapRegion.CN // 游戏可玩区域: [TapTapRegion.CN]=国内 [TapTapRegion.GLOBAL]=海外
);
tapSdkOptions.setEnableLog(enableLog);
// 初始化 TapSDK
TapTapSdk.init(context, tapSdkOptions);
TapTapSdkOptions
详细参数见 入门指南#快速开始
import com.taptap.sdk.core.TapTapSdk
import com.taptap.sdk.core.TapTapSdkOptions
import com.taptap.sdk.core.TapTapRegion
import com.taptap.sdk.core.TapTapLanguage
TapTapSdk.init(
context = context,
sdkOptions = TapTapSdkOptions(
clientId = clientId,
clientToken = clientToken,
region = TapTapRegion.CN,
preferredLanguage = TapTapLanguage.ZH_HANS,
enableLog = false
)
)
import TapTapCoreSDK
let options = TapTapSdkOptions()
// TODO: 应用信息配置
// 数据分析相关属性配置
options.channel = "channel name" // 分包渠道名称
options.gameVersion = "gameVersion" // 游戏版本(默认会读取主包 info.plist 中的版本号)
options.caid = "caid" // 国内 iOS CAID
options.overrideBuiltInParameters = true // 自定义字段是否能覆盖内置字段,默认 false
options.enableAdvertiserIDCollection = false // 是否可以获取 IDFA,默认值为 false
options.enableAutoIAPEvent = false // 是否自动上报苹果内购支付成功事件
// 自定义属性配置
let properties = ["custom_key": "value"]
options.properties = properties // 自定义属性,启动首个预置事件(device_login)会携带该属性
// 初始化 SDK
TapTapSDK.initWith(options)
注意:启用 IDFA 时需添加工程配置
#import "TapTapCoreSDK/TapTapSDK.h"
TapTapSdkOptions *options = [[TapTapSdkOptions alloc] init];
// TODO: 应用信息配置
// 数据分析相关属性配置
options.channel = @"channel name"; // 分包渠道名称
options.gameVersion = @"gameVersion"; // 游戏版本(默认会读取主包 info.plist 中的版本号)
options.caid = @"caid"; // 国内 iOS CAID
options.overrideBuiltInParameters = YES; // 自定义字段是否能覆盖内置字段,默认 false
options.enableAdvertiserIDCollection = NO; // 是否可以获取 IDFA,默认值为 false
options.enableAutoIAPEvent = NO; // 是否自动上报苹果内购支付成功事件
// 自定义属性配置
NSDictionary *properties = @{@"custom_key": @"value"};
options.properties = properties; // 自定义属性,启动首个预置事件(device_login)会携带该属性
// 初始化 SDK
[TapTapSDK initWithOptions:options];
设置账号
设置账号 ID
调用该 API 记录一个账号,当账号登录时调用。
调用后会上报一个账号登录( user_login
)事件,并将这个设备的是否有用户注册过( has_user
)属性置为 true
。
在重启应用或调用清除账号 ID( clearUser
)前,上报的事件都会带有该账号 ID。
字段 | 可为空 | 说明 |
---|---|---|
userId | 否 | 账号的唯一字符串,字符串长度不大于 160,只能包含数字、大小写字母、下划线(_ )、短横(- )、加号(+ )、正斜线(/ )、等号(= )、英文句号(. )、英文逗号(, )、英文冒号(: )开发者需要保证不同账号的 userId 均不相同。 |
properties | 是 | 账号登录( user_login )的事件属性 |
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core
// 自定义属性
var dict = new Dictionary<string, string>();
dict.Add(key, value);
dict.Add(key2, value2);
string properties = dict.toJson();
// 设置用户 ID 及账号登录事件属性
TapTapEvent.SetUserID(userId, properties);
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 自定义属性
properties.put("key1", "value1");
properties.put("key2", "value2");
} catch (Exception e) {
e.printStackTrace();
}
// 设置用户 ID 及账号登录事件属性
TapTapEvent.setUserId("userId", properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.setUserId(userId = "userId", properties = properties)
import TapTapCoreSDK
// 设置用户 ID
TapTapEvent.setUserID(userId)
// 设置用户 ID 及账号登录事件属性
var properties = [String: Any]()
properties["currentPoints"] = 10
TapTapEvent.setUserID(userId, properties: properties)
#import "TapTapCoreSDK/TapTapEvent.h"
// 设置用户 ID
[TapTapEvent setUserID:@"userId"];
// 设置用户 ID 及账号登录事件属性
NSMutableDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setObject: @(10) forKey:@"currentPoints"];
[TapTapEvent setUserID:@"userId" properties:properties];
清除账号 ID
当用户进行登出时,可调用 clearUser
清除当前 SDK 中保存的账号 ID,后续上报的事件将不会带有账号 ID,调用该接口不会上报任何事件。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core
TapTapEvent.ClearUser();
import com.taptap.sdk.core.TapTapEvent;
TapTapEvent.clearUser();
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.clearUser()
import TapTapCoreSDK
TapTapEvent.clearUser()
#import "TapTapCoreSDK/TapTapEvent.h"
[TapTapEvent clearUser];
上报充值记录
在用户进行充值后,可调用该接口上报充值信息,调用后将上报 charge
事件,并将传入的参数作为事件的属性。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core
TapTapEvent.LogChargeEvent(
orderID: orderID,
productName: productName,
amount: amount,
currencyType: currencyType,
paymentMethod: paymentMethod,
properties: properties
);
字段 | 可为空 | 说明 |
---|---|---|
orderID | 否 | 订单 ID |
productName | 否 | 产品名称 |
amount | 否 | 充值金额(单位分,即无论什么币种,都需要乘以 100) |
currencyType | 否 | 货币类型,遵循 ISO 4217 标准。参考:人民币 CNY,美元 USD;欧元 EUR |
paymentMethod | 否 | 支付方式,如:支付宝 |
properties | 否 | 充值( charge )的事件属性 |
import com.taptap.sdk.core.TapTapEvent;
import com.taptap.sdk.core.TapTapPurchasedEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 自定义属性
properties.put("key1", "value1");
properties.put("key2", "value2");
} catch (Exception e) {
e.printStackTrace();
}
TapTapPurchasedEvent purchasedEvent = new TapTapPurchasedEvent(
"orderId", // 订单 ID
"productName", // 产品名称
10000.0, // 充值金额(单位分,即无论什么币种,都需要乘以 100)
"CNY", // 货币类型,遵循 ISO 4217 标准。参考:人民币 CNY,美元 USD;欧元 EUR
"支付宝", // 支付方式,如:支付宝
properties// 充值( charge )的事件属性
);
TapTapEvent.logPurchasedEvent(purchasedEvent);
import com.taptap.sdk.core.TapTapEvent
import com.taptap.sdk.core.TapTapPurchasedEvent
TapTapEvent.logPurchasedEvent(
purchasedEvent = TapTapPurchasedEvent(
orderId = orderId,
productName = productName,
amount = amount,
currencyType = currencyType,
paymentMethod = paymentMethod,
properties = properties
)
)
import TapTapCoreSDK
let orderId = "订单 ID"
// 定义充值事件属性
var properties = [String: Any]()
properties["on_sell"] = true
// 上报充值事件
TapTapEvent.logPurchasedEvent(orderId, productName:"商品名", amount: 100, currencyType: "CNY", paymentMethod:"支付宝", properties: properties)
参数 | 可为空 | 说明 |
---|---|---|
orderId | 否 | 订单 ID |
product | 是 | 产品名称 |
amount | 否 | 充值金额(单位分,即无论什么币种,都需要乘以 100) |
currencyType | 是 | 货币类型,遵循 ISO 4217 标准。参考:人民币 CNY,美元 USD;欧元 EUR |
payment | 是 | 支付方式,如:支付宝 |
properties | 是 | 充值( charge )的事件属性 |
#import "TapTapCoreSDK/TapTapEvent.h"
// 定义充值事件属性
NSMutableDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setObject: @(1) forKey:@"on_sell"];
// 上报充值事件
[TapTapEvent logPurchasedEvent:@"orderId" productName:@"product" amount:100 currencyType:@"CNY" paymentMethod:@"支付宝" properties:properties];
参数 | 可为空 | 说明 |
---|---|---|
orderId | 否 | 订单 ID |
product | 是 | 产品名称 |
amount | 否 | 充值金额(单位分,即无论什么币种,都需要乘以 100) |
currencyType | 是 | 货币类型,遵循 ISO 4217 标准。参考:人民币 CNY,美元 USD;欧元 EUR |
payment | 是 | 支付方式,如:支付宝 |
properties | 是 | 充值( charge )的事件属性 |
注意:在条件允许的情况下推荐使用服务端充值统计接口,请参考 服务端接入文档
自定义事件
上报事件
在 SDK 初始化完成后可使用该接口上报事件
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core
var dict = new Dictionary<string, string>
{
{ key, value },
{ key2, value2 }
};
string properties = dict.toJson();
TapTapEvent.LogEvent(name, properties);
字段 | 可为空 | 说明 |
---|---|---|
name | 否 | 事件的名称 |
properties | 否 | 事件的属性 JSONString |
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 定义事件属性
properties.put("key1", "value1");
properties.put("key2", "value2");
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.logEvent("eventName", properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.logEvent(name = title,properties = properties)
import TapTapCoreSDK
// 定义事件属性
var properties = [String: Any]()
properties["#weapon"] = "axe"
properties["#level"] = 10
// 发送自定义事件
TapTapEvent.logEvent(eventName, properties: properties)
参数 | 可为空 | 说明 |
---|---|---|
eventName | 否 | 事件的名称 |
properties | 是 | 事件的属性 |
#import "TapTapCoreSDK/TapTapEvent.h"
// 定义事件属性
NSMutableDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setObject: @"axe" forKey:@"#weapon"];
[properties setObject:@(10) forKey:@"#level"];
// 发送自定义事件
[TapTapEvent logEvent:@"event_name" properties:properties];
参数 | 可为空 | 说明 |
---|---|---|
eventName | 否 | 事件的名称 |
properties | 是 | 事件的属性 |
注意:
- 事件名支持上报预置事件和自定义事件,其中自定义事件应以
#
开头 - 事件属性的 key 值为属性的名称,支持 NSString 类型
- 事件属性的 value 值为属性的名称,支持 NSString(最大长度
256
)、NSNumber(取值区间为[-9E15, 9E15]
)类型 - 事件属性支持上报预置属性和自定属性,其中自定义属性应以
#
开头 - 事件属性传入预置属性时,SDK 默认采集的预置属性将不被覆盖, 这个可以再初始化时候修改配置
overrideBuiltInParameters
控制。
设置通用事件属性
对于一些所有事件都要携带的属性,建议使用通用事件属性实现。
添加静态通用事件属性
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core
// 添加单个属性
var key = kv["key"];
var value = kv["value"];
TapTapEvent.AddCommonProperty(key, value);
// 添加多个属性
var key = kv["key"];
var value = kv["value"];
var key2 = kv["key2"];
var value2 = kv["value2"];
var dict = new Dictionary<string, string>
{
{ key, value },
{ key2, value2 }
};
string properties = dict.toJson();
TapTapEvent.AddCommon(properties);
字段 | 可为空 | 说明 |
---|---|---|
properties | 否 | 事件的属性 JSONString |
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 通用事件属性
properties.put("key1", "value1");
properties.put("key2", "value2");
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.addCommon(properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.addCommon(properties = properties)
import TapTapCoreSDK
// 定义通用事件属性
var staticProperties = [String: Any]()
// 当设置属性 "#current_channel" 为 "TapDB" 时, 后续事件上报都会在事件属性中添加了 "#current_channel"字段
staticProperties["#current_channel"] = "TapDB"
// 设置通用事件属性
TapTapEvent.addCommon(staticProperties)
#import "TapTapCoreSDK/TapTapEvent.h"
// 定义通用事件属性
NSMutableDictionary *staticProperties = [[NSMutableDictionary alloc] init];
// 当设置属性 "#current_channel" 为 "TapDB" 时, 后续事件上报都会在事件属性中添加了 "#current_channel"字段
[staticProperties setObject: @"TapDB" forKey:@"#current_channel"];
// 设置通用事件属性
[TapTapEvent addCommon:staticProperties];
删除部分静态通用事件属性
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core
// 删除单个属性
TapTapEvent.ClearCommonProperty(key);
// 删除多个属性
var key1 = kv["key"];
var key2 = kv["value"];
var keysToClear = new string[] { key1, key2 };
TapTapEvent.ClearCommonProperties(keysToClear);
import com.taptap.sdk.core.TapTapEvent;
String[] keys = new String[]{"key1", "key1"};
TapTapEvent.clearCommonProperties(keys);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.clearCommonProperties(
keys = arrayOf(
"key1",
"key2",
"key3"
)
)
import TapTapCoreSDK
// 定义需要删除的通用事件属性名称
let propertyNames = [propertyName1, propertyName2]
// 从通用事件属性中移除
TapTapEvent.clearCommonProperties(propertyNames)
参数 | 可为空 | 说明 |
---|---|---|
propertyNames | 否 | 静态通用属性名称数组 |
#import "TapTapCoreSDK/TapTapEvent.h"
// 定义需要删除的通用事件属性名称
NSArray *propertyNames = @[@"propertyName1", @"propertyName2"];
// 从通用事件属性中移除
[TapTapEvent clearCommonProperties:propertyNames];
参数 | 可为空 | 说明 |
---|---|---|
propertyNames | 否 | 静态通用属性名称数组 |
清空全部静态通用属性
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core
TapTapEvent.ClearAllCommonProperties();
import com.taptap.sdk.core.TapTapEvent;
TapTapEvent.clearAllCommonProperties();
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.clearAllCommonProperties()
import TapTapCoreSDK
TapTapEvent.clearAllCommonProperties()
#import "TapTapCoreSDK/TapTapEvent.h"
[TapTapEvent clearAllCommonProperties];
注册动态通用事件属性
对于可能随时发生变化的通用事件属性,可以注册动态通用事件属性回调,该回调会在每次调用时被触发,将计算好的属性添加到本次上报事件属性中。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
// 后续上报的事件都将携带 #currentTime 属性,值为变量 currentTime 在事件上报时刻的值
TapTapEvent.RegisterDynamicProperties(() =>
{
string currentTime = DateTime.Now.ToString("o");
Debug.Log("RegisterDynamicProperties currentTime" + currentTime);
return $"{{ \"currentTime\": \"{currentTime}\" }}";
});
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
TapTapEvent.TapEventDynamicProperties dynamicProperties = new TapTapEvent.TapEventDynamicProperties() {
@Override
public JSONObject getDynamicProperties() {
JSONObject properties = new JSONObject();
try {
// 动态通用事件属性
properties.put("key1", "value1");
properties.put("key2", "value2");
properties.put("currentTimeMillis", System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
return properties;
}
};
TapTapEvent.registerDynamicProperties(dynamicProperties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.registerDynamicProperties(
dynamic = object : TapTapEvent.TapEventDynamicProperties {
override fun getDynamicProperties(): JSONObject {
// return JSONObject
}
}
)
import TapTapCoreSDK
// 后续上报的事件都将携带 #currentLevel 属性,值为变量 level 在事件上报时刻的值
TapTapEvent.registerDynamicProperties {
return ["#currentLevel": level]
}
#import "TapTapCoreSDK/TapTapEvent.h"
// 后续上报的事件都将携带 #currentLevel 属性,值为变量 level 在事件上报时刻的值
[TapTapEvent registerDynamicProperties:^NSDictionary * _Nonnull{
return @{@"currentLevel": level};
}];
注意:
在上报事件或通用属性中使用相同属性名会出现属性覆盖的现象,属性覆盖的优先级从高到低依次为:事件属性、动态通用事件属性、静态通用事件属性、预置属性(例如 trackEvent
中设置的事件属性将覆盖动态通用事件属性、静态通用事件属性、预置属性中的同名属性)
修改用户属性
TapDB 支持两种用户主体:设备和账号,你可以通过如下接口对这两种用户的属性进行操作。
修改设备属性
设备属性初始化
对于需要保证只有首次设置时有效的属性,可以使用该接口进行赋值操作,仅当前值为空时赋值操作才会生效,如当前值不为空,则赋值操作会被忽略。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
string properties = "{\"firstActiveServer\":\"server1\"}";
TapTapEvent.DeviceInitialize(properties);
// 此时设备表的 "#firstActiveServer" 字段值为 "server1"
string properties2 = "{\"firstActiveServer\":\"server2\"}";
TapTapEvent.DeviceInitialize(properties2);
// 此时设备表的 "#firstActiveServer" 字段值还是为 "server1"
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 设备属性初始化属性
properties.put("key1", "value1");
properties.put("key2", "value2");
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.deviceInitialize(properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.deviceInitialize(properties = properties)
import TapTapCoreSDK
var properties = [String: Any]()
properties["firstActiveServer"] = "server1"
// 该方法执行后设备表的 "#firstActiveServer" 字段值为 "server1"
TapTapEvent.deviceInitialize(properties)
// 多次设置同一属性时,后续执行不会生效,例如如下调用不会更新 "firstActiveServer" 的值
// TapTapEvent.deviceInitialize(["firstActiveServer":"server2"])
参数 | 可为空 | 说明 |
---|---|---|
properties | 否 | 属性字典 |
#import "TapTapCoreSDK/TapTapEvent.h"
NSMutableDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setObject: @"server1" forKey:@"firstActiveServer"];
// 该方法执行后设备表的 "#firstActiveServer" 字段值为 "server1"
[TapTapEvent deviceInitialize:properties];
// 多次设置同一属性时,后续执行不会生效,例如如下调用不会更新 "firstActiveServer" 的值
//[TapTapEvent deviceInitialize:@{@"firstActiveServer":@"server2"}];
参数 | 可为空 | 说明 |
---|---|---|
properties | 否 | 属性字典 |
设备属性更新
对于常规的设备属性,可使用该接口进行赋值操作,新的属性值将会直接覆盖旧的属性值。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
string properties = "{\"currentPoints\":10}";
TapTapEvent.DeviceUpdate(properties);
// 此时设备表的 "currentPoints" 字段值为 10
properties = "{\"currentPoints\":42}";
TapTapEvent.DeviceUpdate(properties);
// 此时设备表的 "currentPoints" 字段值为 42
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 设备属性更新属性
properties.put("key1", "value1");
properties.put("key2", "value2");
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.deviceUpdate(properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.deviceUpdate(properties = properties)
import TapTapCoreSDK
// 定义要更新的属性
var properties = [String: Any]()
properties["currentPoints"] = 10
// 该方法执行后,此时设备表的 "currentPoints" 字段值为 10
TapTapEvent.deviceUpdate(properties)
// 多次执行时会更新属性,例如执行以下方法时,此时设备表的 "currentPoints" 字段值为 42
// TapTapEvent.deviceUpdate(["currentPoints":42])
参数 | 可为空 | 说明 |
---|---|---|
properties | 否 | 属性字典 |
#import "TapTapCoreSDK/TapTapEvent.h"
// 定义要更新的属性
NSMutableDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setObject: @(10) forKey:@"currentPoints"];
// 该方法执行后,此时设备表的 "currentPoints" 字段值为 10
[TapTapEvent deviceUpdate:properties];
// 多次执行时会更新属性,例如执行以下方法时,此时设备表的 "currentPoints" 字段值为 42
[TapTapEvent deviceUpdate:@{@"currentPoints":@(42)}];
参数 | 可为空 | 说明 |
---|---|---|
properties | 否 | 属性字典 |
设备属性累加
对于数值类型的属性,可以使用该接口进行累加操作,调用后 TapDB 将对原属性值进行累加后保存结果值
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
string properties = "{\"totalPoints\":10}";
TapTapEvent.DeviceAdd(properties);
// 此时设备表的 "totalPoints" 字段值为 10
properties = "{\"totalPoints\":-2}";
TapTapEvent.DeviceAdd(properties);
// 此时设备表的 "totalPoints" 字段值为 8
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 设备属性累加属性
properties.put("key2", 100);
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.deviceAdd(properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.deviceAdd(properties = properties)
import TapTapCoreSDK
// 定义要累加的属性
var properties =[String: Any]()
properties["totalPoints"] = 10
// 执行该方法后,此时设备表的 "totalPoints" 字段值为 10
TapTapEvent.deviceAdd(properties)
// 执行该方法后,此时设备表的 "totalPoints" 字段值为 8
TapTapEvent.deviceAdd(["totalPoints":-2])
参数 | 可为空 | 说明 |
---|---|---|
properties | 否 | 属性字典,value 仅支持数字类型 |
#import "TapTapCoreSDK/TapTapEvent.h"
// 定义要累加的属性
NSMutableDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setObject: @(10) forKey:@"totalPoints"];
// 执行该方法后,此时设备表的 "totalPoints" 字段值为 10
[TapTapEvent deviceAdd:properties];
// 执行该方法后,此时设备表的 "totalPoints" 字段值为 8
[TapTapEvent deviceAdd:@{@"currentPoints":@(-2)}];
参数 | 可为空 | 说明 |
---|---|---|
properties | 否 | 属性字典,value 仅支持数字类型 |
上述代码示例中,属性值为整数。 累加操作也支持浮点数,不过浮点数相加有精度问题,开发者还需留意。
修改账号属性
账号属性初始化
使用方法同设备属性初始化操作
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
string properties = "{\"firstActive\":\"active\"}";
TapTapEvent.UserInitialize(properties);
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 账号初始化属性
properties.put("key1", "value1");
properties.put("key2", 100);
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.userInitialize(properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.userInitialize(properties = properties)
import TapTapCoreSDK
var properties = [String: Any]()
properties["firstActiveServer"] = "server1"
TapTapEvent.userInitialize(properties)
#import "TapTapCoreSDK/TapTapEvent.h"
NSMutableDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setObject: @"server1" forKey:@"firstActiveServer"];
[TapTapEvent userInitialize:properties];
账号属性更新
使用方法同设备属性更新操作
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
string properties = "{\"firstActive\":\"activeNew\"}";
TapTapEvent.UserUpdate(properties);
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 账号更新属性
properties.put("key1", "value1");
properties.put("key2", 100);
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.userUpdate(properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.userUpdate(properties = properties)
import TapTapCoreSDK
TapTapEvent.userUpdate(["firstActiveServer":"server2"])
#import "TapTapCoreSDK/TapTapEvent.h"
[TapTapEvent userUpdate:@{@"firstActiveServer":@"server2"}];
账号属性累加
使用方法同设备属性累加操作
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
using TapSDK.Core;
string properties = "{\"conut\":1}";
TapTapEvent.UserAdd(properties);
import com.taptap.sdk.core.TapTapEvent;
import org.json.JSONObject;
JSONObject properties = new JSONObject();
try {
// 账号累加属性
properties.put("key2", 100);
} catch (Exception e) {
e.printStackTrace();
}
TapTapEvent.userAdd(properties);
import com.taptap.sdk.core.TapTapEvent
TapTapEvent.userAdd(properties = properties)
import TapTapCoreSDK
TapTapEvent.userAdd(["totalPoints": 10])
#import "TapTapCoreSDK/TapTapEvent.h"
[TapTapEvent userAdd:@{@"totalPoints":@(10)}];
收集设备指纹
允许 SDK 采集设备指纹用于辅助数据分析、广告归因,将使统计结果更加精确,
请在权限申请、设置 IDFA 开关等操作结束后初始化 SDK,以保证设备指纹能够正常上报。
OAID(Android)
注意:SDK 版本 3.28.2 及以上支持 OAID 版本为 1.0.5 ~ 2.4.0; 3.15.0 ~ 3.28.0 支持 OAID 版本为 1.0.5 ~ 2.1.0; 3.14.0 及以下支持 OAID 版本为 1.0.5 ~ 1.0.25
TapDB SDK 在应用接入 OAID 第三方库时,会在发送相关事件中携带该参数(key 为 device_id4
)。现支持该第三方库版本为 1.0.5 ~ 2.4.0,因不同版本变更较大,所以针对不同版本接入的说明如下:
对于 1.0.5 ~ 1.0.25 不需要额外配置,只需应用添加对应第三方库的依赖即可。
对于 1.0.26 ~ 2.4.0 除添加对应第三方库外,需要添加如下处理:
1. 设置证书信息及配置文件
证书信息为应用通过 移动安全联盟邮箱 [email protected] 申请的 .cert.pem
文件内容, 该文件与包名对应。现支持两种设置方式:
- 将
cert.pem
文件拷贝到应用assets
目录,并注意该文件名应设置为packageName.cert.pem
,packageName
为当前应用包名。 - 通过 SDK 的接口
setOAIDCert
将证书文件的内容进行设置
以上两种方式选择一种即可,当两种同时使用时,优先使用通过接口设置的证书信息。
配置文件为 supplierconfig.json
, 应用需要将内部 appid 对应的内容修改为应用在对应应用市场的应用 ID,其他部分不需要修改,并将修改后的文件拷贝到 assets
目录下。
2. 在应用工程中加载对应库文件
不同版本 OAID 第三方库对应的库文件名称如下:
版本号 | 库名称 |
---|---|
1.0.30 ~ 2.4.0 | msaoaidsec |
1.0.29 | nllvm1632808251147706677 |
1.0.27 | nllvm1630571663641560568 |
1.0.26 | nllvm1623827671 |
在 Android 项目工程自定义 Application
类的 onCreate
方法中添加加载第三方库代码,例如当应用接入的 OAID 版本为 1.2.1 时如下:
System.loadLibrary("msaoaidsec");
常见问题处理
当项目中已引入 OAID 库但上报时仍未发现设备 OAID 信息时,请检查以下几项
- 设备时间是否正常
- 对于 1.0.26 及以上版本证书所对应的包名是否和当前包名对应
- 对于 1.0.26 及以上版本是否加载了其库文件以及库文件名称是否和版本对应
- 应用在 Android 12 报错
java.lang.UnsatisfiedLinkError
且 应用 minSdkVersion 大于等于 23 ,建议在 AndroidManifest.xml 文件 application 标签中添加android:extractNativeLibs="true"
IMEI(Android)
在 AndroidManifest.xml
增加如下条目,且用户同意权限的申请后,SDK 将自动采集 Android IMEI。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
iOS 平台不适用
iOS 平台不适用
IDFA(iOS)
由于 iOS14.5
以上系统,获取 IDFA 需要弹出窗口有用户确认,故 SDK 默认不获取 IDFA,可以调用接口开启 IDFA 获取。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objc
请确保 info.plist
中添加了权限请求描述文字,SDK 在初始化时将自动弹出权限请求窗口。
<key>NSUserTrackingUsageDescription</key>
<string>此标识符将用于向您推荐个性化广告(或其他描述)</string>
在初始化时设置 TapTapSdkOptions
中的 enableAdvertiserIDCollection
为 true
开启 IDFA 采集开关。
// Android 平台不适用
// Android 平台不适用
请确保 info.plist
中添加了权限请求描述文字,SDK 在初始化时将自动弹出权限请求窗口。
<key>NSUserTrackingUsageDescription</key>
<string>此标识符将用于向您推荐个性化广告(或其他描述)</string>
在初始化时设置 TapTapSdkOptions
中的 enableAdvertiserIDCollection
为 true
开启 IDFA 采集开关。
请确保 info.plist
中添加了权限请求描述文字,SDK 在初始化时将自动弹出权限请求窗口。
<key>NSUserTrackingUsageDescription</key>
<string>此标识符将用于向您推荐个性化广告(或其他描述)</string>
在初始化时设置 TapTapSdkOptions
中的 enableAdvertiserIDCollection
为 YES
开启 IDFA 采集开关。