好友(不含聊天)开发指南
本文介绍如何在游戏中加入好友系统。
集成前准备
- 参考 开发者中心配置 创建应用、配置包名与签名证书
- 参考集成指南(Unity、Android、iOS)完成对应平台或引擎的基础接入
- 好友 Lite 模块依赖于 TapTap 登录模块,开发者接入前应先完成 TapTap 登录的接入
info
注意:【获取好友列表/获取关注列表/获取粉丝列表】需要双方都授予好友关系权限,在登录接口的 scopes 参数中添加 user_friends 权限。
权限说明
- Android
该模块需要如下权限:
| 权限 | 使用目的 | 权限申请时机 |
|---|---|---|
| 网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
| 网络状态权限 | 用于检查网络连接状态(如 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 获取
- Unity
- Android
- iOS
远程依赖
NPMJS 方式:在 Packages/manifest.json 中添加:
"dependencies":{
"com.taptap.sdk.core":"4.9.3",
"com.taptap.sdk.login":"4.9.3",
"com.taptap.sdk.relationlite":"4.9.3"
}
GitHub 方式:在 Packages/manifest.json 中添加:
"dependencies":{
"com.taptap.sdk.core":"https://github.com/taptap/tapsdk-unity-dist.git?path=/Core#4.9.3",
"com.taptap.sdk.login":"https://github.com/taptap/tapsdk-unity-dist.git?path=/Login#4.9.3",
"com.taptap.sdk.relationlite":"https://github.com/taptap/tapsdk-unity-dist.git?path=/RelationLite#4.9.3"
}
本地文件导入
在 下载页 下载并导入以下 unitypackage 文件:
TapSDK_Core.unitypackage(TapTapSDK 核心模块,必选)TapSDK_Login.unitypackage(TapTapSDK 登录模块,必选)TapSDK_RelationLite.unitypackage(TapTapSDK 好友 Lite 模块,必选)
在 app module 的 build.gradle 中添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.9.3'
implementation 'com.taptap.sdk:tap-login:4.9.3'
implementation 'com.taptap.sdk:tap-relation-lite:4.9.3'
}
远程依赖
- 在工程 Podfile 文件 中对应模块下添加依赖:
pod 'TapTapSDK/RelationLite', '~> 4.9.3'
- 执行
Pod install下载对应依赖文件
本地文件依赖
好友 Lite 依赖于初始化和 TapTap 登录模块,使用本地文件方式添加依赖时,需先参考集成指南 和 TapTap 登录添加对应本地文件依赖项。
- 在下载页下载如下文件:
TapTapRelationLiteSDK好友依赖库TapTapRelationLiteResource.bundle好友资源文件TapTapProfileSDK用户名片依赖库TapTapProfileResource.bundle用户名片资源文件TapTapKingfisher基础库
- 在工程中添加
framework静态库,注意添加时选择 Embed 方式为 Do Not Embed,导入bundle资源文件
注册/注销 统一状态码监听回调
统一状态回调,不同 code 代表不同的状态。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
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 好友关系权限,在调用登录时添加 user_friends 权限
}
}
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 好友关系权限,在调用登录时添加 user_friends 权限
}
};
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)
import TapTapRelationLiteSDK
class MyRelationLiteDelegate: NSObject, TapTapRelationLiteDelegate {
func onRelationLiteResult(code: Int) {
switch(code){
case TapTapRelationLiteCode.NEED_LOGIN:
// 需要登录
case TapTapRelationLiteCode.NEED_USER_FRIENDS_SCOPE:
// 缺少好友权限
case TapTapRelationLiteCode.REQUEST_ERROR:
// 请求错误
default:
// 其他错误
}
}
}
let myRelationLiteDelegate = MyRelationLiteDelegate()
// 注册好友回调
TapTapRelationLite.registerRelationLiteDelegate(delegate: myRelationLiteDelegate)
// 移除好友回调
TapTapRelationLite.unregisterRelationLiteDelegate(delegate: myRelationLiteDelegate)
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
@interface GameMainController() <TapTapRelationLiteDelegate>
@end
@implementation GameMainController
- (void) handleRelationDelegate {
[TapTapRelationLite registerRelationLiteDelegateWithDelegate:self];
[TapTapRelationLite unregisterRelationLiteDelegateWithDelegate:self];
}
- (void)onRelationLiteResultWithCode:(NSInteger)code {
if(code == TapTapRelationLiteCode.NEED_LOGIN){
// 未登录
}else if(code == TapTapRelationLiteCode.NEED_USER_FRIENDS_SCOPE){
// 缺少好友权限授权
}else if (code == TapTapRelationLiteCode.REQUEST_ERROR){
// 请求错误
}else{
// 其他错误
}
}
@end
邀请好友上线
打开邀请好友页面,向选中好友发送邀请上线消息。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.RelationLite;
TapTapRelationLite.InviteGame();
import com.taptap.sdk.relation.lite.TapTapRelationLite;
TapTapRelationLite.inviteGame();
import com.taptap.sdk.relation.lite.TapTapRelationLite
TapTapRelationLite.inviteGame()
import TapTapRelationLiteSDK
TapTapRelationLite.inviteGame()
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
[TapTapRelationLite inviteGame];
邀请好友组队
打开邀请好友页面,向选中好友发送邀请组队消息,需要传组队相关参数teamId。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
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)
import TapTapRelationLiteSDK
let teamId = ""
TapTapRelationLite.inviteTeam(teamId: teamId)
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
NSString * teamId = @"";
[TapTapRelationLite inviteTeamWithTeamId:teamId];
获取好友列表
获取当前用户的好友列表。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.RelationLite;
// 如非第一页 使用接口返回的nextPageToken
string nextPageToken = "";
try
{
var result = await TapTapRelationLite.GetFriendsList(nextPageToken);
// result.nextPageToken 下一页请求token,分页请求需传入
// result.list 好友列表请求结果
}
catch (Exception e)
{
Debug.Log($"friendsList request error : {e.Message}");
}
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
) {
}
})
import TapTapRelationLiteSDK
let nextPageToken = ""
TapTapRelationLite.getFriendsList(nextPageToken: nextPageToken) { result, error in
if let error {
NSLog("request error : \(error.localizedDescription)")
return
}
// 请求成功, 好友数据:result?.list, 下一页 token : result?.nextPageToken
}
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
NSString * nextPageToken = @"";
[TapTapRelationLite getFriendsListWithNextPageToken:nextPageToken completion:^(RelationLiteUserResult * _Nullable result, NSError * _Nullable error) {
if(error){
NSLog(@"request error : %@", error.localizedDescription);
return;
}
// 请求成功, 好友数据:result.list, 下一页 token :result.nextPageToken
}];
获取关注列表
获取当前用户的关注列表。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.RelationLite;
// 如非第一页 使用接口返回的nextPageToken
string nextPageToken = "";
try
{
var result = await TapTapRelationLite.GetFollowingList(nextPageToken);
// result.nextPageToken 下一页请求token,分页请求需传入
// result.list 关注列表请求结果
}
catch (Exception e)
{
Debug.Log($"followingList request error : {e.Message}");
}
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
) {
}
})
import TapTapRelationLiteSDK
let nextPageToken = ""
TapTapRelationLite.getFollowingList(nextPageToken: nextPageToken) { result, error in
if let error {
NSLog("request error : \(error.localizedDescription)")
return
}
// 请求成功, 关注用户数据:result?.list, 下一页 token : result?.nextPageToken
}
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
NSString * nextPageToken = @"";
[TapTapRelationLite getFollowingListWithNextPageToken:nextPageToken completion:^(RelationLiteUserResult * _Nullable result, NSError * _Nullable error) {
if(error){
NSLog(@"request error : %@", error.localizedDescription);
return;
}
// 请求成功, 关注用户数据:result.list, 下一页 token :result.nextPageToken
}];
获取粉丝列表
获取当前用户的粉丝列表。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.RelationLite;
// 如非第一页 使用接口返回的nextPageToken
string nextPageToken = "";
try
{
var result = await TapTapRelationLite.GetFansList(nextPageToken);
// result.nextPageToken 下一页请求token,分页请求需传入
// result.list 粉丝列表请求结果
}
catch (Exception e)
{
Debug.Log($"fansList request error : {e.Message}");
}
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
) {
}
})
import TapTapRelationLiteSDK
let nextPageToken = ""
TapTapRelationLite.getFansList(nextPageToken: nextPageToken) { result, error in
if let error {
NSLog("request error : \(error.localizedDescription)")
return
}
// 请求成功, 粉丝数据:result?.list, 下一页 token : result?.nextPageToken
}
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
NSString * nextPageToken = @"";
[TapTapRelationLite getFansListWithNextPageToken:nextPageToken completion:^(RelationLiteUserResult * _Nullable result, NSError * _Nullable error) {
if(error){
NSLog(@"request error : %@", error.localizedDescription);
return;
}
// 请求成功, 粉丝数据:result.list, 下一页 token :result.nextPageToken
}];
同步好友关系(openId)
使用好友 openId 将好友关系同步至 TapTap。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.RelationLite;
// 0-新增好友 1-删除好友
int action = 1;
// 当前用户昵称
string nickname = "";
// 好友用户昵称
string friendNickname = "";
// 好友openId
string friendOpenId = "";
try
{
await TapTapRelationLite.SyncRelationshipWithOpenId(action, nickname, friendNickname, friendOpenId);
}
catch (Exception e)
{
Debug.Log($" request error : {e.Message}");
}
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
) {
}
})
import TapTapRelationLiteSDK
let action = 0 // 0-新增好友 1-删除好友
let nickname = ""
let friendNickname = ""
let friendOpenId = ""
TapTapRelationLite.syncRelationshipWithOpenId(action: action , nickname: nickname, friendNickname: friendNickname, friendOpenId: friendOpenId) { error in
if let error {
NSLog("request error : \(error.localizedDescription)")
return
}
// 同步成功
}
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
NSInteger action = 0;
NSString * nickName = @"";
NSString * friendNickName = @"";
NSString * friendOpenId = @"";
[TapTapRelationLite syncRelationshipWithOpenIdWithAction:action nickname:nickName friendNickname:friendNickName friendOpenId:friendOpenId completion:^(NSError * _Nullable error) {
if(error){
NSLog(@" sync fail error = %@", error.localizedDescription);
return;
}
//同步成功
}];
同步好友关系(unionId)
使用好友 unionId 将好友关系同步至 TapTap。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.RelationLite;
// 0-新增好友 1-删除好友
int action = 1;
// 当前用户昵称
string nickname = "";
// 好友用户昵称
string friendNickname = "";
// 好友 unionId
string friendUnionId = ""
try
{
await TapTapRelationLite.SyncRelationshipWithUnionId(action, nickname, friendNickname, friendUnionId);
}
catch (Exception e)
{
Debug.Log($" request error : {e.Message}");
}
import com.taptap.sdk.relation.lite.TapTapRelationLite;
import com.taptap.sdk.relation.lite.internal.TapTapRelationRequestCallback;
int action = 1;
String nickname = "";
String friendNickname = "";
String friendUnionId = "";
TapTapRelationLite.syncRelationshipWithUnionId(action, nickname, friendNickname, friendUnionId, 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 friendUnionId = ""
TapTapRelationLite.syncRelationshipWithUnionId(
action = action,
nickname = nickname,
friendNickname = friendNickname,
friendUnionId = friendUnionId,
callback = object : TapTapRelationRequestCallback() {
override fun onSyncRelationshipSuccess(openId: String, unionId: String) {
}
override fun onSyncRelationshipFail(
errorMessage: String?,
openId: String,
unionId: String
) {
}
})
import TapTapRelationLiteSDK
let action = 0 // 0-新增好友 1-删除好友
let nickname = ""
let friendNickname = ""
let friendUnionId = ""
TapTapRelationLite.syncRelationshipWithUnionId(action: action , nickname: nickname, friendNickname: friendNickname, friendUnionId: friendUnionId) {
error in
if let error {
NSLog("request error : \(error.localizedDescription)")
return
}
// 同步成功
}
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
NSInteger action = 0;
NSString * nickName = @"";
NSString * friendNickName = @"";
NSString * friendUnionId = @"";
[TapTapRelationLite syncRelationshipWithUnionIdWithAction: action nickname:nickName friendNickname:friendNickName friendUnionId:friendUnionId completion:^(NSError * _Nullable error) {
if(error){
NSLog(@" sync fail error = %@", error.localizedDescription);
return;
}
// 同步成功
}];
展示 TapTap 用户名片
展示指定用户的名片弹窗,可用于关注/取关用户。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.RelationLite;
string openId = "";
string unionId = "";
TapTapRelationLite.ShowTapUserProfile(openId, unionId);
import com.taptap.sdk.relation.TapTapRelationLite;
// openId unionId二选一即可
String openId = "";
String unionId = "";
TapTapRelationLite.showTapUserProfile(openId, unionId);
import com.taptap.sdk.relation.TapTapRelationLite
// openId unionId二选一即可
val openId = "";
val unionId = "";
TapTapRelationLite.showTapUserProfile(openId = openId, unionId = unionId)
import TapTapRelationLiteSDK
// openId unionId二选一即可
let openId = ""
let unionId = ""
TapTapRelationLite.showTapUserProfile(openId: openId)
TapTapRelationLite.showTapUserProfile(unionId: unionId)
#import "TapTapRelationLiteSDK/TapTapRelationLiteSDK-Swift.h"
// openId unionId二选一即可
NSString * openId = @"";
NSString * unionId = @"";
[TapTapRelationLite showTapUserProfileWithOpenId:openId unionId:unionId];
国际化
TapTapRelationLite 支持设置语言:目前只支持简体中文