http://www.ox-holdings.com

增加了用户 id,更新内容新增1. 聊天室针对固定成员

摘要即时通讯云网易云信SDK新版发布,本次发布的版本号为:3.2.0,新增加了多人实时白板等主要特性。发布的版本本次发布的版本号为 3.2.0版,更新时间为:2016年11月30日。iOS 更新内容新增在NIMSDKConfig.h中增加是否需要多端同步未读数的开关shouldSyncUnreadCount新增多人实时会话(多人白板)服务,支持单播和广播发送实时会话数据网络通话新增语音前处理开关设置,可以选择性关闭语音降噪和人声检测等功能网络通话的网络状况增加用户 id 参数,以区分不同用户的网络状况互动直播新增视频画面混屏模式设置,可以选择预设的几种混屏模式变更消息撤回回调变更3.2.0 之前:onMessageRevoked:3.2.0 之后:onRecvRevokeMessageNotification:NIMMediaManager的回调接口和其他管理器一致为addDelegate:以及removeDelegate:网络通话的网络状况回调接口从onCall:netStatus:变更为onNetStatus:user:,增加了用户 id 参数网络通话的网络状况查询接口 从netStatus变更为netStatus:,增加了用户 id 参数实时会话数据服务器录制文件格式变化:3.2.0 之前:用户发送的数据包直接被写入文件3.2.0 之后:用户发送每一个数据包前增加包头(包长字段和时间戳字段)后再写入录制文件,格式详情请参考使用指南的服务器录制文件格式章节UI 组件提供更全面,更简洁的配置,并支持 CocoaPodsAndroid 更新内容新增1. 添加第三方推送服务:NIMPushClient,MixPushService,目前已接入小米推送。2. 添加会话未读数多端同步功能,开关为 SDKOptions#sessionReadAck,默认关闭。3. 添加第三方推送免打扰设置:MixPushService#setPushNoDisturbConfig。4. 添加本地消息拉取扩展接口:MsgService#queryMessageListExTime,支持时间和条数共同限定结果集。5. 添加64位支持。6. 添加音视频互动直播连麦画中画混屏模式设置:AVChatOptionalConfig#livePIPMode。7. 添加多人白板:- 创建一个多人白板房间, RTSManager2#createSession- 加入一个多人白板房间, RTSManager2#joinSession- 离开一个多人白板房间, RTSManager2#leaveSession变更1. 最低支持版本变更为Android 4.0 (Ice Cream Sandwich), 其中音视频通话最低支持版本为Android 4.1 (Jelly Bean)。2. 登录优化。3. 消息撤回优化,针对离线时对方发送消息并撤回的场景,下次登录时会收到 MsgServiceObserve#observeRevokeMessage 通知,可以获得被撤回消息的时间,便于在 UI 上展现离线期间消息撤回的提示。4. 白板状态回调 RTSChannelStateObserver 变更:- 所有回调添加 localSessionId 参数- 添加 onUserJoin 回调- 添加 onUserLeave 回调- 移除 onRecordInfo 回调- 变更 onConnectResult 回调,添加录制文件相应信息5. 白板服务器录制数据格式修改。Windows(PC) SDK 更新内容修复优化音频处理流程优化高清摄像头数据解析,提高高清摄像头采集帧率变更逻辑:关闭麦克风将不认为是静音状态,与伴音功能兼容服务器白板录制,针对3.2之后的版本,在每条数据前追加4字节长度信息和4字节的时间戳,详情看开发手册优化IM和聊天室登录流程新增新增多人白板功能,通过nim_rts_create_conf创建多人白板,再由nim_rts_join_conf接口加入多人白板。多人白板不支持视频通道,如果需要上层APP可以另外开启多人音视频通话。白板的创建及加入等接口将返回白板通道的channelid,用于和服务器的白板会话抄送对应。新增设备类型 kNIMDeviceTypeAudioHook,用户可采集播放器音频,需要使用sdk新增的nim_audio_hook.dll设备监听中可以监听伴音设备,kNIMDeviceTypeAudioHook开始工作和被顶替(顶替是指伴音只允许有一个,如果有别的进程也使用了sdk中的伴音功能,则会被顶替,这时之前的伴音失效),将会通过回调上报。会话消息已读未读状态多端同步会话属性增加设置置顶和扩展数据字段接口, nim_session.hIM和聊天室增加获取当前登陆状态的接口, nim_client.h nim_chatroom.h下载地址请从以下官网地址下载:

点击查看原文

摘要即时通讯云网易云集SDK新版发布,本次发布的版本号为:2.6.0。发布的版本本次发布的版本号为 2.6.0版,更新时间为:2016年7月25日。iOS 2.6.0 更新内容新增网络通话:提高视频清晰度,新增支持 720P 和 480P 两个等级;默认清晰度提高到高清网络通话:新增 iOS 8.0 以上系统视频硬件编解码支持,并可以在视频过程中实时切换软硬件编解码网络通话:新增视频发送码率设置支持,并可以在视频过程中实时改变码率网络通话:新增初始摄像头位置参数,现在可以以后置摄像头开始视频聊天了网络通话/实时会话:新增通话结束时自动结束 AudioSession 开关网络通话:新增获取网络通话网络层 log 文件路径接口变更NIMNetCallMeeting中与网络通话能力相关的参数(清晰度、裁剪、录制、旋转等)全部合并移到option中Android 2.5.0 更新内容新增1. 网络通话新增语音处理模式设置: AVChatAudioEffectMode:PLATFORM_BUILTIN: 系统内置语音处理优先SDK_BUILTIN: SDK内置语音处理优先DISABLE: 禁用语音处理2. 网络通话新增通话过程中参数设置 AVChatParameters:KEY_VIDEO_ENCODER_MODE: 动态设置视频编码模式(硬件编码/软件编码)KEY_VIDEO_DECODER_MODE: 动态设置视频解码模式(硬件解码/软件解码)KEY_VIDEO_SUPPORTED_HW_ENCODER: 动态获取是否支持硬件编码KEY_VIDEO_SUPPORTED_HW_DECODER: 动态获取是否支持硬件解码KEY_VIDEO_CROP_BEFORE_SEND: 动态设置是否发送前裁剪画面KEY_VIDEO_ROTATE_BEFORE_RENDING:动态设置是否允许视频绘制前自动旋转角度KEY_VIDEO_FPS_REPORTED: 动态设置是否允许汇报视频帧率KEY_VIDEO_MAX_BITRATE: 动态设置视频的最大码率3. 网络通话接口AVChatManager新增:运行时动态设置参数: setParameters(AVChatParameters params)运行时动态获取参数: getParameters(AVChatParameters params)变更1. 网络通话以及白板功能不再支持Android 4.0以下系统。2. 网络通话接口变更 AVChatStateObserver:网络发生变化: onConnectionTypeChanged(int current, int old) -> onConnectionTypeChanged(int netType) 。3. 网络通话视频清晰度定义变更 AVChatVideoQuality:清晰度定义重命名: DEFAULT -> QUALITY_DEFAULT, LOW -> QUALITY_LOW, MEDIUM -> QUALITY_MEDIUM, HIGH -> QUALITY_HIGH 。新增清晰度定义: QUALITY_480P, QUALITY_720P 。4. 网络通话可选设置参数变更 AVChatOptionalConfig:可选参数类名变更: AVChatOptionalParam -> AVChatOptionalConfig删除 captureView 参数, 不再需要配置。删除 screenLocker 参数, 不再需要配置。新增 videoFpsReported 参数, 是否实时汇报视频帧率。新增 videoMaxBitrate 参数, 视频最大码率配置。新增 audioEffectNSMode 参数, 语音降噪处理设置。新增 audioEffectAECMode 参数, 语音回音处理设置。新增 audioEffectAGCMode 参数, 语音自动增益设置。新增 defaultDeviceRotation 参数, 设备默认角度设置。新增 deviceRotationFixedOffset 参数, 设备传感器角度偏移量设置。新增 videoEncoderMode 参数, 视频编码模式设置。新增 videoDecoderMode 参数, 视频解码模式设置。5. 网络通话接口AVChatManager变更:创建多人会话房间接口变更: createChannelByName -> createRoom加入多人会话房间接口变更: joinChannelByName -> joinRoom离开多人会话房间接口变更: leaveChannel -> leaveRoomWindows(PC) SDK 2.5.0 更新内容修复麦克风采集支持2通道的设备(部分设备驱动导致只支持2通道,使得采集的声音变调)修复创建高级群无法设置自定义字段的内容修复调用NOS上传接口时一次发送多个文件上传失败的问题新增支持音视频通话中视频动态码率支持调整摄像头采集设置分辨率支持音视频通话高清720P的模式支持辅助摄像头下载地址请从以下官网地址下载:

摘要这是一篇网易云信官方介绍文章,文中详细罗列了即时通讯云服务——网易云信的特性、服务、价格等方面的内容。一 基本信息姓甚名谁姓名:网易云信生日:2015年10月13日星座:天秤座 素颜照1张家庭关系我爹:网易(杭州)网络有限公司我妈:网易云信团队自我介绍云信是网易公司倾力打造的即时通讯云服务,开发者通过客户端SDK和云端开放API,即可在最短时间内获得稳定可靠的IM功能。服务模式云信是PaaS服务模式,全面支持Android、iOS、Web、PC多平台。联系方式电话:4009-000-123QQ : 4009000123邮箱:service-ntes.im@188.com二 我的优势拼爹又拼妈...主要看气质~2.1 团队IM研发资历成熟★15年专注IM研发★IM解决方案经亿级产品(网易邮箱、网易新闻客户端、网易云音乐等)线上验证★移动端解决方案持续优化5年以上2.2 凝聚网易技术实力★成熟专业运维、云服务团队★全套自研方案★行业顶尖前端技术提供UI组件2.3 网易存储服务★网易自有亿级产品内部使用多媒体文件存储系统★数据文件系统多重备份,历史消息不丢失★分布式数据库,应用级数据隔离三 我的能力我有十八般武艺,看下图:往下看,详细了解一下我的武艺~3.1 IM基础功能IM基础功能即文字、表情、图片、文件、语音、视频、地理位置及通知消息等信息的收发功能,通过接入云信的IM基础功能,开发者已经能完整打造私信、群聊等聊天功能。▌聊天方式★单聊:一对一聊天,支持文字、表情、图片、语音、视频、地理位置、通知消息。★群聊:提供普通群 (Normal) 以及高级群 (Advanced) 两种形式的群聊功能,高级群拥有更多的权限操作。 普通群群权限操作:创建群、邀请入群、申请入群、踢人、修改群资料、设置管理员、更改群昵称、移交群主、解散群等。 高级群群权限操作:群容量和群数量根据所选服务版本进行扩展。★聊天室:提供无人数上限的聊天室功能,支持聊天室创建、解散、资料编辑、历史消息(最近10条)、抄送等功能。 聊天室管理权限:踢人、禁言、拉黑、设置管理员、取消管理员。▌聊天功能★已读回执:消息被对方查看后,可获得消息的已读状态。★自定义消息:即消息类型支持自定义,可实现红包、石头剪刀布、阅后即焚等丰富功能。★当前状态:单聊时可获取对方当前正在输入的状态。★消息提醒:新消息提醒功能,支持设置铃声/振动提醒、免打扰时段等,支持对用户设置或关闭消息提醒。★黑名单:可以将用户加入黑名单,拉黑后将不再收到对方发来的任何消息或者请求。▌信息功能★信息记录历史信息:云端存储用户最近的历史消息,提供关键字搜索聊天记录的功能。消息存储时长可根据所选服务版本(试用版、标准版和专属私有云)进行扩展。消息漫游:用户切换到任何设备都可以读取到历史消息,适用于标准版。离线消息:用户离线后重新上线,可收到离线期间到达的消息,适用于任何服务版本。最近会话:提供最近与用户会话的联系人信息,实现最近联系人列表。★信息托管消息抄送:将消息数据实时同步给第三方开发者的服务器。支持单聊数据、群聊数据、讨论组数据、个人自定义系统通知、群组自定义系统通知数据的抄送。好友关系托管:使用云信用户关系以及用户资料托管,提供用户好友关系托管,构建用户通讯录。用户资料托管:提供用户资料托管功能,第三方 APP 可以选择由云信托管用户资料,也可以自行实现。▌优势★稳定可靠: 累计成功发送消息量超过1000亿条,系统架构保证弹性可扩展,并支持接入产品动态扩容。★数据安全: 私有精简二进制协议,数据的传输和存储安全可靠。★海外访问: 提供海外AWS云主机连通服务,保证海外用户消息收发速度。3.2 实时音视频提供基于网络的点对点视频通话和语音通话功能。▌音视频功能★支持通话中音视频设备控制。★支持通话中实时音频和实时视频模式切换。★支持iOS、Android、Windwos(PC)三端。★支持视频清晰度调节。★支持服务器和客户端录制。▌优势★稳定流畅,网络动态优化 独家弱网连接技术,抗800ms的网络抖动; 传输通道选路智能化,流控策略控制云端化; 智能网络状况探测,动态调整传输策略。★流量耗用低 非wifi下自动切换为低流量策略; 智能语音活跃检测,减少静默期间的数据流量; 智能选择最佳音视频编码和码率,省电省流量。★极致高清,独家智能降噪 高品质编解码算法,智能回声消除、自动增益控制、自动舒适噪声、智能降噪等语音处理算法; 智能视频画面增强算法,画面优化、降低马赛克,以提升清晰度。3.3 教学白板教学白板通过音视频通道和TCP通道(可同时发起)实现轨迹同步、在线视频的实时教学功能。▌教学白板功能★多终端白板操作。★自定义传输内容。★画面可录制。▌优势★使用TCP协议,支持网络切换时自动重连,稳定可靠。★端到端延时小于200ms,稳定流畅,让彼此更贴近。★丰富的场景拓展性:可运用于在线教学白板、会议白板、你画我猜小游戏等。3.4 短信提供专业短信送达服务,包括APP验证类、通知类短信服务等,覆盖三网,高到达率。▌优势★5秒可达:移动、联通、电信三网普通、170号段全覆盖。★高到达率:7*24小时短信服务质量监控,确保到达。★发送状态可知:后台监控短信发送状态,查询短信到达状态。★价格优惠:0.05元/条。3.5 专线电话一键呼叫全国任意手机、座机,被叫方无需安装APP,无需网络。▌应用场景多人会议电话、亲情连线、客服电话、医疗专线。▌优势★独家降噪技术:只能降噪,语音清晰、流畅。★线路资源全面:覆盖全国各大运营商线路资源,实现3秒钟快速接通来电。★平台完善:可追踪拨入电话,包括咨询的电话号码、时间和通话时长等,方便业务人员长期跟踪客户。★价格优惠:双向外呼,价格低至0.12元/分钟起。3.6 视频直播基于专业的跨平台视频编解码技术和大规模视频内容分发网络,提供稳定流畅、低延时、高并发的在线直播平台。▌实时视频采集★摄像头采集/滤镜/人脸美化★声卡、麦克风采集★混音伴音▌实时视频播放★多平台支持★软硬解码▌视频流传输★防盗链★码流自适应★网络分发CDN▌管理后台★频道管理★数据统计▌优势★多平台支持:PC、iOS、Android全平台覆盖。★超低时延:时延控制在1~3秒之间。★极致加速:高质量的BGP网络+覆盖全球的600多个CDN加速节点,给您极速体验,满足高并发观看需求。3.7 私有云在云信服务集群中独享指定空间。★提供IM全部功能,独享私有资源通道。★提供技术解决方案咨询。★提供高级技术支持全程服务3.8 专属服务器采用物理隔离的方式对服务器进行私有部署。★提供企业专属服务。★独享资源通道。★提供高级功能定制。★提供技术解决方案。★技术框架咨询。★全程高级技术支持和VIP客户经理服务。

