内嵌动态开发指南
本文介绍如何在游戏中接入 TapTap 内嵌动态功能,使用内嵌动态功能需依赖 TapTap 登录。
权限说明
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
获取网络状态 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
读写存储权限 | 用于发布或下载动态页面内图片、视频 | 下载或使用本地图片发布动态时申请 |
该模块将在应用中添加如下权限:
<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" />
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
获取网络状态 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
读写存储权限 | 用于发布或下载动态页面内图片、视频 | 下载或使用本地图片发布动态时申请 |
该模块将在应用中添加如下权限:
<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" />
使用内嵌动态服务需要相册、相机权限,所以开发者需在工程的 info.plist
配置相关权限并替换授权文案:
<!--使用内嵌动态服务,需要相册、相机、麦克风权限-->
<key>NSPhotoLibraryUsageDescription</key>
<string>说明为何应用需要此项权限</string>
<key>NSCameraUsageDescription</key>
<string>说明为何应用需要此项权限</string>
<key>NSMicrophoneUsageDescription</key>
<string>说明为何应用需要此项权限</string>
使用内嵌动态服务需要相册、相机权限,所以开发者需在工程的 info.plist
配置相关权限并替换授权文案:
<!--使用内嵌动态服务,需要相册、相机、麦克风权限-->
<key>NSPhotoLibraryUsageDescription</key>
<string>说明为何应用需要此项权限</string>
<key>NSCameraUsageDescription</key>
<string>说明为何应用需要此项权限</string>
<key>NSMicrophoneUsageDescription</key>
<string>说明为何应用需要此项权限</string>
集成前准备
- 参考 准备工作 创建应用、开启内嵌动态应用配置;
- 内嵌动态依赖于 TapTap 登录模块,开发者接入前应先接入 TapTap 登录 相关依赖。
SDK 获取
完成 SDK 获取,然后在此基础上可以通过 下载 获得 TapSDK,添加 TapMoment
模块:
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
第一步:添加 SDK 所需的外部依赖
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.8.2",
"com.taptap.sdk.login":"4.8.2",
"com.taptap.sdk.moment":"4.8.2",
}
但需要注意的是,需在 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/tapsdk-unity-dist.git?path=/Core#4.8.2",
"com.taptap.sdk.login":"https://github.com/taptap/tapsdk-unity-dist.git?path=/Login#4.8.2",
"com.taptap.sdk.moment":"https://github.com/taptap/tapsdk-unity-dist.git?path=/Moment#4.8.2",
}
说明:自 4.7.2 起,Unity Packages 仓库已统一为大仓
tapsdk-unity-dist
,所有包通过目录区分并使用?path=
指定子目录、#
指定版本标签。例如 Core 模块:"com.taptap.sdk.core": "https://github.com/taptap/tapsdk-unity-dist.git?path=/Core#4.7.2"
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
本地文件导入
- 在 下载页 下载下列模块对应
unitypackage
文件,并在 Unity 项目中依次通过 Assets > Import Packages > Custom Packages 进行导入,包括:
TapSDK_Core.unitypackage
TapTapSDK 核心模块,必选。TapSDK_Login.unitypackage
TapTapSDK 登录模块,必选。TapSDK_Moment.unitypackage
TapTapSDK 内嵌动态模块,必选。
- 如果当前项目已集成
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>
iOS 配置
在 Assets/Plugins/iOS/Resource
目录下创建 TDS-Info.plist
文件 (如果已创建,只需添加内容即可),配置相关权限并替换授权文案:
复制使用以下内容时,请删除空行以及注释,以免出现 XML 解析时报错,ApplicationException: expected a key node
。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!--使用内嵌动态服务,需要相册、相机、麦克风-->
<key>NSPhotoLibraryUsageDescription</key>
<string>说明为何应用需要此项权限</string>
<key>NSCameraUsageDescription</key>
<string>说明为何应用需要此项权限</string>
<key>NSMicrophoneUsageDescription</key>
<string>说明为何应用需要此项权限</string>
</dict>
</plist>
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
内嵌动态模块依赖于 TapLogin
, 需额外添加 TapLogin
模块依赖。
dependencies {
implementation 'com.taptap.sdk:tap-core:4.8.2'
implementation 'com.taptap.sdk:tap-moment:4.8.2'
// 内嵌动态依赖登录模块
implementation 'com.taptap.sdk:tap-login:4.8.2'
}
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
内嵌动态模块依赖于 TapLogin
, 需额外添加 TapLogin
模块依赖。
dependencies {
implementation 'com.taptap.sdk:tap-core:4.8.2'
implementation 'com.taptap.sdk:tap-login:4.8.2'
implementation 'com.taptap.sdk:tap-moment:4.8.2'
}
iOS 提供通过添加 cocoaPods 远程依赖和使用本地文件导入两种集成方式,推荐使用远程依赖方式。
远程依赖
- 在工程 Podfile 文件中对应模块下添加依赖:
pod 'TapTapMomentSDK', '~> 4.8.2'
- 执行
Pod install
下载对应依赖文件 - 将工程 Pods 目录下
TapTapMomentSDK/Frameworks/TapTapMomentResource.bundle
和TapTapLoginSDK/Frameworks/TapTapLoginResource.bundle
等资源文件导入工程中
本地文件依赖
动态模块依赖于初始化和 TapTap 登录模块,使用本地文件方式添加依赖时,需先参考 TapSDK 集成 和 TapTap 登录 添加对应本地文件依赖项。
- 在下载页下载如下文件:
TapTapMomentSDK.xcframework
动态依赖库TapTapMomentResource.bundle
动态资源文件
- 在工程中添加
framework
静态库,注意添加时选择 Embed 方式为 Do Not Embed,导入bundle
资源文件
iOS 提供通过添加 cocoaPods 远程依赖和使用本地文件导入两种集成方式,推荐使用远程依赖方式。
远程依赖
- 在工程 Podfile 文件中对应模块下添加依赖:
pod 'TapTapMomentSDK', '~> 4.8.2'
- 执行
Pod install
下载对应依赖文件 - 将工程 Pods 目录下
TapTapMomentSDK/Frameworks/TapTapMomentResource.bundle
和TapTapLoginSDK/Frameworks/TapTapLoginResource.bundle
等资源文件导入工程中
本地文件依赖
动态模块依赖于初始化和 TapTap 登录模块,使用本地文件方式添加依赖时,需先参考 TapSDK 集成 和 TapTap 登录 添加对应本地文件依赖项。
- 在下载页下载如下文件:
TapTapMomentSDK.xcframework
动态依赖库TapTapMomentResource.bundle
动态资源文件
- 在工程中添加
framework
静态库,注意添加时选择 Embed 方式为 Do Not Embed,导入bundle
资源文件
SDK 初始化
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
TapTapSdkOptions
详细参数见 入门指南#快速开始
using TapSDK.Core;
// 核心配置 详细参数见 [TapTapSDK]
TapTapSdkOptions coreOptions = new TapTapSdkOptions();
// TapSDK 初始化
TapTapSDK.Init(coreOptions);
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()
options.clientId = "your_client_id" // 必须,开发者中心对应 Client ID
options.clientToken = "your_client_token" // 必须,开发者中心对应 Client Token
options.region = .CN // .CN:中国大陆,.overseas:其他国家或地区
options.enableLog = enableLog.selectedSegmentIndex == 0 // 是否开启 log,建议 Debug 开启,Release 关闭,默认关闭 log
options.preferredLanguage = TapLanguageType.auto // 语言设置,默认跟随系统,当系统语言不支持时,国内为中文,海外为英文
// 初始化 SDK
TapTapSDK.initWith(options)
#import "TapTapCoreSDK/TapTapSDK.h"
// 核心配置项
TapTapSdkOptions *options = [[TapTapSdkOptions alloc] init];
options.clientId = @"your_clientId"; // 必须,开发者中心对应 Client ID
options.clientToken = @"your_client_token"; // 必须,开发者中心对应 Client Token
options.region = TapTapRegionTypeCN; // CN:中国大陆,overseas:其他国家或地区
options.enableLog = YES; // 是否开启 log,建议 Debug 开启,Release 关闭,默认关闭 log
options.preferredLanguage = TapLanguageType_Auto; // 语言设置,默认跟随系统,当系统语言不支持时,国内为中文,海外为英文
// 初始化 SDK
[TapTapSDK initWithOptions:options];
设置回调
设置回调以获取动态的状态变化。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.Moment;
TapTapMoment.SetCallback((code, msg) =>
{
// 根据 code 处理动态事件
});
// 移除 callback
TapTapMoment.SetCallback(null);
import com.taptap.sdk.moment.TapTapMoment;
TapTapMoment.setCallback(new TapTapMoment.TapTapMomentCallback() {
@Override
public void onCallback(int code, @Nullable String msg) {
// 根据 code 处理事件
}
});
TapTapMoment.setCallback(null);
import com.taptap.sdk.moment.TapTapMoment
TapTapMoment.setCallback(
callback = object : TapTapMoment.TapTapMomentCallback {
override fun onCallback(code: Int, msg: String?) {
// 根据 code 处理事件
}
}
)
// 移除 callback
TapTapMoment.setCallback(null);
import TapTapMomentSDK
// 实现 TapTapMomentDelegate 协议
extension GameMainScene:TapTapMomentDelegate{
func onMomentCallback(withCode code: Int, msg: String) {
// 根据 code 处理动态事件
}
}
// 注册回调
TapTapMoment.setDelegate(self)
#import "TapTapMomentSDK/TapTapMoment.h"
@interface GameMainController () <TapTapMomentDelegate>
@end
@implementation GameMainController
- (void)onMomentCallbackWithCode:(NSInteger)code msg:(nonnull NSString *)msg {
// 根据 code 处理动态事件
}
// 注册回调
- (void)registerMomentCallback {
[TapTapMoment setDelegate:self];
}
回调方法中 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 Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.Moment;
TapTapMoment.FetchNotification();
import com.taptap.sdk.moment.TapTapMoment;
TapTapMoment.fetchNotification();
import com.taptap.sdk.moment.TapTapMoment
TapTapMoment.fetchNotification()
import TapTapMomentSDK
TapTapMoment.fetchNotification()
#import "TapTapMomentSDK/TapTapMoment.h"
[TapTapMoment fetchNotification];
获取消息通知的结果会在本文刚开始设置的回调中返回,code
为 CALLBACK_CODE_GET_NOTICE_SUCCESS
(20000
)表示获取成功,CALLBACK_CODE_GET_NOTICE_FAIL
(20100
)表示获取失败。
获取成功时,msg
为新消息数量,0
表示没有新消息。
为了方便玩家查看好友动态、游戏公告等,我们建议将 TapTap 动态入口放在显眼的位置,每分钟调用 1 次获取消息通知的接口。
获取消息通知时,如果没有新消息(msg
为 0
),那么游戏需要清除界面上的小红点。
同样,打开 TapTap 动态页面后,游戏也需要清除界面上的小红点。
显示动态页面
在游戏中显示 TapTap 动态页面,玩家可以查看及发布动态。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.Moment;
TapTapMoment.open();
import com.taptap.sdk.moment.TapTapMoment;
TapTapMoment.open();
import com.taptap.sdk.moment.TapTapMoment
TapTapMoment.open()
import TapTapMomentSDK
TapTapMoment.open()
#import "TapTapMomentSDK/TapTapMoment.h"
[TapTapMoment open];
打开动态页面时,请先屏蔽游戏自身的声音,以免干扰动态内的视频声音。
如需要动态能支持横竖屏随设备自动旋转,需要游戏自身能支持横竖屏。
如前所述,打开动态页面后别忘了清除动态页面入口处的小红点。
动态页面的背景图可以配置,步骤如下图所示。 背景图需要人工审核后才能生效,请预留充足的时间。