内嵌动态开发指南
本文介绍如何在游戏中加入 TapTap 内嵌动态。使用内嵌动态功能需依赖 TapTap 登录。由于 TapTap 登录有两种形式,分别为基于内建账户系统登录和单纯登录,所以内嵌动态 SDK 获取以及初始化根据 TapTap 登录集成方式的不同而有区别。
以下先介绍基于内建账户系统登录条件下内嵌动态的集成,如果使用单纯的 TapTap 登录 并接入内嵌动态,初始化和 SDK 获取请参考:单纯的内嵌动态初始化。
环境要求
- Unity
- Android
- iOS
- UE4
- Unity 2019.4 或更高版本
- iOS 11 或更高版本,Xcode 版本 14.1 或更高版本
- Android 5.0(API level 21)或更高版本
Android 5.0(API level 21)或更高版本
iOS 11 或更高版本,Xcode 版本 14.1 或更高版本
- 安装 UE 4.26 及以上版本
- iOS 12 或更高版本
- Android 5.0(API level 21)或更高版本
- macOS 10.14.0 或更高版本
- Windows 7 或更高版本
支持平台:Android / iOS / Windows / macOS
权限说明
- Unity
- Android
- iOS
- UE4
该模块需要如下权限:
| 权限 | 使用目的 | 权限申请时机 |
|---|---|---|
| 网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
| 获取网络状态 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
| 读写存储权限 | 用于发布或下载动态页面内图片、视频 | 下载或使用本地图片发布动态时申请 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
集成前准备
- 参考 准备工作 创建应用、开启内嵌动态应用配置、绑定 API 域名;
SDK 获取
请先参考 TapTap 登录完成 SDK 获取,然后在此基础上可以通过 下载 获得 TapSDK,添加 TapMoment 模块:
- Unity
- Android
- iOS
- UE4
SDK 可以通过 Unity Package Manager 导入或手动导入,二者任选其一。请根据项目需要选择。
方法一:使用 Unity Package Manager
从 3.29.1 版本开始, SDK 修改 JSON 解析库为 Newtonsoft-json,如果当前工程已接入该依赖库,则不需额外处理,否 则需在 Packages/manifest.json 添加如下依赖:
"com.unity.nuget.newtonsoft-json":"3.2.1"
NPMJS 安装
从 3.25.0 版本开始,TapSDK 支持了 NPMJS 安装,优势是只需要配置版本号,并且支持嵌套依赖。
在项目的 Packages/manifest.json 文件中添加以下依赖:
"dependencies":{
"com.taptap.tds.moment":"3.29.4",
"com.taptap.tds.common":"3.29.4",
}
但需要注意的是,要在 Packages/manifest.json 中 dependencies 同级下声明 scopedRegistries:
"scopedRegistries": [
{
"name": "NPMJS",
"url": "https://registry.npmjs.org/",
"scopes": ["com.tapsdk", "com.taptap"]
}
]
GitHub 安装
在项目的 Packages/manifest.json 文件中添加以下依赖:
"dependencies":{
"com.taptap.tds.common":"https://github.com/TapTap/TapCommon-Unity.git#3.29.4",
"com.taptap.tds.moment":"https://github.com/TapTap/TapMoment-Unity.git#3.29.4",
}
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
方法二:手动导入
-
在 下载页 找到 TapSDK Unity 下载地址,下载
TapSDK-UnityPackage.zip。 -
在 Unity 项目中依次转到 Assets > Import Packages > Custom Packages,从解压后的
TapSDK-UnityPackage.zip中,选择希望在游戏中使用的 TapSDK 包导入,其中:
TapTap_Common.unitypackageTapSDK 基础库,必选。TapTap_Moment.unitypackageTapTap 内嵌动态库,必选。
- 如果当前项目已集成
Newtonsoft.Json依赖,则忽略该步骤,否则在NuGet.orgNewtonsoft.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>
repositories{
flatDir {
dirs 'libs'
}
}
dependencies {
...
implementation (name:'TapMoment_3.29.4', ext:'aar') // TapTap 内嵌动态
}
// 内嵌动态
TapMomentResource.bundle
TapMomentSDK.framework
PublicDependencyModuleNames.AddRange(new string[] {
//...
"TapMoment"
});
SDK 初始化
请确认已经完成了 Tap 登录初始化,则内嵌动态无需再次进行初始化;
- 如果使用 单纯的 TapTap 登录 并接入内嵌动态,初始化和 SDK 获取请参考:单纯的内嵌动态初始化。
设置回调
设置回调以获取动态的状态变化。
- Unity
- Android
- iOS
- UE4
TapMoment.SetCallback((code, msg) => {
Debug.Log(code + "---" + msg);
});
TapMoment.setCallback(new TapMoment.TapMomentCallback() {
@Override
public void onCallback(int code, String msg) {
}
});
@interface ViewController ()<TapMomentDelegate>
@end
[TapMoment setDelegate:self];
- (void)onMomentCallbackWithCode:(NSInteger)code msg:(NSString *)msg
{
NSLog (@"msg:%@, code:%i", msg, code);
}
FTapMoment::SetCallback(FTapMoment::FDelegate::CreateLambda([](int Code, const FString& Msg) {
}));
回调方法中 code 表示事件类型,现支持的回调类型如下:
| 回调 | 回调值 | 说明 |
|---|---|---|
| CALLBACK_CODE_PUBLISH_SUCCESS | 10000 | 动态发布成功 |
| CALLBACK_CODE_PUBLISH_FAIL | 10100 | 动态发布失败 |
| CALLBACK_CODE_PUBLISH_CANCEL | 10200 | 关闭动态发布页面 |
| CALLBACK_CODE_GET_NOTICE_SUCCESS | 20000 | 获取新消息成功 |
| CALLBACK_CODE_GET_NOTICE_FAIL | 20100 | 获取新消息失败 |
| CALLBACK_CODE_MOMENT_APPEAR | 30000 | 动态页面打开 |
| CALLBACK_CODE_MOMENT_DISAPPEAR | 30100 | 动态页面关闭 |
| CALLBACK_CODE_CLOSE_CANCEL | 50000 | 取消关闭所有动态界面(弹框点击取消按钮) |
| CALLBACK_CODE_CLOSE_CONFIRM | 50100 | 确认关闭所有动态界面(弹框点击确认按钮) |
| CALLBACK_CODE_LOGIN_SUCCESS | 60000 | 动态页面内登录成功 |
| CALLBACK_CODE_SCENE_EVENT | 70000 | 场景化入口回调 |
获取新消息
定时调用获取消息通知的接口,有新信 息时可以在 TapTap 动态入口显示小红点,提醒玩家查看新动态。
- Unity
- Android
- iOS
- UE4
TapMoment.FetchNotification();
TapMoment.fetchNotification();
[TapMoment fetchNotification];
FTapMoment::FetchNotification();
获取消息通知的结果会在本文刚开始设置的回调中返回,code 为 CALLBACK_CODE_GET_NOTICE_SUCCESS(20000)表示获取成功,CALLBACK_CODE_GET_NOTICE_FAIL(20100)表示获取失败。
获取成功时,msg 为新消息数量,0 表示没有新消息。
为了方便玩家查看好友动态、游戏公告等,我们建议将 TapTap 动态入口放在显眼的位置,每分钟调用 1 次获取消息通知的接口。
获取消息通知时,如果没有新消息(msg 为 0),那么游戏需要清除界面上的小红点。
同样,打开 TapTap 动态页面后,游戏也需要清除界面上的小红点。
设置默认屏幕方向
在游戏中显示动态页面时,如果游戏屏幕方向始终保持不变,开发者可调用如下接口设置动态默认展示的屏幕方向。
- Unity
- Android
- iOS
- UE4
TapMoment.SetDefaultOrientation(Orientation.ORIENTATION_LANDSCAPE);
TapMoment.setDefaultOrientation(TapMoment.ORIENTATION_PORTRAIT);
TapMomentConfig *mConfig = TapMomentConfig.new;
mConfig.orientation = TapMomentOrientationDefault;
[TapMoment setDefaultConfig:mConfig];
//暂不支持
设置方向后,后续打开动态页面接口可选择使用该方向。
显示动态页面
在游戏中显示 TapTap 动态页面,在这个页面,玩家不仅可以查看动态,还能发布新动态。
- Unity
- Android
- iOS
- UE4
//使用指定屏幕方向
TapMoment.Open(Orientation.ORIENTATION_LANDSCAPE);
//使用默认方向
TapMoment.Open();
//使用指定屏幕方向
TapMoment.open(TapMoment.ORIENTATION_PORTRAIT);
//使用默认方向
TapMoment.open();
//使用指定屏幕方向
TapMomentConfig *mConfig = TapMomentConfig.new;
mConfig.orientation = TapMomentOrientationDefault;
[TapMoment open:mConfig];
//使用默认方向
[TapMoment open];
//使用指定屏幕方向
FTapMoment::Open(ETapMomentOrientation::PORTRAIT);
打开动态页面时,请先屏蔽游戏自身的声音,以免干扰动态内的视频声音。
如需要动态能支持横竖屏随设备自动旋转,需要游戏自身能支持横竖屏。
如前所述,打开动态页面后别忘了清除动态页面入口处的小红点。
动态页面的背景图可以配置,步骤如下图所示。 背景图需要人工审核后才能生效,请预留充足的时间。

场景化入口
开发者可以结合游戏场景绘制入口,玩家打开入口跳转到指定的页面。使用前需要在开发者中心后台完成场景化入口配置。
- Unity
- Android
- iOS
- UE4
// sceneId 为开发者中心后台创建场景化入口后生成的「入口 ID」
var sceneDic = new Dictionary<string, object>() { { TapMomentConstants.TapMomentPageShortCutKey, sceneId } };
//使用指定屏幕方向
TapMoment.DirectlyOpen(Orientation.ORIENTATION_DEFAULT, TapMomentConstants.TapMomentPageShortCut, sceneDic);
// 使用默认屏幕方向
TapMoment.DirectlyOpen(TapMomentConstants.TapMomentPageShortCut, sceneDic);