摘要即时通讯云网易云信于2017年6月06日发布3.8.0版,本次更新为主要版本的次要更新,详情见文章内容。发布的版本本次发布的版本号为 3.8.0版,更新时间为:2017年06月07日。iOS 更新内容新增聊天室针对固定成员,支持 nick, avatar 和 extension 字段的服务器存储。SDK 点对点音视频接口支持PushKit, 新增相关接口:新的 SDK 基本配置注入接口,支持填写云信 PushKit 推送证书名复制- (void)registerWithOption:(NIMSDKOption *)option;更新云信 PushKit Token复制- (void)updatePushKitToken:(NSData *)token;Android 更新内容新增1. 聊天室针对固定成员,支持 nick, avatar 和 extension 字段的持久化。变更1. 针对 oppo 手机 IPC 异常问题添加容错处理。2. 修复全文检索偶现的 InternalError 问题。3. 针对解包出错的极端情况添加容错处理。Windows(PC) SDK 更新内容新增聊天室更新固定成员信息时,支持nick,avator和ext字段的持久化语音采集模块路径相关参数类型改为宽字符, nim_audio.hWeb SDK 更新内容新增新增通用同步图片预览接口,支持私有化定制方案连接初始化支持选择连接协议变更修复忽略群通知消息配置以后,对群状态更改相关bug修复不开启数据库情况下,会话未读数不准的问题下载地址请从以下官网地址下载:

Web SDK 开发手册

SDK 概述

网易云信 SDK 为 Web 应用提供一个完善的 IM 系统开发框架, 屏蔽掉 IM 系统的复杂的细节, 对外提供较为简洁的 API 接口, 方便第三方应用快速集成 IM 功能。
网易云信还开发了可供开发者们参考,如何使用该SDK的Web Demo:

  • Web源码导读
  • Web(移动端H5)源码导读(不包含音视频)

开发准备

下载并引入 SDK 文件

  • 从云信官网下载 Web SDK 并解压
  • 目录结构介绍
  • 如果要在浏览器里面使用 SDK, 相应的 JS 文件都在 js 目录下.
  • 如果要在微信小程序里面使用 SDK, 相应的 JS 文件在 weixin-app 目录下.
  • 选择并引入
  • 如果要使用 IM 功能, 请引入 NIM_Web_NIM_v.js
  • 如果通过 script 标签引入, 请通过 NIM 来获取引用
  • 如果要使用聊天室功能, 请引入 NIM_Web_Chatroom_v.js
  • 如果通过 script 标签引入, 请通过 Chatroom 来获取引用
  • 如果同时使用 IM 和聊天室功能, 请引入 NIM_Web_SDK_v.js
  • <p style='color: #d9534f;'>如果通过 script 标签引入, 请通过 SDK.NIMSDK.Chatroom 来获取 NIMChatroom 的引用, 下文中的 API 都是通过 NIMChatroom 来调用的</p>
  • 如果要使用 IM 的插件版实时音视频功能, 请引入 NIM_Web_Netcall_v.js, 通过 Netcall 来获取引用, 调用 NIM.use(Netcall) 来加载实时音视频插件
  • 如果要使用 IM 的WebRTC实时音视频功能, 请引入 NIM_Web_WebRTC_v.js, 通过 WebRTC 来获取引用, 调用 NIM.use(WebRTC) 来加载实时音视频插件

打包

如果开发者选用 webpack/babel 来打包, 那么请使用 exclude 将 SDK 文件排除, 避免 babel 二次打包引起的错误

浏览器兼容性

云信 Web SDK (不包含实时音视频)兼容到 IE8

  • IE8/IE9 需要将项目部署在 HTTPS 环境下才能连接到云信服务器, 其它高级浏览器可以在 HTTP 或者 HTTPS 环境下连接到云信服务器

数据库兼容性

在支持数据库的浏览器上 SDK 会将数据缓存到数据库中, 后续同步都是增量更新, 加快初始化速度

是否支持数据库

// 通过此 `boolean` 值来查看 SDK 在某个浏览器上是否支持数据库
NIM.support.db

不使用数据库

如果开发者不想使用数据库, 那么可以设置初始化参数dbfalse来禁用数据库

var nim = NIM.getInstance({
db: false
});

微信小程序

使用前请找技术支持开通功能

require

请查阅开发准备来下载并引入 SDK 文件

  • 一个微信小程序同时只能有一个 WebSocket 连接, 所以没有办法同时使用 NIM 和 Chatroom
  • 示例代码如下
// 只使用 NIM
var NIM = require('NIM_Web_NIM_v')
// 只使用 Chatroom
var Chatroom = require('NIM_Web_Chatroom_v')

接口调用

微信小程序的大部分接口跟浏览器环境完全一致, 如有不同会额外说明, 请查阅其它章节

真机准备

在微信公众品台 > 设置 > 开发设置 > 服务器配置, 配置域名白名单. 注意一个月内可申请3次修改, 请慎重修改.

设置 IM 需要的域名

  • request合法域名
  • lbs.netease.im
  • wlnimsc0.netease.im
  • socket合法域名
  • wlnimsc0.netease.im
  • uploadFile合法域名
  • nos.netease.com
  • downloadFile合法域名
  • nos.netease.com

设置聊天室需要的域名

  • request合法域名
  • wlnim43.netease.im
  • socket合法域名
  • wlnim43.netease.im
  • uploadFile合法域名
  • nos.netease.com
  • downloadFile合法域名
  • nos.netease.com

依赖说明

  • SDK 使用一系列开源库来更好的完成工作, 所有库均挂在 NIM 下面
  • SDK 使用 es5-shim 来让低版本浏览器兼容 ES5 的部分方法
  • SDK 使用 platform.js 来检测浏览器平台, 通过 NIM.platform 来获取此库的引用
  • SDK 使用 socket.io-client 0.9 来建立 Socket 连接, 通过 NIM.iowindow.io 来获取此库的引用

初始化 SDK

请查阅开发准备来下载并引入 SDK 文件

