好友(不含聊天)开发指南
本文介绍如何在游戏中加入好友系统。
权限说明
- Unity
- Android Java
- Android Kotlin
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
读取外部存储权限 | 用于读取设备上的文件和媒体内容 | 用户首次使用相关功能时会申请权限 |
写入外部存储权限 | 用于保存文件到设备存储 | 用户首次使用文件保存功能时会申请权限 |
管理外部存储权限 | 用于管理设备上的文件 | 用户首次使用文件管理功能时会申请权限 |
前台服务权限 | 用于在应用处于后台时保持某些功能运行 | 应用需要在后台运行服务时 |
相机权限 | 用于拍摄照片和视频通话 | 用户首次使用相机相关功能时会申请权限 |
振动权限 | 用于消息通知时的振动提醒 | 应用需要使用振动提醒时 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
读取外部存储权限 | 用于读取设备上的文件和媒体内容 | 用户首次使用相关功能时会申请权限 |
写入外部存储权限 | 用于保存文件到设备存储 | 用户首次使用文件保存功能时会申请权限 |
管理外部存储权限 | 用于管理设备上的文件 | 用户首次使用文件管理功能时会申请权限 |
前台服务权限 | 用于在应用处于后台时保持某些功能运行 | 应用需要在后台运行服务时 |
相机权限 | 用于拍摄照片和视频通话 | 用户首次使用相机相关功能时会申请权限 |
振动权限 | 用于消息通知时的振动提醒 | 应用需要使用振动提醒时 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
集成前准备
参考 准备工作 创建应用、开启好友服务。
SDK 获取
由于 TapSDK V4 依赖于 TapTapCore 核心库 以及 TapTapLogin 登录,所以需要在 TapTapCore 的基础上,另外添加 TapTapRelationLite
、 TapTapLogin
模块:
- Unity
- Android Java
- Android Kotlin
第一步:添加 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.7.0",
"com.taptap.sdk.login":"4.7.0",
"com.taptap.sdk.relationlite":"4.7.0",
}
但需要注意的是,需在 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.7.0",
"com.taptap.sdk.login":"https://github.com/taptap/TapSDKLogin-Unity.git#4.7.0",
"com.taptap.sdk.relationlite":"https://github.com/taptap/TapSDKRelationLite-Unity.git#4.7.0",
}
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
本地文件导入
- 在 下载页 下载下列模块对应
unitypackage
文件,并在 Unity 项目中依次通过 Assets > Import Packages > Custom Packages 进行导入,包括:
TapSDK_Core.unitypackage
TapTapSDK 核心模块,必选。TapSDK_Login.unitypackage
TapTapSDK 登录模块,必选。TapSDK_RelationLite.unitypackage
TapTapSDK 好友 Lite 模块,必选。
- 如果当前项目已集成
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.7.0'
implementation 'com.taptap.sdk:tap-login:4.7.0'
implementation 'com.taptap.sdk:tap-relation-lite:4.7.0'
}
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.7.0'
implementation 'com.taptap.sdk:tap-login:4.7.0'
implementation 'com.taptap.sdk:tap-relation-lite:4.7.0'
}
SDK 初始化
详见 TapTapSDK 初始化文档。
- Unity
- Android Java
- Android Kotlin
TapTapSdkOptions
详细参数见 入门指南#快速开始
using TapSDK.Core;
using TapSDK.RelationLite;
// 核心配置 详细参数见 [TapTapSDK]
TapTapSdkOptions coreOptions = new TapTapSdkOptions();
// 设置屏幕方向:0-竖屏 1-横屏
coreOptions.screenOrientation = 1;
// TapSDK 初始化
TapTapSDK.Init(coreOptions, otherOptions);
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;
// 屏幕方向,横屏传ScreenOrientation.LANDSCAPE 竖屏传ScreenOrientation.PORTRAIT
int screenOrientation = ScreenOrientation.PORTRAIT
TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
clientId, // 游戏 Client ID
clientToken, // 游戏 Client Token
screenOrientation, // 屏幕方向
TapTapRegion.CN // 游戏可玩区域: [TapTapRegion.CN]=国内 [TapTapRegion.GLOBAL]=海外
);
tapSdkOptions.setEnableLog(enableLog);
// 初始化 TapSDK
TapTapSdk.init(context, tapSdkOptions);
import com.taptap.sdk.core.TapTapSdk
import com.taptap.sdk.core.TapTapSdkOptions
import com.taptap.sdk.core.TapTapLanguage
import com.taptap.sdk.core.TapTapRegion
/* 必选配置 */
// 开发者中心对应 Client ID
val clientId = "";
// 开发者中心对应 Client Token
val clientToken = "";
// 是否开启 log,建议 Debug 开启,Release 关闭,默认关闭 log
val enableLog = BuildConfig.DEBUG;
// 屏幕方向,横屏传ScreenOrientation.LANDSCAPE 竖屏传ScreenOrientation.PORTRAIT
val screenOrientation = ScreenOrientation.PORTRAIT
TapTapSdk.init(
context = context,
sdkOptions = TapTapSdkOptions(
clientId = clientId,
clientToken = clientToken,
region = TapTapRegion.CN,
screenOrientation = screenOrientation,
preferredLanguage = TapTapLanguage.ZH_HANS,
enableLog = false
)
)
注册/注销 统一状态码监听回调
统一状态回调,不同 code 代表不同的状态。
- Unity
- Android Java
- Android Kotlin
using TapSDK.RelationLite;
RelationLiteCallback callback = new RelationLiteCallback();
TapTapRelationLite.RegisterRelationLiteCallback(callback);
TapTapRelationLite.UnregisterRelationLiteCallback(callback);
class RelationLiteCallback : ITapTapRelationLiteCallback
{
public RelationLiteCallback(){}
public void OnResult(int code)
{
// 处理好友 SDK 的状态码
// 700001:需要登录
// 700002:需要授权 TapTap 好友关系权限
}
}
import com.taptap.sdk.relation.lite.internal.TapTapRelationLiteCallback;
import com.taptap.sdk.relation.lite.TapTapRelationLite;
import com.taptap.sdk.relation.lite.internal.TapTapRelationLiteCode;
TapTapRelationLiteCallback callback = new TapTapRelationLiteCallback(){
@Override
public void onRelationLiteResult(int code) {
// 处理好友 SDK 的状态码
// TapTapRelationLiteCode.NEED_LOGIN:需要登录
// TapTapRelationLiteCode.NEED_USER_FRIENDS_SCOPE:需要授权 TapTap 好友关系权限
}
};
TapTapRelationLite.registerRelationLiteCallback(callback);
TapTapRelationLite.unregisterRelationLiteCallback(callback);
import com.taptap.sdk.relation.lite.internal.TapTapRelationLiteCallback
import com.taptap.sdk.relation.lite.TapTapRelationLite
import com.taptap.sdk.relation.lite.internal.TapTapRelationLiteCode
private val relationLiteCallback = object : TapTapRelationLiteCallback {
override fun onRelationLiteResult(code: Int) {
when (code) {
NEED_LOGIN -> appendLog("未登录,请先登录")
NEED_USER_FRIENDS_SCOPE -> appendLog("未授权好友关系,请授权")
}
}
}
TapTapRelationLite.registerRelationLiteCallback(callback = relationLiteCallback)
TapTapRelationLite.unregisterRelationLiteCallback(callback = relationLiteCallback)
邀请好友上线
打开邀请好友页面,向选中好友发送邀请上线消息。
- Unity
- Android Java
- Android Kotlin
using TapSDK.RelationLite;
TapTapRelationLite.InviteGame();
import com.taptap.sdk.relation.lite.TapTapRelationLite;
TapTapRelationLite.inviteGame();
import com.taptap.sdk.relation.lite.TapTapRelationLite
TapTapRelationLite.inviteGame()
邀请好友组队
打开邀请好友页面,向选中好友发送邀请组队消息,需要传组队相关参数teamId。
- Unity
- Android Java
- Android Kotlin
using TapSDK.RelationLite;
string teamId = "";
TapTapRelationLite.InviteTeam(teamId);
import com.taptap.sdk.relation.lite.TapTapRelationLite;
String teamId = "";
TapTapRelationLite.inviteTeam(teamId);
import com.taptap.sdk.relation.lite.TapTapRelationLite
val teamId = ""
TapTapRelationLite.inviteTeam(teamId = teamId)
获取好友列表
获取当前用户的好友列表。
- Unity
- Android Java
- Android Kotlin
using TapSDK.RelationLite;
class RelationLiteRequestCallback : ITapTapRelationLiteRequestCallback
{
public RelationLiteRequestCallback(){}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 好友列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:好友列表请求结果
}
public void OnFollowingListResult(string nextPageToken, List<RelationLiteUserItem> followingList)
{
// 关注列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:关注列表请求结果
}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 粉丝列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:粉丝列表请求结果
}
public void OnSyncRelationshipSuccess(string openId, string unionId)
{
// 同步好友关系成功
// openId: 好友openId
// unionId:好友unionId
}
public void OnSyncRelationshipFail(string errorMessage, string openId, string unionId)
{
// 同步好友关系失败
// errorMessage:错误信息
// openId: 好友openId
// unionId:好友unionId
}
public void OnRequestError(string errorMessage)
{
// 接口请求错误
// errorMessage:错误信息
}
// 如非第一页 使用接口返回的nextPageToken
string nextPageToken = "";
RelationLiteRequestCallback callback = new RelationLiteRequestCallback();
TapTapRelationLite.GetFriendsList(nextPageToken, callback);
}
import com.taptap.sdk.relation.lite.TapTapRelationLite;
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback;
import com.taptap.sdk.relation.lite.internal.model.RelationLiteUserItem;
String nextPage = "";
TapTapRelationLite.getFriendsList(nextPage, new TapTapRelationRequestCallback() {
@Override
public void onFriendsListResult(@NonNull List<RelationLiteUserItem> friendsList, @NonNull String nextPageToken) {
}
});
import com.taptap.sdk.relation.lite.TapTapRelationLite
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback
import com.taptap.sdk.relation.lite.internal.model.RelationLiteUserItem
val nextPage = ""
TapTapRelationLite.getFansList(
nextPageToken = nextPage,
callback = object : TapTapRelationRequestCallback() {
override fun onFriendsListResult(
friendsList: List<RelationLiteUserItem>,
nextPageToken: String
) {
}
})
获取关注列表
获取当前用户的关注列表。
- Unity
- Android Java
- Android Kotlin
using TapSDK.RelationLite;
class RelationLiteRequestCallback : ITapTapRelationLiteRequestCallback
{
public RelationLiteRequestCallback(){}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 好友列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:好友列表请求结果
}
public void OnFollowingListResult(string nextPageToken, List<RelationLiteUserItem> followingList)
{
// 关注列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:关注列表请求结果
}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 粉丝列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:粉丝列表请求结果
}
public void OnSyncRelationshipSuccess(string openId, string unionId)
{
// 同步好友关系成功
// openId: 好友openId
// unionId:好友unionId
}
public void OnSyncRelationshipFail(string errorMessage, string openId, string unionId)
{
// 同步好友关系失败
// errorMessage:错误信息
// openId: 好友openId
// unionId:好友unionId
}
public void OnRequestError(string errorMessage)
{
// 接口请求错误
// errorMessage:错误信息
}
// 如非第一页 使用接口返回的nextPageToken
string nextPageToken = "";
RelationLiteRequestCallback callback = new RelationLiteRequestCallback();
TapTapRelationLite.GetFollowingList(nextPageToken, callback);
}
import com.taptap.sdk.relation.lite.TapTapRelationLite;
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback;
import com.taptap.sdk.relation.lite.internal.model.RelationLiteUserItem;
String nextPage = "";
TapTapRelationLite.getFollowingList(nextPage, new TapTapRelationRequestCallback() {
@Override
public void onFollowingListResult(@NonNull List<RelationLiteUserItem> followingList, @NonNull String nextPageToken) {
}
});
import com.taptap.sdk.relation.lite.TapTapRelationLite
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback
import com.taptap.sdk.relation.lite.internal.model.RelationLiteUserItem
val nextPage = ""
TapTapRelationLite.getFollowingList(
nextPageToken = nextPage,
callback = object : TapTapRelationRequestCallback() {
override fun onFollowingListResult(
followingList: List<RelationLiteUserItem>,
nextPageToken: String
) {
}
})
获取粉丝列表
获取当前用户的粉丝列表。
- Unity
- Android Java
- Android Kotlin
using TapSDK.RelationLite;
class RelationLiteRequestCallback : ITapTapRelationLiteRequestCallback
{
public RelationLiteRequestCallback(){}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 好友列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:好友列表请求结果
}
public void OnFollowingListResult(string nextPageToken, List<RelationLiteUserItem> followingList)
{
// 关注列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:关注列表请求结果
}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 粉丝列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:粉丝列表请求结果
}
public void OnSyncRelationshipSuccess(string openId, string unionId)
{
// 同步好友关系成功
// openId: 好友openId
// unionId:好友unionId
}
public void OnSyncRelationshipFail(string errorMessage, string openId, string unionId)
{
// 同步好友关系失败
// errorMessage:错误信息
// openId: 好友openId
// unionId:好友unionId
}
public void OnRequestError(string errorMessage)
{
// 接口请求错误
// errorMessage:错误信息
}
// 如非第一页 使用接口返回的nextPageToken
string nextPageToken = "";
RelationLiteRequestCallback callback = new RelationLiteRequestCallback();
TapTapRelationLite.GetFansList(nextPageToken, callback);
}
import com.taptap.sdk.relation.lite.TapTapRelationLite;
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback;
import com.taptap.sdk.relation.lite.internal.model.RelationLiteUserItem;
String nextPage = "";
TapTapRelationLite.getFansList(nextPage, new TapTapRelationRequestCallback() {
@Override
public void onFansListResult(@NonNull List<RelationLiteUserItem> fansList, @NonNull String nextPageToken) {
}
});
import com.taptap.sdk.relation.lite.TapTapRelationLite
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback
import com.taptap.sdk.relation.lite.internal.model.RelationLiteUserItem
val nextPage = ""
TapTapRelationLite.getFansList(
nextPageToken = nextPage,
callback = object : TapTapRelationRequestCallback() {
override fun onFansListResult(
fansList: List<RelationLiteUserItem>,
nextPageToken: String
) {
}
})
同步好友关系(openId)
使用好友 openId 将好友关系同步至 TapTap。
- Unity
- Android Java
- Android Kotlin
using TapSDK.RelationLite;
class RelationLiteRequestCallback : ITapTapRelationLiteRequestCallback
{
public RelationLiteRequestCallback(){}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 好友列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:好友列表请求结果
}
public void OnFollowingListResult(string nextPageToken, List<RelationLiteUserItem> followingList)
{
// 关注列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:关注列表请求结果
}
public void OnFriendsListResult(string nextPageToken, List<RelationLiteUserItem> friendsList)
{
// 粉丝列表
// nextPageToken: 下一页请求token,分页请求需传入
// friendsList:粉丝列表请求结果
}
public void OnSyncRelationshipSuccess(string openId, string unionId)
{
// 同步好友关系成功
// openId: 好友openId
// unionId:好友unionId
}
public void OnSyncRelationshipFail(string errorMessage, string openId, string unionId)
{
// 同步好友关系失败
// errorMessage:错误信息
// openId: 好友openId
// unionId:好友unionId
}
public void OnRequestError(string errorMessage)
{
// 接口请求错误
// errorMessage:错误信息
}
// 0-新增好友 1-删除好友
int action = 1;
// 当前用户昵称
string nickname = "";
// 好友用户昵称
string friendNickname = "";
// 好友openId
string friendOpenId = "";
RelationLiteRequestCallback callback = new RelationLiteRequestCallback();
TapTapRelationLite.SyncRelationshipWithOpenId(action, nickname, friendNickname, friendOpenId, callback);
}
import com.taptap.sdk.relation.lite.TapTapRelationLite;
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback;
int action = 1;
String nickname = "";
String friendNickname = "";
String friendOpenId = "";
TapTapRelationLite.syncRelationshipWithOpenId(action, nickname, friendNickname, friendOpenId, new TapTapRelationRequestCallback() {
@Override
public void onSyncRelationshipSuccess(@NonNull String openId, @NonNull String unionId) {
}
@Override
public void onSyncRelationshipFail(@Nullable String errorMessage, @NonNull String openId, @NonNull String unionId) {
}
});
import com.taptap.sdk.relation.lite.TapTapRelationLite
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback
val action = 1
val nickname = ""
val friendNickname = ""
val friendOpenId = ""
TapTapRelationLite.syncRelationshipWithOpenId(
action = action,
nickname = nickname,
friendNickname = friendNickname,
friendOpenId = friendOpenId,
callback = object : TapTapRelationRequestCallback() {
override fun onSyncRelationshipSuccess(openId: String, unionId: String) {
}
override fun onSyncRelationshipFail(
errorMessage: String?,
openId: String,
unionId: String
) {
}
})