用户关系托管

SDK 提供了用户好友关系管理,以及对用户会话的消息设置。在网易云通信中,不是好友也允许聊天。好友关系如果不托管给网易云通信,开发者需要自己在应用服务器维护。

好友关系

好友信息

NIM.Friend.NIMFriendProfile定义了好友详细信息,具体说明如下:

属性 说明
AccountId 好友账号
InitiativeRelationship 主动好友关系
PassiveRelationship 被动好友关系
Source 好友来源
Alias 好友别名
ExtensionalData 扩展数据
CreatedTimetag 好友创建时间戳
UpdatedTimetag 好友更新时间戳

获取好友列表

获取我的好友帐号集合,可以根据帐号来获取对应的用户资料,见用户资料托管。好友列表有本地缓存,缓存会在手动/自动登录后与服务器自动进行同步更新。在函数的回调函数中可以获取到 NIM.Friend.NIMFriendProfile 对象的列表。

/// <summary>
/// 获取缓存好友列表
/// </summary>
/// <param name="cb"></param>
public static void GetFriendsList(GetFriendsListResultDelegate cb)
NIM.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());
    }
}

添加好友

目前添加好友有两种验证类型:直接添加为好友和发起好友验证请求。添加好友时需要填入对方帐号,好友验证类型及附言(可选)。

/// <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)
//直接添加好友,不需要对方验证
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(拒绝)。

以下代码演示如何通过系统通知处理好友请求:

//注册系统通知
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);
        }
    }
}

删除好友

删除好友后,将自动解除双方的好友关系,双方的好友列表中均不存在对方。删除好友后,双方依然可以聊天。

/// <summary>
/// 删除好友
/// </summary>
/// <param name="accid">对方账号</param>
/// <param name="cb">操作结果回调</param>
public static void DeleteFriend(string accid, FriendOperationDelegate cb)
NIM.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事件,在好友关系发生变化时会收到通知。好友关系变化包括以下类型:

根据用户账号获取好友关系

/// <summary>
/// 获取缓存好友信息
/// </summary>
/// <param name="accountId"></param>
/// <param name="cb"></param>
public static void GetFriendProfile(string accountId, GetFriendProfileResultDelegate cb)
NIM.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());
    }
}

判断用户是否为我的好友

/// <summary>
/// 在本地缓存数据中查询accid是否为自己的好友
/// </summary>
/// <param name="accid">好友id</param>
/// <returns>当正向和反向好友关系都为好友时返回true</returns>
public static bool IsActiveFriend(string accid)
var ret = NIM.Friend.FriendAPI.IsActiveFriend("USER ID");
UnityEngine.Debug.Log(string.Format("{0} is a friend ?:{1}", "USER ID",ret));

更新好友关系

目前支持更新好友的备注名

/// <summary>
/// 更新好友资料
/// </summary>
/// <param name="profile"></param>
/// <param name="cb"></param>
public static void UpdateFriendInfo(NIMFriendProfile profile, FriendOperationDelegate cb)
var profile = new NIMFriendProfile();
profile.Alias = "NEW ALIAS";
NIM.Friend.FriendAPI.UpdateFriendInfo(profile, OnUpdateFriendProfile);

黑名单

将用户加入黑名单后,将不在收到对方发来的任何消息或者请求。例如:A用户将B用户加入黑名单,B用户发送的消息,A用户将收不到。A用户发送的消息,B用户依然可以看到。

加入/移出黑名单

/// <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 操作结果回调
NIM.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监听黑名单变化情况。

public static EventHandler<UserRelationshipChangedArgs> UserRelationshipChangedHandler;

事件参数UserRelationshipChangedArgs包含以下信息:

属性 说明
AccountId 用户ID
IsSetted 设置或者取消设置
ChangedType 类型为NIMUserRelationshipChangeType,包含添加删除黑名单、设置取消消息提醒、信息同步三种类型
NIM.User.UserAPI.UserRelationshipChangedHandler += OnUserRelationshipChanged;

private void OnUserRelationshipChanged(object sender, UserRelationshipChangedArgs e)
{
    if(e.ChangedType == NIMUserRelationshipChangeType.AddRemoveBlacklist)
    {
        if(e.IsSetted)
        {
            //账号被加入黑名单
        }
        else
        {
            //账号被移出黑名单
        }
    }
}

获取黑名单列表

/// <summary>
/// 获取用户关系列表(黑名单和静音列表)
/// </summary>
/// <param name="resultDelegate"></param>
public static void GetRelationshipList(GetUserRelationshipResuleDelegate resultDelegate)
NIM.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;
}

消息提醒

网易云通信支持对用户设置或关闭消息提醒(静音),关闭后,收到该用户发来的消息时,不再进行通知栏消息提醒。个人用户的消息提醒设置支持漫游。消息提醒的操作与黑名单类似。

设置/关闭消息提醒

/// <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 操作结果回调
NIM.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监听用户消息提醒变化情况。

public static EventHandler<UserRelationshipChangedArgs> UserRelationshipChangedHandler;

事件参数UserRelationshipChangedArgs包含以下信息:

属性 说明
AccountId 用户ID
IsSetted 设置或者取消设置
ChangedType 类型为NIMUserRelationshipChangeType,包含添加删除黑名单、设置取消消息提醒、信息同步三种类型
NIM.User.UserAPI.UserRelationshipChangedHandler += OnUserRelationshipChanged;

private void OnUserRelationshipChanged(object sender, UserRelationshipChangedArgs e)
{
    if(e.ChangedType == NIMUserRelationshipChangeType.AddRemoveMute)
    {
        if(e.IsSetted)
        {
            //设置用户消息提醒
        }
        else
        {
            //关闭用户消息提醒
        }
    }
}

获取静音账号列表

/// <summary>
/// 获取用户关系列表(黑名单和静音列表)
/// </summary>
/// <param name="resultDelegate"></param>
public static void GetRelationshipList(GetUserRelationshipResuleDelegate resultDelegate)
NIM.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;
}