示例代码

  • 此接口为单例模式, 对于同一个账号, 永远返回同一份实例, 即只有第一次调用会初始化一个实例
  • 后续调用此接口会直接返回初始化过的实例, 同时也会调用接口更新配置更新传入的配置
  • 后续调用此接口时, 如果连接已断开, 会自动建立连接
  • 当发生掉线时,SDK会自动进行重连
  • 开发者在收到onconnect回调之后代表链接已经建立, 此时 SDK 会开始同步数据, 随后在收到onsyncdone回调之后表示 SDK 完成了数据同步工作, 此时开发者可以进行渲染UI等操作了。
  • 这里的data代表数据, 在后面章节的示例代码中会多次用到这个对象
  • 这里的nim代表 SDK, 在后面章节的示例代码中会多次用到这个对象.
  • 这里的参数并不是所有的初始化参数, 请查阅其它章节的初始化参数
  • 初始化SDK
  • 多端登录初始化参数
  • 用户关系初始化参数
  • 好友关系初始化参数
  • 用户名片初始化参数
  • 群组初始化参数
  • 会话初始化参数
  • 消息初始化参数
  • 系统通知初始化参数
  • 同步完成
  • 完整的初始化代码
var data = {};
// 注意这里, 引入的 SDK 文件不一样的话, 你可能需要使用 SDK.NIM.getInstance 来调用接口
var nim = NIM.getInstance({
// debug: true,
appKey: 'appKey',
account: 'account',
token: 'token',
onconnect: onConnect,
onwillreconnect: onWillReconnect,
ondisconnect: onDisconnect,
onerror: onError
});
function onConnect() {
console.log('连接成功');
}
function onWillReconnect(obj) {
// 此时说明 SDK 已经断开连接, 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
console.log('即将重连');
console.log(obj.retryCount);
console.log(obj.duration);
}
function onDisconnect(error) {
// 此时说明 SDK 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
console.log('丢失连接');
console.log(error);
if (error) {
switch (error.code) {
// 账号或者密码错误, 请跳转到登录页面并提示错误
case 302:
break;
// 重复登录, 已经在其它端登录了, 请跳转到登录页面并提示错误
case 417:
break;
// 被踢, 请提示错误后跳转到登录页面
case 'kicked':
break;
default:
break;
}
}
}
function onError(error) {
console.log(error);
}

参数解释

  • debug: 是否开启日志, 开发者可以开启日志, 这样 SDK 会将关键操作的信息打印到控制台上, 便于调试
  • appKey: 在云信管理后台查看应用的 appKey
  • account: 帐号, 应用内唯一
  • token: 帐号的 token, 用于建立连接
  • transports: 用于建立长连接的协议数组,可不填,默认为['websocket', 'xhr-polling']
  • 默认状态 sdk优先使用websocket连接,如果浏览器不支持websocket,则使用xhr-polling
  • 开发者可手动设置连接及顺序,可支持选项包括websocket、xhr-polling、flashsocket
  • 示例如: transports: ['websocket'、'xhr-polling'、'flashsocket']
  • onconnect: 连接建立后的回调, 会传入一个对象, 包含登录的信息, 有以下字段
  • lastLoginDeviceId: 上次登录的设备的设备号
  • connectionId: 本次登录的连接号
  • ip: 客户端IP
  • port: 客户端端口
  • country: 本次登录的国家
  • onwillreconnect: 即将重连的回调
  • 此时说明 SDK 已经断开连接, 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
  • 此回调会收到一个对象, 包含额外的信息, 有以下字段
  • duration: 距离下次重连的时间
  • retryCount: 重连尝试的次数
  • ondisconnect: 断开连接后的回调
  • 此时说明 SDK 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
  • 此回调会收到一个对象, 包含错误的信息, 有以下字段
  • code: 出错时的错误码, 可能为空
  • 302: 账号或者密码错误, 请跳转到登录页面并提示错误
  • 417: 重复登录, 已经在其它端登录了, 请跳转到登录页面并提示错误
  • 'kicked': 被踢
  • onerror: 发生错误的回调, 会传入错误对象

同步完成

SDK 在同步完成之后会通知开发者, 开发者可以在此回调之后再初始化自己的界面, 以及进行其他操作, 同步的数据包括下面章节中的

  • 黑名单, 对应回调 onblacklist, 请参考用户关系托管里面的初始化参数
  • 静音列表, 对应回调 onmutelist, 请参考用户关系托管里面的初始化参数
  • 好友, 对应回调 onfriends, 请参考好友关系托管里面的初始化参数
  • 我的名片, 对应回调 onmyinfo, 请参考用户名片托管里面的初始化参数
  • 好友的名片, 对应回调 onusers, 请参考用户名片托管里面的初始化参数
  • 群, 对应回调 onteams, 请参考群组里面的初始化参数
  • 会话, 对应回调 onsessions, 请参考会话里面的初始化参数
  • 漫游消息, 对应回调 onroamingmsgs, 请参考消息里面的初始化参数
  • 离线消息, 对应回调 onofflinemsgs, 请参考消息里面的初始化参数
  • 离线系统通知, 对应回调 onofflinesysmsgs, 请参考系统通知里面的初始化参数
  • 离线自定义系统通知, 对应回调 onofflinecustomsysmsgs, 请参考系统通知里面的初始化参数

示例代码

  • 这里的参数并不是所有的初始化参数, 请查阅初始化 SDK, 以及其它章节的初始化参数
  • 初始化SDK
  • 多端登录初始化参数
  • 用户关系初始化参数
  • 好友关系初始化参数
  • 用户名片初始化参数
  • 群组初始化参数
  • 会话初始化参数
  • 消息初始化参数
  • 系统通知初始化参数
  • 同步完成
  • 完整的初始化代码
var nim = NIM.getInstance({
onsyncdone: onSyncDone,
});
function onSyncDone() {
console.log('同步完成');
}

同步开关

SDK 默认会同步所有的数据, 开发者可以通过开关来选择不同步某些数据, 这些开关都是初始化参数

  • syncRelations, 是否同步黑名单和静音列表, 默认true. 如果传false就收不到黑名单和静音列表, 即不会收到onblacklist回调和onmutelist回调, 开发者后续可以调用获取黑名单和静音列表来获取黑名单和静音列表。
  • syncFriends, 是否同步好友列表, 默认true. 如果传false就收不到onfriends回调, 开发者后续可以调用获取好友列表来获取好友列表。
  • syncFriendUsers, 是否同步好友对应的用户名片列表, 默认true, 如果传false就收不到onusers回调.
  • syncRobots, 是否同步机器人列表,默认false, 如果传false就收不到onrobots回调。
  • syncTeams, 是否同步群列表, 默认true. 如果传false就收不到群列表, 即不会收到onteams回调, 开发者后续可以调用获取群列表来获取群列表.
  • syncExtraTeamInfo, 是否同步额外的群信息, 默认true会同步额外的群信息, 目前包括
  • 当前登录用户是否开启某个群的消息提醒 (SDK 只是存储了此信息, 具体用此信息来做什么事情完全由开发者控制)
  • 调用接口修改自己的群属性来关闭/开启某个群的消息提醒
  • 调用接口是否需要群消息通知来查询是否需要群消息通知
  • syncTeamMembers, 是否同步群成员, 默认true. 只有在syncTeams=true的时候才起作用, 如果传false就不会同步群成员, 即不会收到onteammembersonsyncteammembersdone回调, 开发者后续可以调用获取群成员来获取群成员.
  • syncRoamingMsgs, 是否同步漫游消息, 默认true. 如果传false就收不到漫游消息, 即不会收到onroamingmsgs回调.
  • syncMsgReceipts, 是否同步已读回执时间戳, 默认true. 如果传false就收不到已读回执时间戳.

