关注模式
阅读本文前请先完成 SDK 初始化。
好友通知设置
好友模块默认会向游戏推送好友状态及申请的通知,如果游戏需要关闭,可调用如下接口:
- Unity
- Android
- iOS
try {
await TDSFollows.DisableFriendNotification();
TapLog("关闭推送通知成功");
} catch (Exception e) {
TapLog($"关闭推送通知失败: ${e}");
}
TDSFollows.disableFriendNotification(new Callback<Void>() {
@Override
public void onSuccess(Void result) {
toast("消息推送关闭成功");
}
@Override
public void onFail(TDSFriendError error) {
toast("消息推送关闭失败 " + error.detailMessage);
}
});
void (^callback)(BOOL succeeded, NSError * error) = ^(BOOL succeeded, NSError * _Nullable error){
if (succeeded) {
[LogHelper log:LogInfoTypeDisplay :[NSString stringWithFormat:@"设置成功"]];
} else {
[LogHelper log:LogInfoTypeError :[NSString stringWithFormat:@"设置失败"]];
}
};
[TDSFollows disableFriendNotificationWithCallback:callback];
当关闭通知后,如果需要再次开启,可调用如下接口:
- Unity
- Android
- iOS
try {
await TDSFollows.EnableFriendNotification();
TapLog("关闭推送通知成功");
} catch (Exception e) {
TapLog($"关闭推送通知失败: ${e}");
}
TDSFollows.enableFriendNotification(new Callback<Void>() {
@Override
public void onSuccess(Void result) {
toast("消息推送开启成功");
}
@Override
public void onFail(TDSFriendError error) {
toast("消息推送开启失败 " + error.detailMessage);
}
});
void (^callback)(BOOL succeeded, NSError * error) = ^(BOOL succeeded, NSError * _Nullable error){
if (succeeded) {
[LogHelper log:LogInfoTypeDisplay :[NSString stringWithFormat:@"设置成功"]];
} else {
[LogHelper log:LogInfoTypeError :[NSString stringWithFormat:@"设置失败"]];
}
};
[TDSFollows enableFriendNotificationWithCallback:callback];
响应好友变化通知
好友模块支持客户端监听好友状态变化,在游戏中实时给玩家提示。 你需要在调用上线接口前注册好友状态变更监听实例,这样,玩家上线后就能收到相应通知:
- Unity
- Android
- iOS
TDSFollows.FriendStatusChangedDelegate = new TDSFriendStatusChangedDelegate {
// 当前玩家成功上线(长连接建立成功)
OnConnected = () => {},
// 当前玩家长连接断开,SDK 会自动重试,开发者通常无需额外处理
OnDisconnected = () => {},
// 当前连接异常
OnConnectionError = (code, message) => {},
};
TDSFollows.registerFriendStatusChangedListener(new FriendStatusChangedListener() {
// 当前玩家成功上线(长连接建立成功)
@Override
public void onConnected() {}
// 当前玩家长连接断开,SDK 会自动重试,开发者通常无需额外处理
@Override
public void onDisconnected() {}
// 当前连接异常
@Override
public void onConnectError(int code, String msg){});
}
[TDSFollows registerNotificationDelegate:self];
// 当前玩家成功上线(长连接建立成功)
- (void)onConnected {}
// 当前玩家长连接断开,SDK 会自动重试,开发者通常无需额外处理
- (void)onDisconnected {}
// 当前连接异常
- (void)onDisconnectedWithError:(NSError * _Nullable)error {}
如果想要停止监听:
- Unity
- Android
- iOS
TDSFollows.FriendStatusChangedDelegate = null;
TDSFollows.removeFriendStatusChangedListener();
[TDSFollows unregisterNotificationDelegate];
玩家上线
玩家成功登录后,需要调用该接口建立和好友服务云端的长连接。 长连接建立 后,如果网络临时中断,SDK 会在网络恢复后自动重连。
- Unity
- Android
- iOS
await TDSFollows.Online();
TDSFollows.online(new Callback<Void>() {
@Override
public void onSuccess(Void result) {
// 成功
}
@Override
public void onFail(TDSFriendError error) {
// 处理异常
}
});
建立长连接后,如果玩家通过好友邀请链接打开游戏,那么 Android SDK 也会自动发送对应的好友申请。
[TDSFollows online];
玩家下线
玩家登出后,需要调用此接口断开和云端的长连接。
- Unity
- Android
- iOS
await TDSFollows.Offline();
TDSFollows.offline();
[TDSFollows offline];
根据昵称查询好友
在不知道玩家 objectId 的情况下,可以通过玩家昵称查询好友。
例如,搜索昵称为 Tarara 的好友:
- Unity
- Android
- iOS
ReadOnlyCollection<TDSFriendInfo> friendInfos = await TDSFollows.SearchUserByName("Tarara");
foreach (TDSFriendInfo info in friendInfos) {
// 玩家信息
TDSUser user = info.User;
// 富信息数据,详见后文
Dictionary<string, string> richPresence = info.RichPresence;
// 好友是否在线
bool online = info.Online;
}
TDSFollows.searchUserByName("Tarara", new ListCallback<TDSFriendInfo>() {
@Override
public void onSuccess(List<TDSFriendInfo> friendInfoList) {
for (TDSFriendInfo info : friendInfoList) {
// 玩家信息
TDSUser user = info.getUser();
// 富信息数据,详见后文
TDSRichPresence richPresence = info.getRichPresence();
// 好友是否在线
boolean online = info.isOnline();
}
}
@Override
public void onFail(TDSFriendError error) {
toast("Failed search friend by nickname" + error.detailMessage);
}
});
TDSFriendQueryOption *option = [TDSFriendQueryOption new];
option.from = 0;
option.limit = 100;
[TDSFollows searchUserWithNickname:@"Tarara" option:option
callback:^(NSArray<TDSFriendInfo *> * _Nullable friendInfos, NSError * _Nullable error) {
if (friendInfos) {
for (TDSFriendInfo *info in friendInfos) {
// 玩家信息
TDSUser *user = info.user;
// 富信息数据,详见后文
NSDictionary *richPresence = info.richPresence;
// 好友是否在线
BOOL online = info.online;
}
} else if (error) {
// 处理错误
}
}];
注意,使用这一功能的前提是内建账户系统中设置了 nickname(昵称)字段。
参见内建账户系统文档。
好友码
每个已登录玩家都有一个好友码,可以分享给其他玩家用于添加好友。
访问 TDSUser 的 shortId 属性可获取好友码:
- Unity
- Android
- iOS
// currentUser 是已登录的 TDSUser
string shortId = currentUser["shortId"];
String shortId = currentUser.getString("shortId");
NSString *shortId = currentUser[@"shortId"];
可以通过好友码查询玩家:
- Unity
- Android
- iOS
TDSFriendInfo friendInfo = await TDSFollows.SearchUserByShortCode(shortId);
TDSFollows.searchUserByShortCode(shortId, new Callback<TDSFriendInfo>() {
@Override
public void onSuccess(TDSFriendInfo friendInfo) { /* 略(参见上节) */ }
@Override
public void onFail(TDSFriendError error) { /* 略(参见上节) */ }
});
[TDSFollows searchUserWithShortCode:shortId
callback:^(TDSFriendInfo * _Nullable friendInfo, NSError * _Nullable error) {
// 略(参见上节)
}];
根据 objectId 查询好友
除了昵称、好友码外,还可以根据 objectId 查找好友。
查询 objectId 为 5b0b97cf06f4fd0abc0abe35 的好友:
- Unity
- Android
- iOS
TDSFriendInfo friendInfo = await TDSFollows.SearchUserById("5b0b97cf06f4fd0abc0abe35");
TDSFollows.searchUserById("5b0b97cf06f4fd0abc0abe35", new Callback<TDSFriendInfo>() {
@Override
public void onSuccess(TDSFriendInfo friendInfo) { /* 略 */ }
@Override
public void onFail(TDSFriendError error) { /* 略 */ }
});
[TDSFollows searchUserWithObjectId:@"5b0b97cf06f4fd0abc0abe35"
callback:^(TDSFriendInfo * _Nullable friendInfo, NSError * _Nullable error) {
// 略
}];
富信息
富信息用于呈现玩家状态等信息,如在线状态、正在使用哪个英雄、正处于哪个游戏模式等。
在控制台添加富信息相关配置后,可以根据已配置的富信息字段,设置对应的富信息内容:
- Unity
- Android
- iOS
await TDSFollows.SetRichPresence("score", "60");
TDSFollows.setRichPresence("score", "60", new Callback<Void>() {
@Override
public void onSuccess(Void result) {
toast("Succeed to set rich presence.");
}
@Override
public void onFail(TDSFriendError error) {
toast("Failed to set rich presence: " + error.detailMessage);
}
});
[TDSFollows setRichPresenceWithKey:@"score" value:@"60"
callback:^(BOOL succeeded, NSError * _Nullable error) {
if (succeeded) {
// Succeed to set rich presence.
} else if (error) {
// Failed to set rich presence.
}
}];
这里 score 是在控制台配置的富信息字段。
富信息的字段有两种类型:
-
variable类型,值是字符串。例如,之前的代码实例中,score在控制台配置为variable类型,因此客户端设置富信息字段的值时填了60,云端返回给客户端的富信息为"score": "60",在游戏界面该玩家的好友会看到当前玩家的富信息显示为「得分 60」之类。这里,开发者需要自行实现将score显示为「得分」等本地化内容的逻辑。 -
token类型,值是以#开头的字符串。例如,下面的代码实例中display字段的类型是token,客户端设置富信息字段的值时填了#matching,这个值在云端会进行多语言匹配,返回给客户端的富信息会直接替换为本地化的内容:"display": "匹配中"。注意,如果多语言匹配失败则会返回空字符串("display": " ")。
需要一次性配置多个字段时,可以传入一组字段:
- Unity
- Android
- iOS
Dictionary<string, string> info = new Dictionary<string, string>();
info.Add("score", "60");
info.Add("display", "#matching");
await TDSFollows.SetRichPresences(info);
Map<String,String> info = new HashMap<>();
info.put("score", "60");
info.put("display", "#matching");
TDSFollows.setRichPresence(info, new Callback<Void>() {
// 略
});
[TDSFollows setRichPresencesWithDictionary:@{
@"score" : @"60",
@"display" : @"#matching",
} callback:^(BOOL succeeded, NSError * _Nullable error) {
// 略
}];
控制台最多配置 20 个富信息字段,字段名(key)长度不超过 128 bytes,字段值(value)长度不超过 256 bytes。
如需清除当前玩家的某项富信息,可以调用以下接口:
- Unity
- Android
- iOS
TDSFollows.ClearRichPresence("score");
TDSFollows.clearRichPresence("score", new Callback<Void>() {
// 略
});
[TDSFollows clearRichPresenceWithKey:@"score"
callback:^(BOOL succeeded, NSError * _Nullable error) {
// 略
}];