TapADN SDK 接入指南
SDK 配置
- Unity
- Android
Unity 模块是通过引入 Android 模块后增加桥接文件打包出的 .unitypackage
,方便以 Unity 开发的游戏直接引入。其他引擎/平台的游戏可以通过 Android 原生的方式接入,详见 Android 接入文档。
开发环境要求:
- Unity 2019.4 或更高版本
- Android 5.0(API level 21)或更高版本
Unity 项目可在 TapTap/TapAD/Demo
找到示例工程来了解其实现过程,注意 Demo 工程需要到真机中才能看到效果,Editor 环境并不会实际生效。
点击展开 Unity 2020.3.15 之前的版本升级 Gradle 版本
在 Project Settings
-> Player
-> Android Tab
-> Publish Settings
-> Build
,然后勾选Custom Base Gradle Template
将以下更改应用于生成的这个文件: Assets/Plugins/Android/baseProjectTemplate.gradle
如果存在,请移除文件顶部的以下注释:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
修改文件内容:
dependencies {
// If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
// See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
// See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
// 将 3.x.0 版本修改为 4.0.1
//classpath 'com.android.tools.build:gradle:3.x.0'
classpath 'com.android.tools.build:gradle:4.0.1'
}
同时,为了将 Gradle 版本和 Android Gradle Plugin 版本对应,需要更新 Gradle 版本,下载 6.1.1 版本的 Gradle,解压后放到自定义的文件夹中,同时不勾选 Unity 中的 Preferences
-> External Tools
-> Android
-> Gradle Installed with Unity(recommend)
,改为选择解压后 Gradle 文件夹的位置,如 <some path>/gradle-6.1.1。
无论 Unity 版本都添加一些原生依赖库:在 Project Settings
-> Player
-> Android Tab
-> Publish Settings
-> Build
,勾选Custom Main Gradle Template
将以下更改应用于生成的这个文件: Assets/Plugins/Android/mainTemplate.gradle
如果存在,请移除文件顶部的以下注释:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
修改文件内容:
- TapADN SDK 从 3.16.3.10 版本开始更新了 glide 的依赖,glide 版本从 4.0.0 更新到了 4.9.0。
- 3.16.3.17 加入 Android Dependencies 文件(位于 TapAD/Editor/TapAdDependencies.xml) 方便接入 EDM4U(https://github.com/googlesamples/unity-jar-resolver) 的项目方解决 Android 依赖。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 加入的依赖库-开始
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation "com.android.support:appcompat-v7:28.0.0"
implementation "com.android.support:support-annotations:28.0.0"
implementation "com.android.support:support-v4:28.0.0"
implementation "com.github.bumptech.glide:glide:4.9.0"
implementation 'com.android.support:recyclerview-v7:28.0.0'
// 加入的依赖库-结束
// 下面这行是 Unity 的 mainTemplate.gradle 自带的,帮助定位插入位置
// **DEPS**
}
最低支持 Android 5.0(API level 21),编译环境为 Android Studio。
将 TapAD_3.16.3.40.aar
拷贝到游戏目录下的 `src/main/libs` 目录中。
在游戏目录下 build.gradle
文件中添加代码:
TapADN SDK 从 3.16.3.10 版本开始更新了 glide 的依赖,glide 版本从 4.0.0 更新到了 4.9.0。
repositories{
flatDir{
dirs 'src/main/libs'
}
}
dependencies {
// ...
implementation(name: "TapAD_3.16.3.40", ext: "aar") // 广告 SDK
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation "com.android.support:appcompat-v7:28.0.0"
implementation "com.android.support:support-annotations:28.0.0"
implementation "com.android.support:support-v4:28.0.0"
implementation "com.github.bumptech.glide:glide:4.9.0"
implementation 'com.android.support:recyclerview-v7:28.0.0'
// ...
}
权限申请
- Unity
- Android
无论 Unity 版本都需加入 Android 相关权限申请,在 Project Settings
-> Player
-> Android Tab
-> Publish Settings
-> Build
,勾选Custom Main Manifest
。
将以下更改应用于生成的这个文件: Assets/Plugins/Android/AndroidManifest.xml
如果存在,请移除文件顶部的以下注释:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
修改文件内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<!-- TapAd 必须的权限-开始 -->
<!-- TargetVersion 31 及以上 通过时,需要该权限) deviceName 和下面的 BLUETOOTEH 互斥-->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<!-- 广告获取坐标(经度、纬度、精度半径(米)、获取时间 毫秒)精准推送 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- IMEI 、序列号、MEID 、IMSI 、 ICCID 等信息。TargetSdkVersion 4 以及更高需要申请 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- TapAd 必须的权限-结束 -->
<!-- TapAd 可选择权限-开始 -->
<!-- 获取网络状态信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取安装应用列表 Android 11 及以上版本才需声明,Android 11 以下版本无需申请 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<!-- (targetVersion 31 以下)deviceName 和上面的 BLUETOOTH_CONNECT 互斥-->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<!-- 允许应用请求安装软件包 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<!-- TapAd 可选择权限-结束 -->
...
配置 AndroidManifest.xml
<!-- 广告 SDK 已添加的权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 为了获取更精准的推送数据、建议游戏加上的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<!-- targetVersion 31 及以上 建议游戏加上这个权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<!-- 为了获取更好的广告体验,建议游戏加上以下权限来获取用户信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 加上下列权限可以提高广告的转化率 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
获取广告权限
在获取 imei 地理位置时,需要用户授予权限。建议先询问权限,再进行初始化工作。
- Unity
- Android
using TapTap.TapAd
TapAdSdk.RequestPermissionIfNecessary();
TapAdManager.get().requestPermissionIfNecessary(activity);
初始化
- Unity
- Android
using TapTap.TapAd
TapAdConfig config = new TapAdConfig.Builder()
.MediaId(your_media_id) // 必选参数,为 TapADN 注册的媒体 ID
.MediaName(your_media_name) // 必选参数,为 TapADN 注册的媒体名称
.MediaKey(your_media_key) // 必选参数,媒体密钥,可以在 TapADN 后台查看(用于传输数据的解密)
.MediaVersion("1") // 必选参数,默认值 "1"
.Channel(your__channel) // 必选参数,渠道
.TapClientId(your_tap_client_id) // 可选参数,TapTap 开发者中心的游戏 Client ID
.EnableDebugLog(false) // 可选参数,是否打开原生 debug 调试信息输出:true 打开、false 关闭。默认 false 关闭
.ShakeEnabled(false) // 可选参数,是否开启摇一摇: true 打开、false 关闭。
.Build();
// CustomControllerWrapper 为实现了 TapTap.TapAd.ICustomController 的类
// onInitedCallback 为可选回调函数,类型是 System.Action,
TapAdSdk.Init(config, new CustomControllerWrapper(this), onInitedCallback);
// ICustomController 接口说明
public interface ICustomController
{
// 是否允许 SDK 主动使用地理位置信息
bool CanUseLocation { get; }
// 当 isCanUseLocation=false 时,可传入地理位置信息,TapAd 使用您传入的地理位置信息
TapAdLocation GetTapAdLocation { get; }
// 是否允许 SDK 主动使用手机硬件参数,如 imei
bool CanUsePhoneState { get; }
// 当 isCanUsePhoneState=false 时,可传入 imei 信息,TapAd 使用您传入的 imei 信息
string GetDevImei { get; }
// 是否允许 SDK 主动使用 ACCESS_WIFI_STATE 权限
bool CanUseWifiState { get; }
// 是否允许 SDK 主动使用 WRITE_EXTERNAL_STORAGE 权限
bool CanUseWriteExternal { get; }
// 开发者可以传入 oaid
// 信通院 OAID 的相关采集——如何获取 OAID:
// 1. 移动安全联盟官网 http://www.msa-alliance.cn/
// 2. 信通院统一 SDK 下载 http://msa-alliance.cn/col.jsp?id=120
string GetDevOaid { get; }
// 是否允许 SDK 主动获取设备上应用安装列表的采集权限
bool Alist { get; }
// 是否允许 SDK 主动获取 ANDROID_ID
bool CanUseAndroidId { get; }
// 用户信息(为了提高广告的推送效率,开发者可以帮助传入一些用户的画像信息)
CustomUser ProvideCustomer();
}
// 地理位置说明
public sealed class TapAdLocation
{
// 纬度
public double latitude;
// 经度
public double longitude;
// 精度
public double accuracy;
// 设置经纬度
public TapAdLocation(double latitude, double longitude, double accuracy)
{
//...
}
}
// 用户信息
public sealed class CustomUser
{
public int realAge;
// 0.男;1.女
public int realSex;
// 角色性别 0.男;1.女
public int avatarSex;
// 角色等级
public int avatarLevel;
// 是否新玩家 0.否;1.是
public int newUserStatus;
// 是否为付费用户 0.否;1.是
public int payedUserStatus;
// 是否通过新手教程 0.否;1.是
public int beginMissionFinished;
// 角色当前付费道具数量
public int avatarPayedToolCnt;
}
TapAdConfig config = new TapAdConfig.Builder()
.withMediaId(your_media_id) // 必选参数。为 TapADN 注册的媒体 ID
.withMediaName(your_media_name) // 必选参数。为 TapADN 注册的媒体名称
.withMediaKey(your_media_key) // 必选参数。媒体密钥,可以在TapADN后台查看
.withMediaVersion("1") // 必选参数。默认值 "1"
.withTapClientId(your_tap_client_id) // 可选参数。TapTap 开发者中心的游戏 Client ID
.enableDebug(true) // 可选参数,是否打开 debug 调试信息输出:true 打开、false 关闭。默认 false 关闭
.withGameChannel(your_app_channel) // 必选参数,渠道
.shakeEnabled(false) // 可选参数,是否开启摇一摇: true 打开、false 关闭。默认 true 开启。
.withCustomController(new TapAdCustomController() {
// 是否允许 SDK 主动使用地理位置信息
@Override
public boolean isCanUseLocation() {
return enableGetLocation;
}
// 当 isCanUseLocation=false 时,可传入地理位置信息,TapAd 使用您传入的地理位置信息
@Override
public TapAdLocation getTapAdLocation() {
return new TapAdLocation(longitude, latitude, accuracy);
}
// 是否允许 SDK 主动使用手机硬件参数,如 imei
@Override
public boolean isCanUsePhoneState() {
return enableGetPhoneState;
}
// 当 isCanUsePhoneState=false 时,可传入 imei 信息,TapAd 使用您传入的 imei 信息
@Override
public String getDevImei() {
return imei;
}
// 是否允许 SDK 主动使用 ACCESS_WIFI_STATE 权限
@Override
public boolean isCanUseWifiState() {
return enableGetWifiState;
}
// 是否允许 SDK 主动使用 WRITE_EXTERNAL_STORAGE 权限
@Override
public boolean isCanUseWriteExternal() {
return enableWriteExternal;
}
// 开发者可以传入 oaid
// 信通院 OAID 的相关采集——如何获取 OAID:
// 1. 移动安全联盟官网 http://www.msa-alliance.cn/
// 2. 信通院统一 SDK 下载 http://msa-alliance.cn/col.jsp?id=120
@Override
public String getDevOaid() {
return oaid;
}
// 是否允许 SDK 主动获取设备上应用安装列表的采集权限
@Override
public boolean alist() {
return enableGetAppList;
}
// 是否允许 SDK 主动获取 ANDROID_ID
@Override
public boolean isCanUseAndroidId() {
return enableGetAndroidId;
}
@Override
public CustomUser provideCustomUser() {
return new CustomUser.Builder()
.withRealAge(age) // 年龄
.withRealSex(sex) // 性别 0:男 1:女
.withAvatarSex(avatarSex) // 角色性别 0:男 1:女
.withAvatarLevel(avatarLevel) // 角色等级
.withNewUserStatus(status) // 是否新玩家 0:否;1:是
.withPayedUserStatus(status) // 是否付费用户 0:否;1:是
.withBeginMissionFinished(finished) // 是否通过新手教程 0:否 1:是
.withAvatarPayedToolCnt(cnt) // 角色当前付费道具数量
.build();
}
})
.build();
TapAdSdk.init(this, config);
上报用户行为
为了获取更优质的广告内容,需要游戏额外提供一些玩家在游戏中的行为数据作为补充。
- Unity
- Android
using TapTap.TapAd
var userActions = new UserAction[3];
var jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
for (int i = 0 ; i < 3; i ++) {
var tmp = new UserAction(actionType: i, actionTime: (long)(DateTime.UtcNow - jan1st1970).TotalMilliseconds,
amount: i * 1000, winStatus: i % 2);
userActions[i] = tmp;
}
// CustomUserAction 为实现了 IUserAction 的类
TapAdSdk.UploadUserAction(userActions, new CustomUserAction(this));
// 用户行为数据类说明
public class UserAction
{
// 行为动作类型,可自定义
public int ActionType { get; }
// 行为发生时间(单位:秒)
public long ActionTime { get; }
// 付费金额
public int Amount{ get; }
// 是否胜利.0-失败;1-胜利
public int WinStatus{ get; }
public UserAction(int actionType, long actionTime, int amount, int winStatus)
{
...
}
}
// 上报接口说明
public interface IUserAction
{
// 上报成功
void OnSuccess();
// 上报失败
void OnError(int code, string message);
}
UserAction[] userActions = new UserAction[3];
for (int i = 0 ; i < 3; i ++) {
UserAction tmp = new UserAction.Builder()
.withActionType(i)
.withActionTime(System.currentTimeMillis())
.withAmount(i * 1000)
.withWinStatus(i % 2)
.build();
userActions[i] = tmp;
}
TapAdManager.get().uploadUserAction(userActions, new Callback() {
@Override
public void onSuccess() {
// 上报成功
}
@Override
public void onError(AdException exception) {
// 上报失败
}
});
开屏广告
开屏广告为用户在进入 App 时展示的全屏广告。开屏广告为一个 View
,宽高默认为 match_parent
。
竖屏开屏广告 view
要求 width = 屏幕宽,height 需要 >= 75% 屏幕高,否则会影响计费。
横屏开屏广告 view
要求 width = 屏幕宽,height 需要 = 屏幕高,否则会影响计费。
建议业务逻辑:
- 每次启动应用的时候调用 SDK 接口请求开屏广告。
- SDK 会根据一定规则从候选队列里选取一个返回给游戏,获取成功就可以展示,获取失败的话本次不展示广告。
获取广告
- Unity
- Android
using TapTap.TapAd
TapSplashAd _tapSplashAd = null;
if (TapAdSdk.IsInited == false)
{
Debug.Log("TapAd 需要先初始化!");
return;
}
// 释放之前的广告
if (_tapSplashAd != null)
{
_tapSplashAd.Dispose();
_tapSplashAd = null;
}
int adId = YOUR_AD_ID;
// create AdRequest
var request = new TapAdRequest.Builder()
.SpaceId(adId)
.Build();
_tapSplashAd = new TapSplashAd(request);
// SplashAdLoadListener 为实现了 ISplashAdLoadListener 的类
_tapSplashAd.SetLoadListener(new SplashAdLoadListener(this));
_tapSplashAd.Load();
// Splash 加载接口说明
public interface ISplashAdLoadListener : ICommonLoadListener
{
// 当 Splash 加载完毕
void OnSplashAdLoad(TapSplashAd ad);
}
// 通用加载接口说明
public interface ICommonLoadListener
{
// 加载出错回调
void OnError(int code, string message);
}
TapAdNative tapAdNative = TapAdManager.get().createAdNative(activity);
// 广告后台获取广告位 id
int spaceId = "your_space_id";
tapAdNative.loadSplashAd(new AdRequest.Builder()
.withSpaceId(spaceId)
.build(), new TapAdNative.SplashAdListener() {
@Override
public void onError(int code, String message) {
// 获取失败
}
@Override
public void onSplashAdLoad(TapSplashAd splashAd) {
// 获取成功,可以在这时候播放广告
}
});
播放
- Unity
- Android
using TapTap.TapAd
if (TapAdSdk.IsInited == false)
{
Debug.Log("TapAd 需要先初始化!");
return;
}
if (_tapSplashAd != null)
{
// SplashInteractionListener 为实现了 ISplashAdInteractionListener 的类
_tapSplashAd.SetInteractionListener(new SplashInteractionListener(this));
_tapSplashAd.Show();
}
else
{
Debug.LogErrorFormat($"[Unity::AD] 未加载好视频,无法播放!");
}
// Splash 播放回调接口说明
public interface ISplashAdInteractionListener : ICommonInteractionListener
{
// 点击跳过
void OnAdSkip(TapSplashAd ad);
// 广告时间到
void OnAdTimeOver(TapSplashAd ad);
// 点击广告回调 3.16.3.30 新增
void OnAdClick();
}
// 通用播放回调接口说明
public interface ICommonInteractionListener
{
}
// 注册开屏广告交互事件监听
splashAd.setSplashInteractionListener(new TapSplashAd.AdInteractionListener() {
@Override
public void onAdSkip() {
// 点击了跳过,可以进入游戏
}
@Override
public void onAdTimeOver() {
// 开屏时间到(开屏页已关闭),可以进入游戏
}
@Override
public void onAdClick() {
// 开屏广告点击了转化按钮,会跳转到落地页 3.16.3.30 新增
}
});
// 展示开屏页
splashAd.show(this);
关闭开屏广告
注意 3.16.3.23 版本开始 开屏广告移除了自动关闭逻辑,需要媒体手动关闭。
- Unity
- Android
using TapTap.TapAd
// 场景 1 媒体直接关闭开屏广告
if (_tapSplashAd != null)
{
_tapSplashAd.Dispose();
}
// 场景 2 在收到开屏广告交互事件后选择关闭
public void OnAdSkip(TapSplashAd ad) {
if (ad != null) ad.Dispose();
}
public void OnAdTimeOver(TapSplashAd ad) {
if (ad != null) ad.Dispose();
}
...
// 场景 1 媒体展示开屏中直接关闭广告
if (splashAd != null)
{
splashAd.dispose();
splashAd.destroyView();
}
// 场景 2 在收到开屏广告交互事件后选择关闭
@Override
public void onAdSkip() {
if (splashAd != null)
{
splashAd.dispose();
splashAd.destroyView();
}
}
@Override
public void onAdTimeOver() {
if (splashAd != null)
{
splashAd.dispose();
splashAd.destroyView();
}
}
激励视频广告
激励视频是一种全屏播放的视频广告,用户可以在观看完整的视频后获取奖励,视频广告播放结束后会显示结束页面,引导用户进行后续动作。目前激励视频广告的表现形式为:视频播放完展示 Endcard 页面。
使用场景包括但不限于:
- 游戏等应用内观看视频广告获得游戏内金币等。
- 积分类应用接入。
- 全屏横屏(宽高比 16:9)
- 全屏竖屏(宽高比 9:16)
- Android 端暂不支持重力旋转。
获取广告
- Unity
- Android
using TapTap.TapAd
TapRewardVideoAd _tapRewardAd = null;
if (TapAdSdk.IsInited == false)
{
Debug.Log("TapAd 需要先初始化!");
return;
}
if (_tapRewardAd != null)
{
_tapRewardAd.Dispose();
_tapRewardAd = null;
}
int adId = YOUR_AD_ID;
// create AdRequest
var request = new TapAdRequest.Builder()
.SpaceId(adId)
.RewardName("your_reward_name")
.RewardCount(your_reward_count)
.Build();
_tapRewardAd = new TapRewardVideoAd(request);
// RewardVideoAdLoadListener 为实现了 IRewardVideoAdLoadListener 的类
_tapRewardAd.SetLoadListener(new RewardVideoAdLoadListener(this));
_tapRewardAd.Load();
// 激励视频广告加载回调接口说明
public interface IRewardVideoAdLoadListener : ICommonLoadListener
{
// 当激励视频被 Cache 完毕
void OnRewardVideoAdCached(TapRewardVideoAd ad);
// 当激励视频被 Load 完毕
void OnRewardVideoAdLoad(TapRewardVideoAd ad);
}
// 通用广告加载回调接口说明
public interface ICommonLoadListener
{
// 加载出错回调
void OnError(int code, string message);
}
// 注意,一个 Activity 中只需要创建一个 TapAdNative 对象
TapAdNative tapAdNative = TapAdManager.get().createAdNative(activity);
AdRequest adRequest = new AdRequest.Builder()
.withSpaceId("your_space_id") // 广告后台获取广告位id
.withRewordName("your_reward_name") // 奖品名称
.withRewardAmount("your_reward_amount") // 奖品数量
.withExtra1("your_extra_info") // 游戏如果要通过 s2s 验证激励广告有效性的时候需要传入一些辅助信息来验证本次激励活动是否有效
.withUserId("game_user_id") // 游戏如果要通过 s2s 验证激励广告有效性的时候需要传入游戏中的玩家 id,来验证是否可以对当前用户发放奖励
.build();
tapAdNative.loadRewardVideoAd(adRequest, new TapAdNative.RewardVideoAdListener() {
@Override
public void onError(int code, String message) {
// 获取失败
}
@Override
public void onRewardVideoAdLoad(TapRewardVideoAd rewardVideoAd) {
// 获取广告成功,可以展示广告
}
@Override
public void onRewardVideoCached(TapRewardVideoAd rewardVideoAd) {
// 获取广告素材成功,可以展示广告,如果没有选择在 RewardVideoAdLoad 时展示广告。(更建议在这个回调中展示广告,体验更好)
}
});
播放
- Unity
- Android
using TapTap.TapAd
if (TapAdSdk.IsInited == false)
{
Debug.Log("TapAd 需要先初始化!");
return;
}
if (_tapRewardAd != null)
{
// RewardVideoInteractionListener 为实现了 IRewardVideoInteractionListener 的类
_tapRewardAd.SetInteractionListener(new RewardVideoInteractionListener(this));
_tapRewardAd.Show();
}
else
{
Debug.LogErrorFormat($"[Unity::AD] 未加载好视频,无法播放!");
}
// 激励视频广告播放回调接口说明
public interface IRewardVideoInteractionListener : ICommonInteractionListener
{
// 当广告出现
void OnAdShow(TapRewardVideoAd ad);
// 当广告关闭
void OnAdClose(TapRewardVideoAd ad);
// 当视频完成
void OnVideoComplete(TapRewardVideoAd ad);
// 视频出错
void OnVideoError(TapRewardVideoAd ad);
// 视频播放完毕,奖励确认可以发放
void OnRewardVerify(TapRewardVideoAd ad, bool rewardVerify, int rewardAmount, string rewardName, int code, string msg);
// 当跳过视频
void OnSkippedVideo(TapRewardVideoAd ad);
// 点击事件
void OnAdClick(TapRewardVideoAd ad);
}
// 通用广告播放回调接口说明
public interface ICommonInteractionListener
{
}
// 注册激励广告交互事件监听
rewardAd.setRewardAdInteractionListener(new TapRewardVideoAd.RewardAdInteractionListener() {
@Override
public void onAdShow() {
// 激励广告已显示
}
@Override
public void onAdClose() {
// 激励广告已经关闭
}
@Override
public void onVideoComplete() {
// 视频播放结束
}
@Override
public void onVideoError() {
// 视频出错
}
@Override
public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName, int code, String msg) {
// 激励任务已完成,游戏可以选择在此时进行玩家奖励,或者进一步通过 s2s 的流程来确认是否可以对当前玩家发放奖励
}
@Override
public void onSkippedVideo() {
// 激励广告中玩家点击了跳过视频的按钮
}
@Override
public void onAdClick() {
// 激励广告点击事件
}
});
rewardAd.showRewardVideoAd(activity);
Banner 广告
模版渲染 Banner:开发者不用自行对广告样式进行编辑和渲染,可直接调用相关接口进行广告展示。
不支持开发者在 view 添加按钮及对广告拦截处理。
获取广告
- Unity
- Android
using TapTap.TapAd
TapBannerAd _tapBannerAd = null;
if (TapAdSdk.IsInited == false)
{
Debug.Log("TapAd 需要先初始化!");
return;
}
if (_tapBannerAd != null)
{
_tapBannerAd.Dispose();
_tapBannerAd = null;
}
int adId = YOUR_AD_ID;
// create AdRequest
var request = new TapAdRequest.Builder()
.SpaceId(adId)
.Build();
_tapBannerAd = new TapBannerAd(request);
// BannerAdLoadListener 为实现了 IBannerAdLoadListener 的类
_tapBannerAd.SetLoadListener(new BannerAdLoadListener(this));
_tapBannerAd.Load();
// banner 广告加载回调接口说明
public interface IBannerAdLoadListener : ICommonLoadListener
{
// 当 Banner 加载完毕
void OnBannerAdLoad(TapBannerAd ad);
}
// 通用广告加载回调接口说明
public interface ICommonLoadListener
{
// 加载出错回调
void OnError(int code, string message);
}
// 注意,一个 Activity 中只需要创建一个 TapAdNative 对象
TapAdNative tapAdNative = TapAdManager.get().createAdNative(activity);
// 广告后台获取广告位 id
int spaceId = "your_space_id";
tapAdNative.loadBannerAd(new AdRequest.Builder()
.withSpaceId(spaceId)
.build(), new TapAdNative.BannerAdListener() {
@Override
public void onError(int code, String message) {
// 获取广告失败
}
@Override
public void onBannerAdLoad(TapBannerAd bannerAd) {
// 获取广告成功,可以调用播放广告接口进行播放(**注意** banner 广告的获取和播放需要在同一个 activity 中)
}
});
播放
- Unity
- Android
using TapTap.TapAd
if (TapAdSdk.IsInited == false)
{
Debug.Log("TapAd 需要先初始化!");
return;
}
// BannerInteractionListener 为实现了 IBannerAdInteractionListener 的类
if (_tapBannerAd != null)
{
_tapBannerAd.SetInteractionListener(new BannerInteractionListener(this));
_tapBannerAd.Show();
}
else
{
Debug.LogErrorFormat($"[Unity::AD] 未加载好视频,无法播放!");
}
// banner 广告播放回调接口说明
public interface IBannerAdInteractionListener : ICommonInteractionListener
{
// 当广告曝光
void OnAdShow(TapBannerAd ad);
// 当广告关闭
void OnAdClose(TapBannerAd ad);
// 当点击广告
void OnAdClick(TapBannerAd ad);
// 当点击下载
void OnDownloadClick(TapBannerAd ad);
}
// 通用广告播放回调接口说明
public interface ICommonInteractionListener
{
}
bannerAd.setBannerInteractionListener(new TapBannerAd.BannerInteractionListener() {
@Override
public void onAdShow() {
// 广告已曝光
}
@Override
public void onAdClose() {
// 广告已关闭(玩家可以手动点击关闭 banner 广告)
}
@Override
public void onAdClick() {
// 玩家点击了 banner 广告
}
@Override
public void onDownloadClick() {
// 玩家点击了下载按钮
}
});
FrameLayout parentLayout = "your_layout";
parentLayout.addView(bannerAd.getBannerView());
自渲染信息流广告
- TapADN SDK 从 3.16.3.28 版本开始自渲染信息流视频广告对外暴露视频控制接口。
为可自定义布局的信息流广告,包含大图和视频两种基本样式类型,应用下载、跳转到落地页和跳转到浏览器三种交互类型。
支持的广告尺寸:
- 大图(宽高比:1.78 的图片)
- 视频(宽高比:1.78 的视频)
获取广告
- Unity
- Android
// 暂不支持
// 注意,一个 Activity/Fragment 中只需要创建一个 TapAdNative 对象
TapAdNative tapAdNative = TapAdManager.get().createAdNative(activity);
// 广告后台获取广告位 id
int spaceId = "your_space_id";
tapAdNative.loadFeedAd(new AdRequest.Builder()
.withQuery("{query}") // 搜索词,可选
.withSpaceId(spaceId)
.build(), new TapAdNative.FeedAdListener() {
@Override
public void onError(int code, String message) {
// 获取广告失败
}
@Override
public void onFeedAdLoad(TapFeedAd feedAd) {
}
});
// TapFeedAd 接口说明
public interface TapFeedAd {
/**
* 广告标题
*
* @return
*/
String getTitle();
/**
* 广告描述
*
* @return
*/
String getDescription();
/**
* 广告图标
*
* @return
*/
String getIconUrl();
/**
* 得到 Feed 广告图片模式
*
* @return 1:大图 2:视频
*/
int getImageMode();
/**
* 广告封面图片 Image list
*
* @return
*/
List<ImageInfo> getImageInfoList();
/**
* 获取 TapTap 得分
*
* @return
*/
double getScore();
/**
* 如果是直接下载类型,返回 apk 包大小,否则返回 “0B” 或者 “”。
*/
public String getApkSize();
/**
* 获取广告的 view,如视频广告的 view,当前版本为自动播放且默认打开声音,用户可以手动关闭声音。
*
* @return
*/
View getAdView();
/**
* @return 0: onKnown 1: 下载类广告 2:直接跳转外部App 3: 通过浏览器打开落地页
* 4: 小程序跳转类广告 3.16.3.30 新增
*/
int getInteractionType();
/**
* 获取合规信息
*
* @return
*/
ComplianceInfo getComplianceInfo();
/**
* 注册可点击的 view,click/show 会在内部完成
*
* @param container 渲染广告最外层的 ViewGroup
* @param clickViews 可点击的视图
* @param creativeViews 可点击的创意视图(广告下载的按钮)
* @param describeViews 可点击的介绍详情视图
* @param privacyViews 可点击的隐私协议视图
* @param permissionViews 可点击的权限视图
*
*/
@Deprecated
void registerViewForInteraction(ViewGroup container, List<View> clickViews, List<View> creativeViews,
List<View> describeViews, List<View> privacyViews, List<View> permissionViews, AdInteractionListener listener);
/**
* 注册可点击的 view,click/show 会在内部完成
*
* @param activity 渲染广告所在的 activity
* @param container 渲染广告最外层的 ViewGroup
* @param clickViews 可点击的视图
* @param creativeViews 可点击的创意视图(广告下载的按钮)
* @param describeViews 可点击的介绍详情视图
* @param privacyViews 可点击的隐私协议视图
* @param permissionViews 可点击的权限视图
*
*/
void registerViewForInteraction(Activity activity, ViewGroup container, List<View> clickViews, List<View> creativeViews,
List<View> describeViews, List<View> privacyViews, List<View> permissionViews, AdInteractionListener listener);
/**
* 设置下载监听器
*/
void setDownloadListener(TapAppDownloadListener listener);
/**
* 设置可以控制自渲染信息流视频,比如播放,暂停,音量键显隐等,v3.16.3.28可用
*/
void setVideoPlaySelfController(boolean isSelfController);
/**
* 设置自渲染信息流广告视频回调接口,v3.16.3.28可用
*/
void setVideoAdListener(VideoAdListener videoAdListener);
/**
* 暂停自渲染信息流广告视频播放,v3.16.3.28可用
*/
void stopVideoPlay();
/**
* 恢复自渲染信息流广告视频自动播放,v3.16.3.28可用
*/
void startVideoPlay();
/**
* 设置自渲染信息流广告音量键显隐,v3.16.3.28可用
*/
void setVolumeVisible(boolean isVisible);
/**
* 打开自渲染信息流广告视频音量(全局),v3.16.3.28可用
*/
void openVideoVolume();
/**
* 关闭自渲染信息流广告视频音量(全局),v3.16.3.28可用
*/
void closeVideoVolume();
}
// 应用合规信息
public interface ComplianceInfo {
/**
* 获取应用名称
*
* @return
*/
String getAppName();
/**
* 获取广告
*
* @return
*/
String getAppVersion();
/**
* 开发者名称
*
* @return
*/
String getDeveloperName();
/**
* 应用隐私协议地址
*
* @return
*/
String getPrivacyUrl();
/**
* 应用描述地址
*
* @return
*/
String getFunctionDescUrl();
/**
* 应用权限地址
*
* @return
*/
String getPermissionUrl();
}
public interface AdInteractionListener {
// 广告卡片点击
void onAdClicked(View view, TapFeedAd ad);
// 广告创意交互部分点击
void onAdCreativeClick(View view, TapFeedAd ad);
// 广告卡片曝光
void onAdShow(TapFeedAd ad);
// 广告卡片单次(第一次)曝光
void onDistinctAdShow(TapFeedAd ad);
}
// 自渲染信息流广告视频回调接口 3.16.3.28 版本开始
interface VideoAdListener {
void onVideoPrepared(TapFeedAd ad);
void onVideoStart(TapFeedAd ad);
void onVideoPause(TapFeedAd ad);
void onVideoVolumeOpen(TapFeedAd ad);
void onVideoVolumeClose(TapFeedAd ad);
}
// 广告包下载进度监听
public interface TapAppDownloadListener {
void onDownloadStart();
void onDownloadComplete();
void onUpdateDownloadProgress(int percent);
void onDownloadError();
void onInstalled();
}
广告行为监听
AdInteractionListener 涉及到广告计费,必须正确调用,convertView 必须使用 ViewGroup。
在加载到信息流广告后,接入方需要注册在信息流广告中可以点击的 View,即 TapFeedAd.registerViewForInteraction()
方法,以实现广告的功能交互及计。包含图文点击区域的注册,附加创意按钮点击区域的注册,隐私协议区域的注册,应用权限的注册。点击附加创意区域会进行应用下载操作。
注意: 如果需要点击图文区域也能进行下载,请将图文区域的 view 传入 creativeViews。示例代码如下:
- Unity
- Android
// 暂不支持
public class FeedAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
...
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
...
if (holder instanceof OtherViewHolder) {
...
} else if (holder instanceof adViewHolder) {
/**
* 注册可点击的 View,click/show 会在内部完成
* @param container 渲染广告最外层的 ViewGroup
* @param clickViews 可点击的 View 的列表
* @param creativeViews 用于下载的 View
* @param
*/
// 可以被点击的 view, 也可以把 convertView 放进来意味整个 item 可被点击,点击会跳转到落地页
List<View> clickViewList = new ArrayList<View>();
clickViewList.add(convertView);
// 创意点击区域的 view 点击根据不同的创意进行下载动作
// 如果需要点击图文区域也能进行下载动作,请将图文区域的 view 传入 creativeViewList
List<View> clickViewList = Collections.singletonList(adViewHolder.adImageView);
List<View> creativeViewList = Collections.singletonList(adViewHolder.creativeTextView);
List<View> privacyViewList = Collections.singletonList(adViewHolder.privacyTextView);
List<View> describeTextView = Collections.singletonList(adViewHolder.describeTextView);
List<View> permissionViewList = Collections.singletonList(adViewHolder.permissionTextView);
// 注册普通点击区域,创意点击区域。重要! 这个涉及到广告计费及交互,必须正确调用。convertView 必须使用 ViewGroup。
ad.registerViewForInteraction((ViewGroup) convertView, images, clickViewList, creativeViewList, describeViewList, privacyViewList, permissionViewList, new TapFeedAd.AdInteractionListener() {
// 点击普通区域的回调
@Override
public void onAdClicked(View view, TapFeedAd ad) {
}
// 点击创意区域的回调
@Override
public void onAdCreativeClick(View view, TapFeedAd ad) {
}
// 广告曝光展示的回调
@Override
public void onAdShow(TapFeedAd ad) {
}
});
}
}
}
广告下载事件监听
- Unity
- Android
// 暂不支持
TapAppDownloadListener downloadListener = new TapAppDownloadListener() {
// 未开始下载
@Override
public void onIdle() {
}
// 下载中
@Override
public void onDownloadStart() {
}
// 下载完成
@Override
public void onDownloadComplete() {
}
/**
* 下载进度更新回调
* @param percent 取值范围[0,100] 当前下载进度
*/
@Override
public void onUpdateDownloadProgress(int percent) {;
}
// 下载出错 (网络/文件存储错)
@Override
public void onDownloadError() {
}
// 安装成功
@Override
public void onInstalled() {
}
};
Feed 流广告启动/暂停
如果 Feed 流是在 Activity 中使用,需要在 Activity 的 onResume 和 onPause 调用相关方法;
如果 Feed 流是在Fragment中使用,除了要考虑 onResume 和 onPause 的系统回调,还要注意 Fragment 的 setUserVisibleHint 回调。
- Unity
- Android
// 暂不支持
// 启动
tapAdNative.resume();
// 暂停
tapAdNative.pause();
Feed 流广告销毁
如果是在 Activity 中创建,请在 Activity 中调用销毁方法
如果是在 Fragment 中创建,请在 Fragment 中调用销毁方法
- Unity
- Android
// 暂不支持
tapAdNative.dispose();
模板染信息流广告
支持图文和视频样式,开发者不用自行对广告样式进行编辑和渲染,可直接调用相关接口获取广告view去进行展示, 开发者可以随时对 TapADN 平台上勾选的模板进行样式上的调整。降低了接入成本的前提下,不会影响cpm的水平,仍然可以保持高的竞争力。
支持的广告样式:开发者在 TapADN 平台上可以进行多模板的勾选。模板渲染信息流广告支持开发者调整、编辑。注意:不允许开发者在view添加按钮及对广告拦截处理。
获取广告
- Unity
- Android
// 暂不支持
TapAdNative tapAdNative = TapAdManager.get().createAdNative(activity);
// 广告后台获取广告位 id
int spaceId = "your_space_id";
tapAdNative.loadFeedAd(new AdRequest.Builder()
.withQuery("{query}") // 搜索词,可选
.withSpaceId(spaceId)
.build(), new TapAdNative.FeedAdListener() {
@Override
public void onError(int code, String message) {
// 获取广告失败
}
@Override
public void onFeedAdLoad(TapFeedAd feedAd) {
}
});
// 模板渲染信息流 接口说明
/**
* 注册模板信息流广告的交互监听
*
*/
void setExpressRenderListener(ExpressRenderListener listener);
/**
* 开始绘制广告 View。**注意** 请确保已经调用了`TapFeedAd.setExpressRenderListener`接口,否则无法收到广告渲染的结果。
* @param activity 需要展现广告的 activity
* @param feedOption 模版卡片的参数。包括卡片的宽、高,以及视频配置
*/
void render(Activity activity, FeedOption feedOption);
// 模板渲染信息流广告视频回调接口
interface VideoAdListener {
void onVideoPrepared(TapFeedAd ad);
void onVideoStart(TapFeedAd ad);
void onVideoPause(TapFeedAd ad);
void onVideoVolumeOpen(TapFeedAd ad);
void onVideoVolumeClose(TapFeedAd ad);
}
// 模板渲染广告交互接口
interface ExpressRenderListener {
void onRenderSuccess(TapFeedAdView adView);
void onRenderFail(TapFeedAdView adView, TapFeedAd feedAd, int errorCode, String msg);
void onAdShow(TapFeedAdView adView);
void onAdClicked(TapFeedAdView view);
void onAdClosed(TapFeedAdView view);
}
广告行为监听
在加载到模板渲染信息流广告后,接入方需要调用 TapFeedAd.render()
接口进行模版广告的绘制 同时注册广告交互接口 TapFeedAd.setExpressRenderListener()
方法,以实现广告渲染以及其它广告行为的监听。
- Unity
- Android
// 暂不支持
public class FeedAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
...
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
...
if (holder instanceof OtherViewHolder) {
...
} else if (holder instanceof adViewHolder) {
tapFeedAd.setExpressRenderListener(new TapFeedAd.ExpressRenderListener() {
@Override
public void onRenderSuccess(TapFeedAdView adView) {
adViewHolder.itemView.removeAllViews();
adViewHolder.itemView.addView(adView);
}
@Override
public void onRenderFail(TapFeedAdView adView, TapFeedAd feedAd, int errorCode, String msg) {
}
@Override
public void onAdShow(TapFeedAdView adView) {
}
@Override
public void onAdClicked(TapFeedAdView view) {
}
@Override
public void onAdClosed(TapFeedAdView view) {
}
});
// 模板广告请求方法需要开发者设置 expressWidth、expressHeight。 参数单位是 px, 高度设置`ViewGroup.LayoutParams.WRAP_CONTENT`, 宽度根据开发者实际需求传入(宽度过小会影响广告体验)
// videoOption.AutoPlayPolicy 分为 VideoOption.AutoPlayPolicy.ALWAYS(视频永远自动播放) / VideoOption.AutoPlayPolicy.WIFI(视频仅在 WIFI 情况下自动播放)
FeedOption feedOption = new FeedOption.Builder()
.expressWidth(ViewGroup.LayoutParams.MATCH_PARENT)
.expressHeight(ViewGroup.LayoutParams.WRAP_CONTENT)
.videoOption(new VideoOption.Builder().autoPlayPolicy(VideoOption.AutoPlayPolicy.ALWAYS).build())
.build();
tapFeedAd.render(ExpressFeedViewActivity.this, feedOption);
}
}
}
插屏广告
插屏广告:支持「全屏视频广告」、「全屏图文广告」和「半屏图文广告」等形式,具体广告展示形式在后台配置。
插屏广告分横竖屏形式,强烈建议在后台配置后正确使用横屏或竖屏广告,若用错配置的 orientation,可能会出现 UI 兼容异常问题。
获取广告
- Unity
- Android
if (TapAdSdk.IsInited == false){
ShowText("TapAd 没有初始化!将自动初始化");
Init();
while (TapAdSdk.IsInited == false){
await Task.Yield();
}
ShowText("TapAd 初始化完毕");
}
if (_tapInterstitialAd != null){
_tapInterstitialAd.Dispose();
_tapInterstitialAd = null;
}
int adId = isHorizontal ? LANDSCAPE_INTERSTITIAL_ID : PORTRAIT_INTERSTITIAL_ID;
// create AdRequest
var request = new TapAdRequest.Builder()
.SpaceId(adId)
.Build();
_tapInterstitialAd = new TapInterstitialAd(request);
_tapInterstitialAd.SetLoadListener(new InterstitialAdLoadListener(this));
_tapInterstitialAd.Load();
AdRequest adRequest = new AdRequest.Builder()
.withSpaceId(adId)
.build();
tapAdNative.loadInterstitialAd(adRequest,new TapAdNative.InterstitialAdListener() {
@Override
public void onInterstitialAdLoad(TapInterstitialAd interstitialAd) {
// 获取广告成功
}
@Override
public void onError(int code, String message) {
// 获取广告失败
}
});
播放
- Unity
- Android
if (TapAdSdk.IsInited == false)
{
ShowText("TapAd 需要先初始化!");
return;
}
if (_tapInterstitialAd != null)
{
_tapInterstitialAd.SetInteractionListener(new InterstitialAdInteractionListener(this));
_tapInterstitialAd.Show();
}
else
{
Debug.LogErrorFormat($"[Unity::AD] 未加载好视频,无法播放!");
}
interstitialAd.setInteractionListener(new TapInterstitialAd.InterstitialAdInteractionListener() {
@Override
public void onAdShow() {
Log.d(TAG,"onShow");
}
@Override
public void onAdClose() {
Log.d(TAG,"onAdClose");
}
@Override
public void onAdError() {
Log.d(TAG,"onAdError");
}
});
interstitialAd.show(activity);
Android 代码混淆
为了保证 SDK 在代码混淆后能正常运作,需要将如下防混淆代码添加到混淆文件中:
Android 原生项目混淆文件位于 app/proguard-rules.pro
,Unity 项目需要先通过 Project Settings -> Player -> Publishing Settings -> 勾选 Custom Proguard File
, 然后混淆文件位于项目该路径下 Assets/Plugins/Android/proguard-user.txt
-dontwarn com.tapadn.**
-keep class com.tapadn.** { *;}
-dontshrink
激励视频奖励发放说明
奖励发放条件
一般视频总时长为 10~60s,30s 以上的视频播放到 30s 时会显示“跳过”按钮。低于30s的激励视频观看达到 90% 即会回调奖励验证接口,高于 30s 激励视频观看到第 27s 的时候即会回调奖励验证接口。
奖励发放主要流程
- 客户端回调的优势:对接简单、高效,通过接口回调结果在客户端完成奖励是否发放即可。
- 服务端回调的优势:开发者可在服务端进行二次校验,保证广告有效性后做出奖励发放,反作弊能力强。
奖励验证服务端回调 (S2S 验证)
S2S 验证需要开发者提供奖励发放的回调 URL,Security Key 由 TapADN 服务端生成并提供给开发者,现阶段通过 KA 单点对接提供
- 服务器回调模式不是必须的,只是增加了一次第三方服务器的验证判断。具体的奖励发放由客户端完成。
- 服务端回调逻辑:TapADN 根据“奖励发放条件“,先通过 “TapADN 服务端”访问“开发者媒体服务端”向开发者确认是否进行奖励发放,再依据“开发者服务端”返回的 true/false,在客户端给出是/否发放奖励的回调。
- TapADN 服务端只是透传验证请求,不会在中间过程添加校验逻辑。为了保障开发者利益和用户体验,开发者可以在验证环节增加自己的校验逻辑。
SDK 奖励发放回调接口
接口说明
//视频播放完成后,奖励验证回调,rewardVerify:是否有效,code:错误码,msg:错误信息
void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName,int code,String msg)
透传参数
SDK 传给 TapADN 服务端
字段名称 | 字段定义 | 字段类型 | 备注 | |
---|---|---|---|---|
user_id | 用户id | string | 调用SDK透传,应用对用户的唯一标识 | |
extra | 其他信息 | string | 调用SDK传入并透传,如无需要则为空 |
奖励验证方式
- 同步验证
- 满足“奖励发放条件”
- 调用“奖励验证回调接口”,并等待返回
- 调用onRewardVerify
- rewardVerify=回调接口返回的isValid
- code=回调接口异常时的错误码
- msg=回调接口异常时的错误信息
- 开发者可根据rewardVerify决定是否发放奖励
- 异步验证
- 满足“奖励发放条件”
- 调用“奖励验证回调接口”,不等待返回
- 调用onRewardVerify
- rewardVerify=true(满足“奖励发放条件”)
- trans_id
- 开发者可通过trans_id查询服务端结果,决定是否发放奖励
奖励验证回调接口
接口请求方式
- 接口请求方式: GET
- 服务端会以 GET 方式请求第三方服务的回调链接,并拼接以下参数回传:
pid=%s&user_id=%s&trans_id=%s&extra=%s&sign=%s
请求参数定义
字段名称 | 字段定义 | 字段类型 | 备注 |
---|---|---|---|
pid | 广告位 ID | string | |
user_id | 用户 ID | string | 调用 SDK 透传,应用对用户的唯一标识 |
trans_id | 交易 ID | string | 完成观看的唯一交易 ID,唯一标识该次激励广告 |
extra | 其他信息 | string | 调用 SDK 传入并透传,如无需要则为空 |
sign | 签名 | string | 签名 |
签名生成方式
- 获得 SecurityKey,在申请配置激励广告位页面,设置服务端验证回调接口时获取
- 将 trans_id 和 SecurityKey 用 ':' 符号连接
- 使用 sha256 生成签名,用小写 16 进制
sign = fmt.Sprintf("%x", sha256.Sum256(trans_id:SecurityKey))
返回值约定
- 返回值格式: json
- 返回示例:
{"isValid":true}
返回值定义
字段名称 | 字段定义 | 字段类型 | 备注 |
---|---|---|---|
isValid | 校验结果 | bool | 判定结果,是否发放奖励 |
SDK 常见错误码汇总
错误码 | 错误信息 | 原因 |
---|---|---|
3001 | 初始化错误 | SDK 未初始化,或者初始化异常 |
3002 | 网络异常错误 | |
3003 | 插屏广告应用横竖方向参数与广告位支持方向不匹配 | 插屏广告设置的横竖屏与设置的方向不一致 |
9999 | 未获取到广告素材:未知错误 | |
9000 | 内部错误 | 错误信息和内部错误码一般会上报 |
10003 | Request MediaInfo Miss | |
10004 | Request AppInfo Miss | |
10005 | Request AdnSdkInfo Miss | |
10007 | Request AdSpace Miss | |
10008 | Request AdSpace Not Match | |
10009 | Request Invalid DeviceId |