示例代码

  • 这里的参数并不是所有的初始化参数, 请查阅初始化 SDK, 以及其它章节的初始化参数
  • 初始化SDK
  • 多端登录初始化参数
  • 用户关系初始化参数
  • 好友关系初始化参数
  • 用户名片初始化参数
  • 群组初始化参数
  • 会话初始化参数
  • 消息初始化参数
  • 系统通知初始化参数
  • 同步完成
  • 完整的初始化代码
var nim = NIM.getInstance({
syncRelations: false
});

完整的初始化代码

  • 请查阅其它章节的初始化参数
  • 初始化SDK
  • 多端登录初始化参数
  • 用户关系初始化参数
  • 好友关系初始化参数
  • 用户名片初始化参数
  • 群组初始化参数
  • 会话初始化参数
  • 消息初始化参数
  • 系统通知初始化参数
  • 同步完成
  • 完整的初始化代码
var data = {};
var nim = NIM.getInstance({
// 初始化SDK
// debug: true
appKey: 'appKey',
account: 'account',
token: 'token',
onconnect: onConnect,
onerror: onError,
onwillreconnect: onWillReconnect,
ondisconnect: onDisconnect,
// 多端登录
onloginportschange: onLoginPortsChange,
// 用户关系
onblacklist: onBlacklist,
onsyncmarkinblacklist: onMarkInBlacklist,
onmutelist: onMutelist,
onsyncmarkinmutelist: onMarkInMutelist,
// 好友关系
onfriends: onFriends,
onsyncfriendaction: onSyncFriendAction,
// 用户名片
onmyinfo: onMyInfo,
onupdatemyinfo: onUpdateMyInfo,
onusers: onUsers,
onupdateuser: onUpdateUser,
onrobots: onRobots,
// 群组
onteams: onTeams,
onsynccreateteam: onCreateTeam,
onteammembers: onTeamMembers,
onsyncteammembersdone: onSyncTeamMembersDone,
onupdateteammember: onUpdateTeamMember,
// 会话
onsessions: onSessions,
onupdatesession: onUpdateSession,
// 消息
onroamingmsgs: onRoamingMsgs,
onofflinemsgs: onOfflineMsgs,
onmsg: onMsg,
// 系统通知
onofflinesysmsgs: onOfflineSysMsgs,
onsysmsg: onSysMsg,
onupdatesysmsg: onUpdateSysMsg,
onsysmsgunread: onSysMsgUnread,
onupdatesysmsgunread: onUpdateSysMsgUnread,
onofflinecustomsysmsgs: onOfflineCustomSysMsgs,
oncustomsysmsg: onCustomSysMsg,
// 同步完成
onsyncdone: onSyncDone
});

function onConnect() {
console.log('连接成功');
}
function onWillReconnect(obj) {
// 此时说明 `SDK` 已经断开连接, 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
console.log('即将重连');
console.log(obj.retryCount);
console.log(obj.duration);
}
function onDisconnect(error) {
// 此时说明 `SDK` 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
console.log('丢失连接');
console.log(error);
if (error) {
switch (error.code) {
// 账号或者密码错误, 请跳转到登录页面并提示错误
case 302:
break;
// 被踢, 请提示错误后跳转到登录页面
case 'kicked':
break;
default:
break;
}
}
}
function onError(error) {
console.log(error);
}

function onLoginPortsChange(loginPorts) {
console.log('当前登录帐号在其它端的状态发生改变了', loginPorts);
}

function onBlacklist(blacklist) {
console.log('收到黑名单', blacklist);
data.blacklist = nim.mergeRelations(data.blacklist, blacklist);
data.blacklist = nim.cutRelations(data.blacklist, blacklist.invalid);
refreshBlacklistUI();
}
function onMarkInBlacklist(obj) {
console.log(obj);
console.log(obj.account + '被你在其它端' + (obj.isAdd ? '加入' : '移除') + '黑名单');
if (obj.isAdd) {
addToBlacklist(obj);
} else {
removeFromBlacklist(obj);
}
}
function addToBlacklist(obj) {
data.blacklist = nim.mergeRelations(data.blacklist, obj.record);
refreshBlacklistUI();
}
function removeFromBlacklist(obj) {
data.blacklist = nim.cutRelations(data.blacklist, obj.record);
refreshBlacklistUI();
}
function refreshBlacklistUI() {
// 刷新界面
}
function onMutelist(mutelist) {
console.log('收到静音列表', mutelist);
data.mutelist = nim.mergeRelations(data.mutelist, mutelist);
data.mutelist = nim.cutRelations(data.mutelist, mutelist.invalid);
refreshMutelistUI();
}
function onMarkInMutelist(obj) {
console.log(obj);
console.log(obj.account + '被你' + (obj.isAdd ? '加入' : '移除') + '静音列表');
if (obj.isAdd) {
addToMutelist(obj);
} else {
removeFromMutelist(obj);
}
}
function addToMutelist(obj) {
data.mutelist = nim.mergeRelations(data.mutelist, obj.record);
refreshMutelistUI();
}
function removeFromMutelist(obj) {
data.mutelist = nim.cutRelations(data.mutelist, obj.record);
refreshMutelistUI();
}
function refreshMutelistUI() {
// 刷新界面
}

function onFriends(friends) {
console.log('收到好友列表', friends);
data.friends = nim.mergeFriends(data.friends, friends);
data.friends = nim.cutFriends(data.friends, friends.invalid);
refreshFriendsUI();
}
function onSyncFriendAction(obj) {
console.log(obj);
switch (obj.type) {
case 'addFriend':
console.log('你在其它端直接加了一个好友' + obj.account + ', 附言' + obj.ps);
onAddFriend(obj.friend);
break;
case 'applyFriend':
console.log('你在其它端申请加了一个好友' + obj.account + ', 附言' + obj.ps);
break;
case 'passFriendApply':
console.log('你在其它端通过了一个好友申请' + obj.account + ', 附言' + obj.ps);
onAddFriend(obj.friend);
break;
case 'rejectFriendApply':
console.log('你在其它端拒绝了一个好友申请' + obj.account + ', 附言' + obj.ps);
break;
case 'deleteFriend':
console.log('你在其它端删了一个好友' + obj.account);
onDeleteFriend(obj.account);
break;
case 'updateFriend':
console.log('你在其它端更新了一个好友', obj.friend);
onUpdateFriend(obj.friend);
break;
}
}
function onAddFriend(friend) {
data.friends = nim.mergeFriends(data.friends, friend);
refreshFriendsUI();
}
function onDeleteFriend(account) {
data.friends = nim.cutFriendsByAccounts(data.friends, account);
refreshFriendsUI();
}
function onUpdateFriend(friend) {
data.friends = nim.mergeFriends(data.friends, friend);
refreshFriendsUI();
}
function refreshFriendsUI() {
// 刷新界面
}

