Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Unity Metaverse(七)、基于环信IM SDK实现的好友系统、私聊、群聊

Unity Metaverse(七)、基于环信IM SDK实现的好友系统、私聊、群聊

作者头像
CoderZ
发布于 2023-08-21 11:28:32
发布于 2023-08-21 11:28:32
39900
代码可运行
举报
运行总次数:0
代码可运行

🎈 简介

在之前的文章中已经介绍了如何接入环信IM Unity SDK,及基于该SDK实现用户的登录注册功能,该篇文章介绍的是如何通过它来实现用户管理、好友系统(联系人管理)及聊天消息管理功能。

环信IM SDK

核心功能

🎈 用户管理

SDK为我们提供的用户属性管理包括用户昵称头像邮箱电话性别签名生日等,除此之外,我们可以使用扩展字段Ext来管理业务层所需的其它用户属性。例如在我们的Metaverse项目中,就将用户的Avatar人物信息存储在了Ext扩展字段中,在拿到Ext字段的值后通过反序列化即可得到用户的Avatar人数信息,反之,在用户的Avatar信息发生变更时,只需序列化再存储到Ext扩展字段中并更新用户属性即可。

用户属性管理相关的接口调用封装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 获取用户信息
/// </summary>
/// <param name="userId">UserID</param>
/// <param name="onSuccess">获取成功回调事件</param>
/// <param name="onError">获取失败回调事件</param>
public void GetUserInfo(string userId, Action<AgoraChat.UserInfo> onSuccess, Action<int, string> onError = null)
{
    SDKClient.Instance.UserInfoManager.FetchUserInfoByUserId(new List<string>(1) { userId },
        new ValueCallBack<Dictionary<string, AgoraChat.UserInfo>>(
        onSuccess: dic =>
        {
            AgoraChat.UserInfo userInfo = dic[userId];
            Main.Log.Info("【环信IM SDK】获取用户{0}信息:{1}", userId, userInfo);
            onSuccess.Invoke(userInfo);
        },
        onError: (code, desc) =>
        {
            Main.Log.Info("【环信IM SDK】获取用户{0}信息失败:Code -{1}  Desc -{2}", userId, code, desc);
            onError?.Invoke(code, desc);
        }));
}
/// <summary>
/// 更新自身用户信息
/// </summary>
/// <param name="userInfo">用户信息</param>
/// <param name="onSuccess">更新成功回调事件</param>
/// <param name="onError">更新失败回调事件</param>
public void UpdateOwnUserInfo(AgoraChat.UserInfo userInfo, Action onSuccess, Action<int, string> onError = null)
{
    SDKClient.Instance.UserInfoManager.UpdateOwnInfo(userInfo, new CallBack(
    onSuccess: () =>
    {
        LocalUserInfo.Update(userInfo);
        Main.Log.Info("【环信IM SDK】更新自身用户信息成功:{0}", LocalUserInfo);
        onSuccess?.Invoke();
    },
    onError: (code, desc) =>
    {
        Main.Log.Info("【环信IM SDK】更新自身用户信息失败:Code -{0}  Desc -{1}", code, desc);
        onError?.Invoke(code, desc);
    }));
}

🎈 好友管理

添加好友

好友功能是通过环信IM SDK提供的Contact Manager联系人管理来实现的,例如发起添加联系人请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 发送添加好友请求
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="reason">原因/验证信息</param>
/// <param name="onSuccess">请求成功回调事件</param>
/// <param name="onError">请求失败回调事件</param>
public void AddContact(string userId, string reason, Action onSuccess = null, Action<int, string> onError = null)
{
    SDKClient.Instance.ContactManager.AddContact(userId, reason, new CallBack(
        onSuccess: () =>
        {
            Main.Log.Info("【Contact Manager】添加好友请求成功:UserId -{0}  Reason -{1}", userId, reason);
            onSuccess?.Invoke();
        },
        onError: (code, desc) =>
        {
            Main.Log.Info("【Contact Manager】添加好友请求失败:UserId -{0}  Reason -{1}  Code -{2}  Desc -{3}", userId, reason, code, desc);
            onError?.Invoke(code, desc);
        }));
}

