消息服务 SDK 接入指南
消息服务 SDK 接入指南
1. 初始化Push SDK并连接到 Push Server
参考 Push SDK 初始化指南,初始化 Push SDK并连接到 Push Server。
2.集成示例
查看当前公共频道信息
该方法可获取当前所有公共频道以及对应在线人数信息.
try
{
var publicChannelInfos = await PushSDK.Instance.MessageService.ListPublicChannelInfoAsync();
Debug.Log($"publicChannelInfos: {JsonConvert.SerializeObject(publicChannelInfos)}");
}
catch(PushSDKClientException ex)
{
Debug.LogErrorFormat("Failed to get publicChannelInfos. client ex: {0}", ex);
throw;
}
catch(PushSDKServerException ex)
{
Debug.LogErrorFormat("Failed to get publicChannelInfos. server ex: {0}", ex);
throw;
}订阅频道
对于公共频道,需预先在网页上或者通过API创建,无法订阅不存在的公共频道。
对于非公共频道,订阅不存在的频道时会先创建后订阅,订阅存在的则直接订阅。
频道名称规则: 只能包含英文字母、数字、点(.)、下划线(_)和连字符(-),且首尾必须是字母和数字,长度1-100个字符。
var publicChannels = new List<string>() { "public-001", "public-002" };
var guildChannels = new List<string>() { "guild-001", "guild-002" };
try
{
// 订阅一些公共频道
PushSDK.Instance.MessageService.SubscribeChannels(publicChannels, true);
// 订阅玩家加入的公会频道
PushSDK.Instance.MessageService.SubscribeChannels(guildChannels, false);
}
catch(PushSDKClientException ex)
{
Debug.LogErrorFormat("Failed to subscribe channels. client ex: {0}", ex);
throw;
}SDK初始化时,可在onConnected方法中接入ListPublicChannelInfoAsync和SubscribeChannels,示例如下:
private async void onConnected(ConnectResult connectResult)
{
if (connectResult.Success)
{
Debug.Log("player connected");
// 如果连接成功,订阅需要订阅的频道
// 获取当前公共频道信息
var publicChannelInfos = await PushSDK.Instance.ListPublicChannelInfoAsync();
foreach (var channelInfo in publicChannelInfos)
{
// 查看当前所有公共频道在线人数信息
Debug.Log($"public channel name: {channelInfo.Name}, online player count: {channelInfo.OnlinePlayerCount}");
}
// 这里直接默认订阅了所有公共频道,实际过程中你可以选择根据需要订阅哪些
var publicChannels = publicChannelInfos.Select(channelInfo => channelInfo.Name);
PushSDK.Instance.SubscribeChannels(publicChannels, true);
// 订阅一些其他需要订阅的频道信息
var channels = new List<string> { "team-001", "guild-002" };
PushSDK.Instance.SubscribeChannels(channels, false);
}
else
{
// 连接失败,可重新调用Connect再次尝试连接
Debug.Log("player connect failure");
}
}取消订阅频道
var channels = new List<string> { "public-001", "guild-001"};
try
{
PushSDK.Instance.MessageService.UnsubscribeChannels(channels);
}
catch(PushSDKClientException ex)
{
Debug.LogErrorFormat("Failed to Unsubscribe channels. client ex: {0}", ex);
throw;
}查看已订阅频道
注意:已订阅信息是非持久化信息,玩家每次上线需重新订阅所有需要订阅的频道。
var channels = PushSDK.Instance.MessageService.GetSubscribedChannels();
Debug.Log($"channels: {JsonConvert.SerializeObject(channels)}");发送频道消息
某个玩家对指定频道发送一个消息后,订阅该频道的所有在线玩家将实时收到该消息,且频道消息支持缓存,新上线的玩家订阅某个频道时,将能收到最近的5条频道信息。 (注意:频道消息缓存实效为1小时,若某个频道1小时内未收到任何新消息,该频道消息缓存将被清空,后面上线的玩家订阅该频道时无法收到该频道缓存信息)
try
{
var message = "hello, push"; //消息内容
var channelName = "world-0"; // 频道名称
var noCache = false; // 控制该消息是否需要缓存,如果缓存,此后订阅该频道的人可收到此缓存消息,如果不缓存,则收不到
PushSDK.Instance.MessageService.SendChannelMessage(channelName, System.Text.Encoding.UTF8.GetBytes(message), noCache);
}
catch(PushSDKClientException ex)
{
Debug.LogErrorFormat("Failed to send message. client ex: {0}", ex);
throw;
}发送玩家消息
发送玩家消息即仅对指定玩家发送私人消息,仅指定玩家能收到该消息,当前仅支持对在线玩家发送消息,仅当对方玩家在线时方可收到消息,当前不在线后续上线亦无法收到之前的消息 (开启离线玩家消息功能情况除外)。
try
{
var playerId = "<playerId>"; // 玩家唯一id, 即被发送玩家初始化PushSDK时传入的Id
var data = "hello player";
PushSDK.Instance.MessageService.SendPlayerMessage(playerId, System.Text.Encoding.UTF8.GetBytes(data));
}
catch(PushSDKClientException ex)
{
Debug.LogErrorFormat("Failed to send player message. client ex: {0}", ex);
throw;
}离线玩家消息
注意:此功能需联系我们开通。
push 支持缓存玩家离线时私聊消息,针对某一个玩家发送过来的离线消息,限制为300条。 当玩家上线时,离线期间的私聊消息将一次性推送给玩家。
更多
更多SDK使用示例可参考 Push Demo
4. 附录
消息服务核心类&接口
/// <summary>
/// 获取该玩家当前订阅的频道
/// </summary>
/// <returns> 当前订阅的频道</returns>
public List<Channel> GetSubscribedChannels();
/// <summary>
/// 获取当前所有公共频道和在线人数信息
/// </summary>
/// <exception cref="PushSDKClientException"> 发生该异常时通常是客户端传参错误,比如认证失败 </exception>
/// <exception cref="PushSDKServerException"> 发生该异常时通常是服务器内部错误,请稍后重试或联系我们 </exception>
/// <returns> 所有公共频道在线人数信息</returns>
public Task<List<PublicChannelInfo>> ListPublicChannelInfoAsync();
/// <summary>
/// 订阅频道
/// 若为公共类型频道,将验证是否存在,不存在则订阅失败
/// 若非公共类型频道,频道存在时订阅频道, 频道不存在时将创建并订阅频道
/// 对于无效的频道名称,该方法不会报错,会订阅正确的频道,忽略错误的频道
/// </summary>
/// <param name="channelNames"> 所有订阅的频道名称</param>
/// <param name="isPublic"> 这些频道是否为公共频道/param>
/// <exception cref="PushSDKClientException"> 发生该异常时通常是客户端传参错误,比如无效的ChannelType</exception>
public void SubscribeChannels(IEnumerable<string> channelNames, bool isPublic);
/// <summary>
/// 取消订阅频道
/// 对于无效或不存在的频道名称,该方法不会报错,会取消订阅正确的频道,忽略错误的频道
/// </summary>
/// <param name="channelNames"> 所有取消订阅的频道名称/param>
public void UnsubscribeChannels(IEnumerable<string> channelNames);
/// <summary>
/// 向指定的频道发送消息
/// </summary>
/// <param name="channelName"> 频道名称</param>
/// <param name="data"> 消息内容</param>
/// <param name="noCache"> 是否不缓存该消息,默认为false</param>
/// <exception cref="PushSDKClientException"> 发生该异常时通常是客户端传参错误,比如不存在的频道</exception>
public void SendChannelMessage(string channelName, byte[] data, bool noCache = false);
/// <summary>
/// 向指定的玩家发送消息
/// </summary>
/// <param name="playerId"> 被发送的玩家 id(即被发送玩家初始化PushSDK时传入的Id)</param>
/// <param name="data"> 消息内容</param>
public void SendPlayerMessage(string playerId, byte[] data);