用户关系托管
更新时间: 2021/07/19 14:40:30
SDK 提供了用户好友关系管理,以及对用户会话的消息设置。在网易云信中,不是好友也允许聊天。好友关系如果不托管给网易云信,开发者需要自己在应用服务器维护。
好友关系
好友信息
类NIM.Friend.NIMFriendProfile
定义了好友详细信息,具体说明如下:
属性 | 说明 |
---|---|
AccountId | 好友账号 |
InitiativeRelationship | 主动好友关系 |
PassiveRelationship | 被动好友关系 |
Source | 好友来源 |
Alias | 好友别名 |
ExtensionalData | 扩展数据 |
CreatedTimetag | 好友创建时间戳 |
UpdatedTimetag | 好友更新时间戳 |
获取好友列表
获取我的好友帐号集合,可以根据帐号来获取对应的用户资料,见用户资料托管。好友列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。在函数的回调函数中可以获取到 NIM.Friend.NIMFriendProfile
对象的列表。
- API原型
csharp/// <summary>
/// 获取缓存好友列表
/// </summary>
/// <param name="cb"></param>
public static void GetFriendsList(GetFriendsListResultDelegate cb)
- 示例
csharpNIM.Friend.FriendAPI.GetFriendsList(FriendsListResultDelegate);
void FriendsListResultDelegate(NIMFriends result)
{
if (result != null)
{
UnityEngine.Debug.Log(string.Format("GetFriendsList completed,total count:{0}", result.ProfileList == null ? 0 : result.ProfileList.Count());
}
}
添加好友
目前添加好友有两种验证类型:直接添加为好友和发起好友验证请求。添加好友时需要填入对方帐号,好友验证类型及附言(可选)。
- API原型
csharp/// <summary>
/// 添加、验证好友
/// </summary>
/// <param name="accid">对方账号</param>
/// <param name="verifyType">验证类型</param>
/// <param name="msg"></param>
/// <param name="cb">操作结果回调</param>
public static void ProcessFriendRequest(string accid, NIMVerifyType verifyType, string msg, FriendOperationDelegate cb)
- 示例
csharp//直接添加好友,不需要对方验证
NIM.Friend.FriendAPI.ProcessFriendRequest("FRIEND ID",NIMVerifyType.kNIMVerifyTypeAdd, "", OnAddFriend);
//添加好友,需要对方验证
NIM.Friend.FriendAPI.ProcessFriendRequest("FRIEND ID",NIMVerifyType.kNIMVerifyTypeAsk, "加好友,请求验证通过", OnAddFriend);
void OnAddFriend(int resCode, string jsonExtension, IntPtr userData)
{
NIM.ResponseCode code = (ResponseCode)resCode;
//处理操作结果,如果使用需要对方验证的方式添加好友,此处不能表明添加好友成功,需要等待对方验证
}
通过/拒绝对方好友请求
收到好友的验证请求的系统通知后,可以通过或者拒绝,API与添加好友相同,verifyType填kNIMVerifyTypeAgree(同意)或者kNIMVerifyTypeReject(拒绝)。
以下代码演示如何通过系统通知处理好友请求:
csharp//注册系统通知
NIM.SysMessage.SysMsgAPI.ReceiveSysMsgHandler += OnReceiveSysMessage;
private void OnReceiveSysMessage(object sender, NIMSysMsgEventArgs e)
{
var _sysMessage = e.Message;
string _processFriendReqResult;
//kNIMSysMsgTypeFriendAdd 表示为好友请求
if (_sysMessage.Content.MsgType == NIMSysMsgType.kNIMSysMsgTypeFriendAdd)
{
//Attachment 字段为json串 {"vt":NIMVerifyType},key 为 "vt",value 为 枚举类型 `NIMVerifyType`
string attach = _sysMessage.Content.Attachment;
string senderId = _sysMessage.Content.SenderId;
FriendRequestVerify type = FriendRequestVerify.Deserialize(attach);
if (type.VerifyType == NIMVerifyType.kNIMVerifyTypeAsk)
{
_processFriendReqResult = string.Format("{0} 加你为好友,需要通过验证", senderId);
}
if(type.VerifyType == NIMVerifyType.kNIMVerifyTypeAdd)
{
_processFriendReqResult = string.Format("{0} 加你为好友", senderId);
}
if (type.VerifyType == NIMVerifyType.kNIMVerifyTypeReject)
{
_processFriendReqResult = string.Format("{0} 拒绝了你的好友请求", senderId);
}
if (type.VerifyType == NIMVerifyType.kNIMVerifyTypeAgree)
{
_processFriendReqResult = string.Format("{0} 同意了你的好友请求", senderId);
}
}
}
删除好友
删除好友后,将自动解除双方的好友关系,双方的好友列表中均不存在对方。删除好友后,双方依然可以聊天。
- API原型
csharp/// <summary>
/// 删除好友
/// </summary>
/// <param name="accid">对方账号</param>
/// <param name="cb">操作结果回调</param>
public static void DeleteFriend(string accid, FriendOperationDelegate cb)
- 示例
csharpNIM.Friend.FriendAPI.DeleteFriend("FRIEND ID", OnDeleteFriendCompleted);
void OnDeleteFriendCompleted(int resCode, string jsonExtension, IntPtr userData)
{
if (resCode == 200)
{
//删除好友成功
}
else
{
UnityEngine.Debug.Log("Delete friend failed:{0}", (ResponseCode)resCode);
}
}
好友关系变更通知
通过注册 NIM.Friend.FriendAPI.FriendProfileChangedHandler
事件,在好友关系发生变化时会收到通知。好友关系变化包括以下类型:
kNIMFriendChangeTypeRequest
加好友/处理好友请求kNIMFriendChangeTypeDel
删除好友kNIMFriendChangeTypeUpdate
好友信息更新kNIMFriendChangeTypeSyncList
好友列表同步
根据用户账号获取好友关系
- API原型
csharp/// <summary>
/// 获取缓存好友信息
/// </summary>
/// <param name="accountId"></param>
/// <param name="cb"></param>
public static void GetFriendProfile(string accountId, GetFriendProfileResultDelegate cb)
- 示例
csharpNIM.Friend.FriendAPI.GetFriendProfile("FRIEND ID", OnGetFriendProfileCompleted);
void OnGetFriendProfileCompleted(string accountId, NIMFriendProfile profile)
{
if (profile == null)
{
UnityEngine.Debug.Log("GetFriendProfile {0} failed", accountId);
}
else
{
UnityEngine.Debug.Log("GetFriendProfile {0} sucess {1}", accountId, profile.Serialize());
}
}
判断用户是否为我的好友
- API原型
csharp/// <summary>
/// 在本地缓存数据中查询accid是否为自己的好友
/// </summary>
/// <param name="accid">好友id</param>
/// <returns>当正向和反向好友关系都为好友时返回true</returns>
public static bool IsActiveFriend(string accid)
- 示例
csharpvar ret = NIM.Friend.FriendAPI.IsActiveFriend("USER ID");
UnityEngine.Debug.Log(string.Format("{0} is a friend ?:{1}", "USER ID",ret));
更新好友关系
目前支持更新好友的备注名
- API原型
csharp/// <summary>
/// 更新好友资料
/// </summary>
/// <param name="profile"></param>
/// <param name="cb"></param>
public static void UpdateFriendInfo(NIMFriendProfile profile, FriendOperationDelegate cb)
- 示例
csharpvar profile = new NIMFriendProfile();
profile.Alias = "NEW ALIAS";
NIM.Friend.FriendAPI.UpdateFriendInfo(profile, OnUpdateFriendProfile);
黑名单
将用户加入黑名单后,将不在收到对方发来的任何消息或者请求。例如:A用户将B用户加入黑名单,B用户发送的消息,A用户将收不到。A用户发送的消息,B用户依然可以看到。
加入/移出黑名单
- API原型
csharp/// <summary>
/// 设置、取消设置黑名单.
/// </summary>
/// <param name="accountId"> 好友id.</param>
/// <param name="inBlacklist">if set to <c>true</c> [set_black].</param>
/// <param name="cb">操作结果回调.</param>
public static void SetBlacklist(string accountId, bool inBlacklist, UserOperationDelegate cb)
- 参数说明
参数 | 说明 |
---|---|
accountId | 被操作用户的ID |
inBlacklist | true:将用户加入黑名单,false:将用户移出黑名单 |
cb | 操作结果回调 |
- 示例
csharpNIM.User.UserAPI.SetBlacklist("USER ID", true, OnSetBlacklist);
private void OnSetBlacklist(ResponseCode response, string accid, bool opt, string jsonExtension, IntPtr userData)
{
UnityEngine.Debug.Log(string.Format("Add {0} to blacklist:{1}", accid, response));
}
监听黑名单变化
通过注册事件NIM.User.UserAPI.UserRelationshipChangedHandler
监听黑名单变化情况。
- 事件说明
csharppublic static EventHandler<UserRelationshipChangedArgs> UserRelationshipChangedHandler;
- 参数说明
事件参数UserRelationshipChangedArgs
包含以下信息:
属性 | 说明 |
---|---|
AccountId | 用户ID |
IsSetted | 设置或者取消设置 |
ChangedType | 类型为NIMUserRelationshipChangeType ,包含添加删除黑名单、设置取消消息提醒、信息同步三种类型 |
- 示例
csharpNIM.User.UserAPI.UserRelationshipChangedHandler += OnUserRelationshipChanged;
private void OnUserRelationshipChanged(object sender, UserRelationshipChangedArgs e)
{
if(e.ChangedType == NIMUserRelationshipChangeType.AddRemoveBlacklist)
{
if(e.IsSetted)
{
//账号被加入黑名单
}
else
{
//账号被移出黑名单
}
}
}
获取黑名单列表
- API原型
csharp/// <summary>
/// 获取用户关系列表(黑名单和静音列表)
/// </summary>
/// <param name="resultDelegate"></param>
public static void GetRelationshipList(GetUserRelationshipResuleDelegate resultDelegate)
- 示例
csharpNIM.User.UserAPI.GetRelationshipList(OnGetRelationshipCompleted);
private void OnGetRelationshipCompleted(ResponseCode code, UserSpecialRelationshipItem[] list)
{
//获取黑名单列表
var blacklist = from c in list where c.IsBlacklist select c;
//获取静音名单列表
var mutedlist = from c in list where c.IsMuted select c;
}
消息提醒
网易云信支持对用户设置或关闭消息提醒(静音),关闭后,收到该用户发来的消息时,不再进行通知栏消息提醒。个人用户的消息提醒设置支持漫游。消息提醒的操作与黑名单类似。
设置/关闭消息提醒
- API原型
csharp/// <summary>
/// 设置/关闭消息提醒
/// </summary>
/// <param name="accountId">好友id</param>
/// <param name="isMuted">取消或设置</param>
/// <param name="cb">操作结果回调</param>
public static void SetUserMuted(string accountId, bool isMuted, UserOperationDelegate cb)
- 参数说明
参数 | 说明 |
---|---|
accountId | 被操作用户的ID |
isMuted | true:设置消息提醒,false:关闭该用户的消息提醒 |
cb | 操作结果回调 |
- 示例
csharpNIM.User.UserAPI.SetUserMuted("USER ID", true, OnSetMuted);
private void OnSetMuted(ResponseCode response, string accid, bool opt, string jsonExtension, IntPtr userData)
{
UnityEngine.Debug.Log(string.Format("Mute {0} {1}", accid, response));
}
监听消息提醒变化
通过注册事件NIM.User.UserAPI.UserRelationshipChangedHandler
监听用户消息提醒变化情况。
- 事件说明
csharppublic static EventHandler<UserRelationshipChangedArgs> UserRelationshipChangedHandler;
- 参数说明
事件参数UserRelationshipChangedArgs
包含以下信息:
属性 | 说明 |
---|---|
AccountId | 用户ID |
IsSetted | 设置或者取消设置 |
ChangedType | 类型为NIMUserRelationshipChangeType ,包含添加删除黑名单、设置取消消息提醒、信息同步三种类型 |
- 示例
csharpNIM.User.UserAPI.UserRelationshipChangedHandler += OnUserRelationshipChanged;
private void OnUserRelationshipChanged(object sender, UserRelationshipChangedArgs e)
{
if(e.ChangedType == NIMUserRelationshipChangeType.AddRemoveMute)
{
if(e.IsSetted)
{
//设置用户消息提醒
}
else
{
//关闭用户消息提醒
}
}
}
获取静音账号列表
- API原型
csharp/// <summary>
/// 获取用户关系列表(黑名单和静音列表)
/// </summary>
/// <param name="resultDelegate"></param>
public static void GetRelationshipList(GetUserRelationshipResuleDelegate resultDelegate)
- 示例
csharpNIM.User.UserAPI.GetRelationshipList(OnGetRelationshipCompleted);
private void OnGetRelationshipCompleted(ResponseCode code, UserSpecialRelationshipItem[] list)
{
//获取黑名单列表
var blacklist = from c in list where c.IsBlacklist select c;
//获取静音名单列表
var mutedlist = from c in list where c.IsMuted select c;
}