请求人发起请求后,被请求人如果监听了与联系人管理相关的回调,会执行On Contact Invited回调事件,在回到事件中我们可以通过弹窗形式来让用户决定是否同意添加联系人。如何监听与联系人管理相关的回调?继承IContactManagerDelegate接口并实现,通过Add Contact Manager DelegateRemove Contact Manager Delegate来开启监听和停止监听。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace Metaverse
{
    public class ContactManagerDelegate : IContactManagerDelegate
    {
        /// <summary>
        /// 好友新增事件
        /// 用户B向用户A发送好友请求,用户A同意该请求,用户A收到该事件。
        /// </summary>
        /// <param name="userId">B用户ID</param>
        public void OnContactAdded(string userId)
        {
            Main.Log.Info("【环信IM SDK】新增好友{0}", userId);
        }
        /// <summary>
        /// 被删除好友事件
        /// 用户B将用户A从联系人列表上删除,用户A收到该事件。
        /// </summary>
        /// <param name="userId">B用户ID</param>
        public void OnContactDeleted(string userId)
        {
            Main.Log.Info("【环信IM SDK】被用户{0}删除好友", userId);
        }
        /// <summary>
        /// 被请求添加好友事件
        /// 用户B向用户A发送好友请求,用户A收到该事件。
        /// </summary>
        /// <param name="userId">B用户ID</param>
        /// <param name="reason">原因/验证信息</param>
        public void OnContactInvited(string userId, string reason)
        {
            Main.Log.Info("【环信IM SDK】收到用户{0}添加好友的请求:{1}", userId, reason);

            /*************************************************************
             * 收到添加好友的请求,弹出弹窗,让用户点击同意或拒绝
             * 同意就调用Main.Custom.ContactManager.AcceptAddContact
             * 拒绝就调用Main.Custom.ContactManager.DeclineAddContact
             *************************************************************/

            Main.UI.ShowOrLoadView<PopupView>(ViewLevel.POP, new PopupData("添加好友请求", string.Format("用户{0}请求添加您为好友,是否同意?", userId))
            {
                confirm = "同意",
                cancle = "拒绝",
                onConfirm = () => Main.Custom.ContactManager.AcceptAddContact(userId),
                onCancle = () => Main.Custom.ContactManager.DeclineAddContact(userId),
            });
        }
        /// <summary>
        /// 请求添加好友被对方同意事件
        /// 用户A向用户B发送好友请求,用户B收到好友请求后,同意加好友,则用户A收到该事件。
        /// </summary>
        /// <param name="userId">B用户ID</param>
        public void OnFriendRequestAccepted(string userId)
        {
            Main.Log.Info("【环信IM SDK】添加用户{0}为好友的请求被对方同意", userId);
        }
        /// <summary>
        /// 请求添加好友被对方拒绝事件
        /// 用户A向用户B发送好友请求,用户B收到好友请求后,拒绝加好友,则用户A收到该事件。
        /// </summary>
        /// <param name="userId">B用户ID</param>
        public void OnFriendRequestDeclined(string userId)
        {
            Main.Log.Info("【环信IM SDK】添加用户{0}为好友的请求被对方拒绝", userId);
        }
    }
}
  • • 用户A向用户B发送好友请求,用户B同意则调用AcceptAddContact,拒绝则调用DeclineAddContact
  • • 用户A向用户B发送好友请求,用户B收到好友请求后,同意加好友,则用户A收到OnFriendRequestAccepted事件;
  • • 用户A向用户B发送好友请求,用户B收到好友请求后,拒绝加好友,则用户A收到OnFriendRequestDeclined事件。

🎈 聊天管理

房间 IM消息

私聊消息

聊天是通过环信IM SDK提供的Chat Manager实现的,会话(Conversation)分为三种,单聊群聊聊天室会话

  • • 单聊是指两个用户建立的会话,双方可以在会话中收发消息。私聊基于此实现。
  • • 群聊会话是由群成员发送消息所组成的,群成员可以在群会话中收发消息。我们的房间IM就是通过群里会话实现的。
  • • 聊天室会话并未应用于项目中。

发送与接收消息