function onMyInfo(user) {
console.log('收到我的名片', user);
data.myInfo = user;
updateMyInfoUI();
}
function onUpdateMyInfo(user) {
console.log('我的名片更新了', user);
data.myInfo = NIM.util.merge(data.myInfo, user);
updateMyInfoUI();
}
function updateMyInfoUI() {
// 刷新界面
}
function onUsers(users) {
console.log('收到用户名片列表', users);
data.users = nim.mergeUsers(data.users, users);
}
function onUpdateUser(user) {
console.log('用户名片更新了', user);
data.users = nim.mergeUsers(data.users, user);
}
function onRobots (robots) {
console.log('收到机器人列表', robots);
data.robots = robots;
}
function onTeams(teams) {
console.log('群列表', teams);
data.teams = nim.mergeTeams(data.teams, teams);
onInvalidTeams(teams.invalid);
}
function onInvalidTeams(teams) {
data.teams = nim.cutTeams(data.teams, teams);
data.invalidTeams = nim.mergeTeams(data.invalidTeams, teams);
refreshTeamsUI();
}
function onCreateTeam(team) {
console.log('你创建了一个群', team);
data.teams = nim.mergeTeams(data.teams, team);
refreshTeamsUI();
onTeamMembers({
teamId: team.teamId,
members: owner
});
}
function refreshTeamsUI() {
// 刷新界面
}
function onTeamMembers(teamId, members) {
console.log('群id', teamId, '群成员', members);
var teamId = obj.teamId;
var members = obj.members;
data.teamMembers = data.teamMembers || {};
data.teamMembers[teamId] = nim.mergeTeamMembers(data.teamMembers[teamId], members);
data.teamMembers[teamId] = nim.cutTeamMembers(data.teamMembers[teamId], members.invalid);
refreshTeamMembersUI();
}
function onSyncTeamMembersDone() {
console.log('同步群列表完成');
}
function onUpdateTeamMember(teamMember) {
console.log('群成员信息更新了', teamMember);
onTeamMembers({
teamId: teamMember.teamId,
members: teamMember
});
}
function refreshTeamMembersUI() {
// 刷新界面
}

function onSessions(sessions) {
console.log('收到会话列表', sessions);
data.sessions = nim.mergeSessions(data.sessions, sessions);
updateSessionsUI();
}
function onUpdateSession(session) {
console.log('会话更新了', session);
data.sessions = nim.mergeSessions(data.sessions, session);
updateSessionsUI();
}
function updateSessionsUI() {
// 刷新界面
}

function onRoamingMsgs(obj) {
console.log('漫游消息', obj);
pushMsg(obj.msgs);
}
function onOfflineMsgs(obj) {
console.log('离线消息', obj);
pushMsg(obj.msgs);
}
function onMsg(msg) {
console.log('收到消息', msg.scene, msg.type, msg);
pushMsg(msg);
}
function pushMsg(msgs) {
if (!Array.isArray(msgs)) { msgs = [msgs]; }
var sessionId = msgs[0].sessionId;
data.msgs = data.msgs || {};
data.msgs[sessionId] = nim.mergeMsgs(data.msgs[sessionId], msgs);
}

function onOfflineSysMsgs(sysMsgs) {
console.log('收到离线系统通知', sysMsgs);
pushSysMsgs(sysMsgs);
}
function onSysMsg(sysMsg) {
console.log('收到系统通知', sysMsg)
pushSysMsgs(sysMsg);
}
function onUpdateSysMsg(sysMsg) {
pushSysMsgs(sysMsg);
}
function pushSysMsgs(sysMsgs) {
data.sysMsgs = nim.mergeSysMsgs(data.sysMsgs, sysMsgs);
refreshSysMsgsUI();
}
function onSysMsgUnread(obj) {
console.log('收到系统通知未读数', obj);
data.sysMsgUnread = obj;
refreshSysMsgsUI();
}
function onUpdateSysMsgUnread(obj) {
console.log('系统通知未读数更新了', obj);
data.sysMsgUnread = obj;
refreshSysMsgsUI();
}
function refreshSysMsgsUI() {
// 刷新界面
}
function onOfflineCustomSysMsgs(sysMsgs) {
console.log('收到离线自定义系统通知', sysMsgs);
}
function onCustomSysMsg(sysMsg) {
console.log('收到自定义系统通知', sysMsg);
}

function onSyncDone() {
console.log('同步完成');
}

登录与登出

登出 IM

  • 初始化 SDK之后, SDK 会自动登录
  • 在收到onconnect回调后可以调用nim.disconnect();来登出 SDK
  • 登出 SDK 后可以调用nim.connect();来重新登入 SDK

切换 IM

如果需要切换 IM, 操作步骤如下

  • 调用登出IM来登出IM
  • 调用初始化SDK来初始化新的 IM

更新 IM 配置

SDK 设计为单例模式, 如果需要更新当前 IM 的配置, 那么可以调用此接口, 参数列表和格式跟NIM.getInstance保持一致, 以更新 token 为例

// 断开 IM
nim.disconnect();
// 更新 token
nim.setOptions({
token: 'newToken'
});
// 重新连接
nim.connect();

多端登录

云信支持多端同时登录, 即用户可以同时在移动端和网页端登录同一账号

初始化参数

  • 这里的参数并不是所有的初始化参数, 请查阅初始化 SDK, 以及其它章节的初始化参数
  • 初始化SDK
  • 多端登录初始化参数
  • 用户关系初始化参数
  • 好友关系初始化参数
  • 用户名片初始化参数
  • 群组初始化参数
  • 会话初始化参数
  • 消息初始化参数
  • 系统通知初始化参数
  • 同步完成
  • 完整的初始化代码

示例代码

var nim = NIM.getInstance({
onloginportschange: onLoginPortsChange
});
function onLoginPortsChange(loginPorts) {
console.log('当前登录帐号在其它端的状态发生改变了', loginPorts);
}

参数解释

  • onloginportschange: 多端登录状态变化的回调, 会收到登录端列表, 以下情况会收到此回调
  • 登录时其它端在线
  • 登录后其它端上线或者下线

登录端

登录端代表登录在某个设备上的相关信息, 有如下字段

  • type: 登录的设备类型
  • os: 登录设备的操作系统
  • mac: 登录设备的 mac 地址
  • deviceId: 登录设备ID, uuid
  • account: 登录的帐号
  • connectionId: 登录设备分配的连接号
  • ip: 登录的服务器 IP
  • time: 登录时间
  • online: 是否在线

设备类型

目前云信支持的登录端有以下几种类型

  • 'Android' (安卓)
  • 'iOS' (苹果)
  • 'PC' (桌面)
  • 'Web' (浏览器)
  • 'Mac' (桌面)

踢其它端

示例代码

nim.kick({
deviceIds: ['deviceId1'],
done: onKick
});
function onKick(error, obj) {
console.log('踢其它端' + (!error?'成功':'失败'));
console.log(error);
console.log(obj);
}

参数解释

  • 其它登录端的设备号可以在onloginportschange回调里获取, 参考登录端对象

用户关系托管

SDK 提供了用户关系托管, 包括黑名单和静音列表

黑名单

  • 如果一个用户被加入了黑名单, 那么就不再会收到此用户发送的消息
  • 如果一个用户被从黑名单移除, 那么会重新收到此用户发送的消息

静音列表

  • SDK只负责维护静音列表, 具体根据静音列表要进行的操作由开发者决定