SDK将消息划分为多种类型,包括文本消息语音消息图片消息视频消息文件消息透传消息等,以基本的文本消息为例,消息发送的接口封装如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 发送文本消息
/// </summary>
/// <param name="messageType">消息类型 Chat:单聊  Group:群聊  Room:聊天室消息</param>
/// <param name="userOrGroupId">用户或者群聊的ID</param>
/// <param name="content">文本内容</param>
/// <param name="onSuccess">发送成功回调事件</param>
/// <param name="onError">发送失败回调事件</param>
public void SendTextMessage(MessageType messageType, string userOrGroupId,
    string content, Action<Message> onSuccess = null, Action<int, string> onError = null)
{
    Message msg = Message.CreateTextSendMessage(userOrGroupId, content);
    msg.MessageType = messageType;
    SDKClient.Instance.ChatManager.SendMessage(ref msg, new CallBack(
        onSuccess: () =>
        {
            Main.Log.Info("【Chat Manager】发送文本消息成功:MessageType -{0}  UserOrGroupId -{1}  Content -{2}",
                messageType, userOrGroupId, content);
            onSuccess?.Invoke(msg);
        },
        onError: (code, desc) =>
        {
            Main.Log.Info("【Chat Manager】发送文本消息失败:MessageType -{0}  UserOrGroupId -{1}  Content -{2}  Code -{3}  Desc -{4}",
                messageType, userOrGroupId, content, code, desc);
            onError?.Invoke(code, desc);
        }));
}

当用户监听了与聊天管理相关的回调后,收到消息时会执行On Messages Received回调事件,在事件中处理我们的业务逻辑。如何监听与聊天管理相关的回调?继承IChatManagerDelegate接口并实现,通过Add Chat Manager DelegateRemove Chat Manager Delegate来开启监听和停止监听。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 新消息接收事件
/// </summary>
/// <param name="messages">新消息列表</param>
public void OnMessagesReceived(List<Message> messages)
{
    for (int i = 0; i < messages.Count; i++)
    {
        Message msg = messages[i];
        //抛出事件
        Main.Events.Publish(MessageReceivedEventArgs.Allocate(msg));
    }
}

消息处理

接收到消息后,通过开发框架中Event事件系统将其抛出,好友视图中会订阅该事件来接收来自好友的消息,房间视图中会订阅该事件来接收来自房间内其他用户发送的消息。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace Metaverse
{
    public class RoomPlaceView : UIView
    {
        #region >> NonPublic Variables
        [Tooltip("聊天输入框"), SerializeField] private InputField chatInputField;
        [Tooltip("聊天项预制件"), SerializeField] private Text chatItemPrefab;
        [Tooltip("聊天项列表"), SerializeField] private RectTransform chatContent;
        #endregion

        #region >> View
        protected override void OnInit(IViewData data)
        {
            base.OnInit(data);
            //订阅消息接收事件
            Main.Events.Subscribe(MessageReceivedEventArgs.EventID, OnMessageReceivedEvent);
        }
        protected override void OnUnload()
        {
            base.OnUnload();
            //取消订阅消息接收事件
            Main.Events.Unsubscribe(MessageReceivedEventArgs.EventID, OnMessageReceivedEvent);
        }
        #endregion

        #region >> UI Event
        /// <summary>
        /// 聊天发送按钮点击事件
        /// </summary>
        public void OnSendButtonClick()
        {
            //未输入任何内容 返回
            if (string.IsNullOrEmpty(chatInputField.text)) return;
            //将当前聊天框中输入的文字内容发送
            Main.Custom.ChatManager.SendTextMessage(MessageType.Group, (Main.FSM.GetMachine<GamePlace>().CurrentState as PlaceRoom).PlaceID,
                chatInputField.text, message =>
                {
                    //添加聊天项
                    AddChatItem(message);
                    //消息发送成功,将聊天框输入的内容清空
                    chatInputField.text = string.Empty;
                });
        }
        #endregion

        #region >> Subscribed Event
        //消息接收事件
        private void OnMessageReceivedEvent(EventArgs e)
        {
            if (e is MessageReceivedEventArgs mre)
            {
                //新增聊天项
                AddChatItem(mre.message, false);
            }
        }
        #endregion

        #region >> NonPublic Methods
        /**********************************************************************************
         * 添加聊天项:
         *  isFromSelf - 消息发送方是否是自己
         *  如果不是自己发送的消息 需要根据用户ID获取用户信息
         **********************************************************************************/
        private void AddChatItem(Message message, bool isFromSelf = true)
        {
            if (isFromSelf)
                Add(Main.Custom.UserManager.LocalUserInfo.NickName, (message.Body as TextBody).Text);
            else
                Main.Custom.UserManager.GetOrQuery(message.From, userInfo => Add(userInfo.NickName, (message.Body as TextBody).Text));

            void Add(string userName, string content)
            {
                /********************************************************************************
                 * 此处判断如果PlaceID不一致,不执行代码块中逻辑
                 * 因为此处逻辑的执行是在异步回调中 假如在异步期间已经退出之前的房间 
                 * 则此处会实例化会造成异常
                 ********************************************************************************/
                if ((Main.FSM.GetMachine<GamePlace>().CurrentState as PlaceRoom).PlaceID == message.To)
                {
                    //实例化
                    var instance = Instantiate(chatItemPrefab);
                    //设置父级
                    instance.transform.SetParent(chatContent.transform, false);
                    //消息内容
                    instance.text = string.Format("<color=cyan>{0}:</color>{1}", userName, content);
                    //预制件是隐藏的 实例化后显示
                    instance.gameObject.SetActive(true);
                    //一帧之后更新LayoutGroup自动布局
                    Main.Actions.Sequence(this)
                        .Frame(1)
                        .Event(() => LayoutRebuilder.ForceRebuildLayoutImmediate(chatContent))
                        .Begin();
                }
            }
        }
        #endregion
    }
}

关于会话ID: Conversation Id,即会话ID,在单聊中它其实就是对方用户的User Id(用户ID),在群聊中它其实就是群组的Group Id(群组ID)。

消息项的对象池管理

每一条消息处理时都需要实例化一个消息项,尤其是在与不同的好友聊天时,消息项会被大量使用,因此在项目中考虑使用对象池来管理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected override void OnInit(IViewData data)
{
    base.OnInit(data);

    //订阅消息接收事件
    Main.Events.Subscribe(MessageReceivedEventArgs.EventID, OnMessageReceivedEvent);

    /********************************************
     * 初始化对象池
     * 设置创建方法
     * 设置最大缓存数量
     ********************************************/
    Main.ObjectPool.Mono.CreateBy(() =>
    {
        //实例化
        var instance = Instantiate(chatItemPrefabLocal);
        //设置父级
        instance.transform.SetParent(chatItemPrefabLocal.transform.parent, false);
        //获取组件并返回
        return instance.GetComponent<ChatItemLocal>();
    });
    Main.ObjectPool.Mono.SetMaxCacheCount<ChatItemLocal>(99);

    Main.ObjectPool.Mono.CreateBy(() =>
    {
        //实例化
        var instance = Instantiate(chatItemPrefabRemote);
        //设置父级
        instance.transform.SetParent(chatItemPrefabRemote.transform.parent, false);
        //获取组件并返回
        return instance.GetComponent<ChatItemRemote>();
    });
    Main.ObjectPool.Mono.SetMaxCacheCount<ChatItemRemote>(99);
}
  • • 从对象池中获取实例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**********************************************************************************
 * 添加聊天项:
 *  userId - 发送者用户ID 传null表示发送方是自己
 *      如果发送者是自己 会新增一项ChatItemLocal
 *      如果发送者是对方 会新增一项ChatItemRemote
 **********************************************************************************/