初始化参数

  • 这里的参数并不是所有的初始化参数, 请查阅初始化 SDK, 以及其它章节的初始化参数
  • 初始化SDK
  • 多端登录初始化参数
  • 用户关系初始化参数
  • 好友关系初始化参数
  • 用户名片初始化参数
  • 群组初始化参数
  • 会话初始化参数
  • 消息初始化参数
  • 系统通知初始化参数
  • 同步完成
  • 完整的初始化代码

示例代码

var nim = NIM.getInstance({
onblacklist: onBlacklist,
onsyncmarkinblacklist: onMarkInBlacklist,
onmutelist: onMutelist,
onsyncmarkinmutelist: onMarkInMutelist
});
function onBlacklist(blacklist) {
console.log('收到黑名单', blacklist);
data.blacklist = nim.mergeRelations(data.blacklist, blacklist);
data.blacklist = nim.cutRelations(data.blacklist, blacklist.invalid);
refreshBlacklistUI();
}
function onMarkInBlacklist(obj) {
console.log(obj);
console.log(obj.account + '被你' + (obj.isAdd ? '加入' : '移除') + '黑名单');
if (obj.isAdd) {
addToBlacklist(obj);
} else {
removeFromBlacklist(obj);
}
}
function addToBlacklist(obj) {
data.blacklist = nim.mergeRelations(data.blacklist, obj.record);
refreshBlacklistUI();
}
function removeFromBlacklist(obj) {
data.blacklist = nim.cutRelations(data.blacklist, obj.record);
refreshBlacklistUI();
}
function refreshBlacklistUI() {
// 刷新界面
}
function onMutelist(mutelist) {
console.log('收到静音列表', mutelist);
data.mutelist = nim.mergeRelations(data.mutelist, mutelist);
data.mutelist = nim.cutRelations(data.mutelist, mutelist.invalid);
refreshMutelistUI();
}
function onMarkInMutelist(obj) {
console.log(obj);
console.log(obj.account + '被你' + (obj.isAdd ? '加入' : '移除') + '静音列表');
if (obj.isAdd) {
addToMutelist(obj);
} else {
removeFromMutelist(obj);
}
}
function addToMutelist(obj) {
data.mutelist = nim.mergeRelations(data.mutelist, obj.record);
refreshMutelistUI();
}
function removeFromMutelist(obj) {
data.mutelist = nim.cutRelations(data.mutelist, obj.record);
refreshMutelistUI();
}
function refreshMutelistUI() {
// 刷新界面
}

参数解释

  • onblacklist: 同步黑名单的回调, 会传入黑名单列表blacklist
  • blacklist的属性invalid包含被删除的黑名单列表
  • 此回调是增量回调, 可以调用nim.mergeRelations和nim.cutRelations来合并数据
  • onsyncmarkinblacklist: 当前登录用户在其它端加入黑名单/从黑名单移除后的回调, 会传入一个参数, 包含两个字段
  • account: 要加入黑名单/从黑名单移除的账号
  • isAdd: true表示加入黑名单, false表示从黑名单移除
  • reocrd, 拼装好的对象
  • onmutelist: 同步静音列表的回调, 会传入静音列表mutelist
  • mutelist的属性invalid包含被删除的静音列表
  • 此回调是增量回调, 可以调用nim.mergeRelations和nim.cutRelations来合并数据
  • onsyncmarkinmutelist: 当前登录用户在其它端加入静音列表/从静音列表移除后的回调, 会传入一个参数, 包含两个字段
  • account: 要加入静音列表/从静音列表移除的账号
  • isAdd: true表示加入静音列表, false表示从静音列表移除
  • reocrd, 拼装好的对象

加入黑名单/从黑名单移除

  • 此接口可以完成以下两个功能, 通过参数isAdd来决定实际的功能
  • isAddtrue时, 会将account加入黑名单
  • 如果一个用户被加入了黑名单, 那么就不再会收到此用户发送的消息
  • isAddfalse时, 会将account从黑名单移除
  • 如果一个用户被从黑名单移除, 那么会重新收到此用户发送的消息
  • 每个功能SDK都提供了相应的独立接口
nim.markInBlacklist({
account: 'account',
// `true`表示加入黑名单, `false`表示从黑名单移除
isAdd: true,
done: markInBlacklistDone
});
function markInBlacklistDone(error, obj) {
console.log(error);
console.log(obj);
console.log('将' + obj.account + (isAdd ? '加入黑名单' : '从黑名单移除') + (!error?'成功':'失败'));
if (!error) {
onMarkInBlacklist(obj);
}
}

加入黑名单

  • 如果一个用户被加入了黑名单, 那么就不再会收到此用户发送的消息
  • SDK内部调用nim.markInBlacklist来完成实际工作
nim.addToBlacklist({
account: 'account',
done: addToBlacklistDone
});
function addToBlacklistDone(error, obj) {
console.log(error);
console.log(obj);
console.log('加入黑名单' + (!error?'成功':'失败'));
if (!error) {
addToBlacklist(obj);
}
}

从黑名单移除

  • 如果一个用户被从黑名单移除, 那么会重新收到此用户发送的消息
  • SDK内部调用nim.markInBlacklist来完成实际工作
nim.removeFromBlacklist({
account: 'account',
done: removeFromBlacklistDone
});
function removeFromBlacklistDone(error, obj) {
console.log(error);
console.log(obj);
console.log('从黑名单移除' + (!error?'成功':'失败'));
if (!error) {
removeFromBlacklist(obj);
}
}

加入静音列表/从静音列表移除

  • 此接口可以完成以下两个功能, 通过参数isAdd来决定实际的功能
  • isAddtrue时, 会将account加入静音列表
  • isAddfalse时, 会将account从静音列表移除
  • 每个功能SDK都提供了相应的独立接口
nim.markInMutelist({
account: 'account',
// `true`表示加入静音列表, `false`表示从静音列表移除
isAdd: 'true',
done: markInMutelistDone
});
function markInMutelistDone(error, obj) {
console.log(error);
console.log(obj);
console.log('将' + obj.account + (isAdd ? '加入静音列表' : '从静音列表移除') + (!error?'成功':'失败'));
if (!error) {
onMarkInMutelist(obj);
}
}

加入静音列表

  • SDK只负责维护静音列表, 具体要根据静音列表进行的操作由开发者决定
  • SDK内部调用nim.markInMutelist来完成实际工作
nim.addToMutelist({
account: 'account',
done: addToMutelistDone
});
function addToMutelistDone(error, obj) {
console.log(error);
console.log(obj);
console.log('加入静音列表' + (!error?'成功':'失败'));
if (!error) {
addToMutelist(obj);
}
}

从静音列表移除

  • SDK只负责维护静音列表, 具体要根据静音列表进行的操作由开发者决定
  • SDK内部调用nim.markInMutelist来完成实际工作
nim.removeFromMutelist({
account: 'account',
done: removeFromMutelistDone
});
function removeFromMutelistDone(error, obj) {
console.log(error);
console.log(obj);
console.log('从静音列表移除' + (!error?'成功':'失败'));
if (!error) {
removeFromMutelist(obj);
}
}

获取黑名单和静音列表

  • 如果开发者在初始化SDK的时候设置了syncRelationsfalse, 那么就收不到onblacklistonmutelist回调, 可以调用此接口来获取黑名单和静音列表。