private void AddChatItem(Message message, string userId = null)
{
    bool flag = !string.IsNullOrEmpty(userId);
    //从对象池中获取实例
    ChatItemBase instance;
    if (flag) instance = Main.ObjectPool.Mono.Allocate<ChatItemRemote>();
    else instance = Main.ObjectPool.Mono.Allocate<ChatItemLocal>();
    //预制件是隐藏的 实例化后调用显示接口
    instance.gameObject.SetActive(true);
    //设置数据
    instance.Set((message.Body as AgoraChat.MessageBody.TextBody).Text,
        DateTime2MessageTimeString(new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(
            message.ServerTime != 0 ? message.ServerTime : message.LocalTime).ToLocalTime()));
    //开始适配大小
    instance.GetComponentInChildren<ChatItemTextBgAdaptor>().Adapt();
    //缓存到字典
    chatItemDic.Add(message, instance);
}
  • • 回收实例到对象池中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string CurrentChatUserID
{
    get
    {
        return currentChatUserID;
    }
    set
    {
        /*****************************************************************************
         * 判断当前聊天对象是否发生变更
         *  发生变更后不仅更新值 还要执行聊天对象发生变更事件
         *  即回收当前实例化出的聊天项 并清空字典缓存
         *****************************************************************************/
        if (currentChatUserID != value)
        {
            currentChatUserID = value;
            foreach (var kv in chatItemDic)
            {
                switch (kv.Value.Type)
                {
                    case ChatItemType.LOCAL: Main.ObjectPool.Mono.Recycle(kv.Value as ChatItemLocal); break;
                    case ChatItemType.REMOTE: Main.ObjectPool.Mono.Recycle(kv.Value as ChatItemRemote); break;
                }
            }
            chatItemDic.Clear();
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 当代野生程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册
在调用环信IM SDK中的注册与登录接口前,需要先进行初始化,如下所示,其中appkey在控制台应用详情中获取:
CoderZ
2022/08/29
8760
Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册
SpringBoot集成开源IM框架MobileIMSDK,实现即时通讯IM聊天功能
MobileIMSDK  是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持UDP 、TCP 、WebSocket 三种协议,支持iOS、Android、H5、标准Java平台,服务端基于Netty编写。
JackJiang
2022/05/05
3.5K0
SpringBoot集成开源IM框架MobileIMSDK,实现即时通讯IM聊天功能
WebSocket+Netty 1:1仿微信的即时通讯工具
技术基础之前都有写过了,直通车看下面连接 后端:WebSocket+Netty+SpringBoot+SpringMVC+SpringData+Mysql 中间件以及第三方服务:RabbitMQ+Redis+阿里云短信+OSS对象存储系统+Nginx Netty简单介绍以及它的模型基础 websocket的定位以及其和其他连接的区别 Netty+Websocket的群发即使通讯demo 前端: html5+vue+一些UI,链接可以看我之前的前端专题. 专门学了一下vue基础...以后没事了再多学点,以后自己做小玩具方便.
名字是乱打的
2021/12/24
9710
WebSocket+Netty 1:1仿微信的即时通讯工具
环信SDK 头像、昵称、表情自定义和群聊设置的实现 一(附源码)
前言: 环信的SDK在公司的项目中有用到,现在用到的是群聊的部分,这里我们分析总结一下自己对环信给的DEMO大概的拆解一下,说说我们怎么样充分的利用这个demo来写我们所需要的业务。这个也由于篇幅
Mr.RisingSun
2018/01/09
1.4K0
环信SDK 头像、昵称、表情自定义和群聊设置的实现 一(附源码)
Java实现简易即时通讯系统
我们想要实现一个类似QQ的即时通讯程序。由于这是一个复杂的项目,我们将分步骤进行,并只实现核心功能。
程序员皮皮林
2025/06/24
1000
Unity Metaverse(三)、Protobuf & Socket 实现多人在线
•根据语法规则编写.proto文件;•通过编译工具protoc.exe将.proto文件编译成.cs文件;
CoderZ
2022/08/29
1.3K0
Unity Metaverse(三)、Protobuf & Socket 实现多人在线
模仿微信,开发一个分布式IM(即时通信)系统!
是不是感觉很多资料,点收藏起来爽、看视频时候嗨、读文章当时会,只要过了那个劲,就完了,根本不记得这里面都讲了啥。时间浪费了,东西还没学到手,这是为啥?
小傅哥
2021/08/19
1.7K0
模仿微信,开发一个分布式IM(即时通信)系统!
TRTC Android端开发接入学习之实现语音聊天室(九)
多人语音是音视频通话的常见应用场景之一,TRTC对着这方面的支持必不可少,本次我们学习如何使用TRTC快速开发语音聊天室功能。
腾讯云-hongyang
2020/09/18
2K0
产品上新 | 即时通信 IM SDK 5.4.666 版本发布了
腾讯云即时通信 IM SDK 5.4.666 增强版本于2021年6月3日正式发布了。从该版本开始,原来的精简版(smart)SDK 改名为增强版(plus) SDK,原来的标准版 SDK 改名为基础版 SDK。后续新功能只在增强版上开发,基础版只做例行维护,推荐您升级到增强版实现更多更强大的功能。  新版本更新特性: - 支持本地消息搜索、群&群成员搜索、好友搜索; - 支持清空会话中的消息并保留会话; - 相同平台下支持多个终端同时登录; - 发送消息时可以指定该消息是否更新会话的最后一条消息。
腾讯云音视频
2021/06/15
1K0
SpringBoot 整合WebSocket 简单实战案例[通俗易懂]
《Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 (一)》 https://blog.csdn.net/qq_35387940/article/details/119817167
全栈程序员站长
2022/09/15
2K0
SpringBoot 整合WebSocket 简单实战案例[通俗易懂]
使用SpringBoot + WebSocket实现单人聊天
在做之前,不管在界面布局,还是功能实现方面都下了一点功夫,最终还是一点点实现了,现在就记录一下。
全栈开发Dream
2021/06/08
2.4K0
使用SpringBoot + WebSocket实现单人聊天
破解某交(y)友(p)app的VIP&&半自动im机器人
这是时候我们就要祭出脱壳神奇Youpk Youpk的操作文档具体可以看Youpk的github,再次感谢Youpk。我们在吧修复好的dex放在jadx中分析。修复的很给力,也可以看出源代码基本没有混淆,这就更利于我们的分析了。
吾爱小白
2020/07/31
2.5K0
破解某交(y)友(p)app的VIP&&半自动im机器人
Java练手小程序——QQ聊天「建议收藏」
界面布局:一是流布局,二是卡片布局(现在应该都不用了) socket通信之对象流objectinput/outputStream 将线程里面的信息显示到界面上
全栈程序员站长
2022/10/04
2.7K0
Java练手小程序——QQ聊天「建议收藏」
Unity Metaverse(八)、RTC Engine 基于Agora声网SDK实现音视频通话
本文介绍如何在Unity中接入声网SDK,它可以应用的场景有许多,例如直播、电商、游戏、社交等,音视频通话是其实时互动的基础能力。
CoderZ
2023/08/23
9460
Unity Metaverse(八)、RTC Engine 基于Agora声网SDK实现音视频通话
iOS音视频接入- TRTC语音聊天室
我们在之前的文章中已经了解了TRTC的1v1和多人语音聊天,本篇文章来了解下TRTC的语音聊天室。
小明同学接音视频
2020/10/16
3.7K0
全平台开源即时通讯IM聊天框架MobileIMSDK的服务端开发指南,支持鸿蒙NEXT
在着手基于MobileIMSDK开发自已的即时通讯应用前,建议以Demo工程为脚手架,快速上手MobileIMSDK!
JackJiang
2025/05/17
3040
全平台开源即时通讯IM聊天框架MobileIMSDK的服务端开发指南,支持鸿蒙NEXT
TIMSDK 常见问题
构建消息元素后,实例化一个 TIMMessage 对象,然后调用 addElement() 方法构建到 TIMMessage 消息对象中,不推荐在同一个消息对象中使用多个元素
腾讯云-ahqzhang
2019/04/24
6.1K0
TIMSDK 常见问题
环信-(php)服务器端REST API
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112332.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
1.4K0
Android即时通讯设计——腾讯IM接入和WebSocket接入
之前项目的群聊是用数据库直接操作的,体验很差,消息很难即时反馈,所以最后考虑到了使用腾讯的IM完成群聊的接入,不过中途还是有点小坎坷的,接入完成之后发现体验版一个群聊只有20人,当时看到体验版支持100个用户也就忍了,现在一个群聊只能20用户,忍不了了,所以暂时找到了WebSocket作为临时的解决方案(等有钱了再换),同时支持50个用户在线聊天,也算还行,勉强够用,下面就介绍两种实现方案的接入,正文即将开始~~
wresource
2023/01/31
3.9K0
TRTC Android端开发接入学习之互动直播(七)
近年来,直播兴起,各家直播平台的火爆,支持演唱会的直播、主播、明星直播和带货直播等等等,TRTC提供了简便快捷完整的直播互动解决方案,这次我们来一起学习如何在android端使用TRTC完成互动直播的基本流程
腾讯云-hongyang
2020/09/11
2K0
推荐阅读
相关推荐
Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验