nim.getRelations({
done: getRelationsDone
});
function getRelationsDone(error, obj) {
console.log('获取静音列表' + (!error?'成功':'失败'), error, obj);
if (!error) {
onBlacklist(obj.blacklist);
onMutelist(obj.mutelist);
}
}

好友关系托管

  • SDK 提供好友关系托管

好友关系初始化参数

  • 这里的参数并不是所有的初始化参数, 请查阅初始化 SDK, 以及其它章节的初始化参数
  • 初始化SDK
  • 多端登录初始化参数
  • 用户关系初始化参数
  • 好友关系初始化参数
  • 用户名片初始化参数
  • 群组初始化参数
  • 会话初始化参数
  • 消息初始化参数
  • 系统通知初始化参数
  • 同步完成
  • 完整的初始化代码
  • 请参考处理系统通知里面的跟好友相关的逻辑

示例代码

var nim = NIM.getInstance({
onfriends: onFriends,
onsyncfriendaction: onSyncFriendAction
});
function onFriends(friends) {
console.log('收到好友列表', friends);
data.friends = nim.mergeFriends(data.friends, friends);
data.friends = nim.cutFriends(data.friends, friends.invalid);
refreshFriendsUI();
}
function onSyncFriendAction(obj) {
console.log(obj);
switch (obj.type) {
case 'addFriend':
console.log('你在其它端直接加了一个好友' + obj.account + ', 附言' + obj.ps);
onAddFriend(obj.friend);
break;
case 'applyFriend':
console.log('你在其它端申请加了一个好友' + obj.account + ', 附言' + obj.ps);
break;
case 'passFriendApply':
console.log('你在其它端通过了一个好友申请' + obj.account + ', 附言' + obj.ps);
onAddFriend(obj.friend);
break;
case 'rejectFriendApply':
console.log('你在其它端拒绝了一个好友申请' + obj.account + ', 附言' + obj.ps);
break;
case 'deleteFriend':
console.log('你在其它端删了一个好友' + obj.account);
onDeleteFriend(obj.account);
break;
case 'updateFriend':
console.log('你在其它端更新了一个好友', obj.friend);
onUpdateFriend(obj.friend);
break;
}
}
function onAddFriend(friend) {
data.friends = nim.mergeFriends(data.friends, friend);
refreshFriendsUI();
}
function onDeleteFriend(account) {
data.friends = nim.cutFriendsByAccounts(data.friends, account);
refreshFriendsUI();
}
function onUpdateFriend(friend) {
data.friends = nim.mergeFriends(data.friends, friend);
refreshFriendsUI();
}
function refreshFriendsUI() {
// 刷新界面
}

参数解释

  • onfriends, 同步好友列表的回调, 会传入好友列表friends
  • friends的属性invalid包含被删除的好友列表
  • 此回调是增量回调, 可以调用nim.mergeFriends和nim.cutFriends来合并数据
  • onsyncfriendaction, 当前登录用户在其它端进行好友相关的操作后的回调
  • 操作包括
  • 直接加为好友
  • 申请加为好友
  • 通过好友申请
  • 拒绝好友申请
  • 删除好友
  • 更新好友
  • 此回调会收到一个参数obj, 它有一个字段type的值为操作的类型, 具体类型如下:
  • 'addFriend' (直接加为好友), 此时obj的字段如下:
  • account的值为被直接加为好友的账号
  • friend为被直接加为好友的好友对象
  • ps为附言
  • 'applyFriend' (申请加为好友), 此时obj的字段如下:
  • account的值为被申请加为好友的账号
  • ps为附言
  • 'passFriendApply' (通过好友申请), 此时obj的字段如下:
  • account的值为被通过好友申请的账号
  • friend为被通过好友申请的好友对象
  • ps为附言
  • 'rejectFriendApply' (拒绝好友申请), 此时obj的字段如下:
  • account的值为被拒绝好友申请的账号
  • ps为附言
  • 'deleteFriend' (删除好友), 此时obj的字段如下:
  • account的值为被删除好友的账号
  • 'updateFriend' (更新好友), 此时obj的字段如下:
  • friend的值为被更新的好友对象
  • 可以调用nim.mergeFriends和nim.cutFriendsByAccounts来合并数据

好友对象

好友对象有以下字段:

  • account: 账号
  • alias: 昵称
  • custom: 扩展字段, 开发者可以自行扩展, 建议封装成JSON格式字符串
  • createTime: 成为好友的时间
  • updateTime: 更新时间

直接加为好友

  • 直接加某个用户为好友后, 对方不需要确认, 直接成为当前登录用户的好友
  • ps: 附言, 选填, 开发者也可以使用JSON格式的字符串来扩展此内容
  • 对方会收到一条类型为'addFriend'的系统通知, 此类系统通知的from字段的值为申请方的帐号, to字段的值为接收方的账号。
nim.addFriend({
account: 'account',
ps: 'ps',
done: addFriendDone
});
function addFriendDone(error, obj) {
console.log(error);
console.log(obj);
console.log('直接加为好友' + (!error?'成功':'失败'));
if (!error) {
onAddFriend(obj.friend);
}
}

申请加为好友

  • 申请加某个用户为好友后, 对方会收到一条类型为'applyFriend'的系统通知, 此类系统通知的from字段的值为申请方的帐号, to字段的值为接收方的账号, 用户在收到好友申请后, 可以选择通过或者拒绝好友申请。
  • 如果通过好友申请, 那么申请方会收到一条类型为'passFriendApply'的系统通知, 此类系统通知的from字段的值为通过方的帐号, to字段的值为申请方的账号。
  • 如果拒绝好友申请, 那么申请方会收到一条类型为'rejectFriendApply'的系统通知, 此类系统通知的from字段的值为拒绝方的帐号, to字段的值为申请方的账号。
  • ps: 附言, 选填, 开发者也可以使用JSON格式的字符串来扩展此内容
nim.applyFriend({
account: 'account',
ps: 'ps',
done: applyFriendDone
});
function applyFriendDone(error, obj) {
console.log(error);
console.log(obj);
console.log('申请加为好友' + (!error?'成功':'失败'));
}

通过好友申请

  • 申请加某个用户为好友后, 对方会收到一条类型为'applyFriend'的系统通知, 此类系统通知的from字段的值为申请方的帐号, to字段的值为接收方的账号, 用户在收到好友申请后, 可以选择通过或者拒绝好友申请。
  • 如果通过好友申请, 那么申请方会收到一条类型为'passFriendApply'的系统通知, 此类系统通知的from字段的值为通过方的帐号, to字段的值为申请方的账号。
  • 如果拒绝好友申请, 那么申请方会收到一条类型为'rejectFriendApply'的系统通知, 此类系统通知的from字段的值为拒绝方的帐号, to字段的值为申请方的账号。
  • ps: 附言, 选填, 开发者也可以使用JSON格式的字符串来扩展此内容
// 假设 sysMsg 是通过回调 `onsysmsg` 收到的系统通知
nim.passFriendApply({
idServer: sysMsg.idServer,
account: 'account',
ps: 'ps',
done: passFriendApplyDone
});
function passFriendApplyDone(error, obj) {
console.log(error);
console.log(obj);
console.log('通过好友申请' + (!error?'成功':'失败'));
if (!error) {
onAddFriend(obj.friend);
}
}

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。