返回
关于我们
分类

更新时间为,将注册群通知消息过滤接口移动到 MsgService

日期: 2020-02-12 03:47 浏览次数 : 154

摘要即时通讯云网易云信于2017年10月12日发布4.3版,本次更新为主要版本更新,详情见文章内容。发布的版本本次发布的版本号为 4.3版,更新时间为:2017年10月12日。iOS 更新内容新增聊天室独立连接,支持账户密码模式和匿名模式。具体请参考开发文档

点击查看原文

摘要即时通讯云网易云信于2017年11月16日发布4.4版,本次更新为主要版本更新,详情见文章内容。发布的版本本次发布的版本号为 4.4版,更新时间为:2017年11月16日。iOS 更新内容新增添加聊天室用户异常掉线或主动退出的时候自动清除队列,包含接口NIMChatroomQueueUpdateRequest 添加 transient 属性NIMChatroomEventType 添加枚举 NIMChatroomEventTypeQueueBatchChangeNIMChatroomEventInfoQueueChangeItemsKey 聊天室批量变更元素键,值为包含多个键值对的字典修正修正清空不存在的最近会话的消息,回调上来的 NIMRecentSession 为 nil 的问题Android 更新内容新增1. 添加聊天室用户异常掉线或主动退出的时候自动清除队列:ChatRoomService#updateQueueEx。影响类和接口:添加通知类型:NotificationType#CHATROOM_QUEUE_BATCH_CHANGE,表示队列批量变更。添加附件类型:ChatRoomPartClearAttachment,包含清除队列的内容。2. NOS 资源下载添加 CDN 支持,添加两种可配置模板,见 SDKOptions#ServerAddress#nosAccess。3. 适配 Android O 版本通知栏,增加云信即时消息通道、消息免打扰通道,解决 target 指向26 通知栏无法弹出的问题。4. 适配 Android O 版本后台运行机制,开发者请务必在清单文件里面配置: <service android:name="com.netease.nimlib.service.ResponseService" />5. 适配 Android O+ 版本,解决 target 指向27 InvalidKeySpecException 导致的 SDK 无法登陆的问题。6. 添加新的 IPC 数据共享机制,替换不安全的多进程读写 SharedPreference,开发者请务必在清单文件里配置: <provider android:name="com.netease.nimlib.ipc.NIMContentProvider" android:authorities="{APP包名}.ipc.provider" android:exported="false" android:process=":core" />7. 添加 SDKOptions#asyncInitSDK 支持异步 SDK 初始化,降低 Application#onCreate 中 SDK 初始化函数的同步响应时间。8. 添加 SDKOptions#reducedIM 支持弱 IM 场景。如果您的APP 仅在部分场景按需使用 IM 能力(不需要在应用启动时就做自动登录),并不需要保证消息通知、数据的实时性,那么这里可以填 true。弱 IM 场景下,push 进程采用懒启动策略(延迟到用户登录阶段),启动后其生命周期将跟随 UI 进程,降低弱 IM 场景的APP的后台功耗开销。9. 添加 SDKOptions.checkManifestConfig,自动检查 SDK 配置是否完全,如果不完全将抛出异常提示。强烈建议开发者在开发阶段开启检查,检查通过后,线上环境关闭。10. API 调用框架增强:支持带 Looper 的非UI线程发起的异步API调用,直接回调到调用者线程。老版本会默认回调到 UI 线程。提供异步强制转成同步的接口:NIMClient#syncRequest,允许设置最大同步等待时间,支持非 UI 线程里需要同步调用云信 API的场景。添加自动生成的 NIMSDK类,开发者可以直接采用 NIMSDK#getXXXService 方法获取服务接口,不再需要传递 XXXService.class,简化 API 调用方式。其他插件自动生成的调用入口类为:NIMChatRoomSDK、NIMLuceneSDK。例如采用NIMSDK.getAuthService().login()替换NIMClient.getService(AuthService.class).login()。11. 添加 NIMClient#getSDKVersion 接口,运行时获取当前集成的 SDK 版本号。变更1. 类变更:com.netease.nimlib.sdk.uinfo.UserInfoProvider#UserInfo 包名变更为 com.netease.nimlib.sdk.uinfo.model.UserInfo,开发者升级到此版本时,请统一修改 UserInfo import 的包名。2. 类成员函数变更:UserInfoProvider 移除 getDefaultIconResId、getAvatarForMessageNotifier、getTeamIcon 三个函数,统一替换为新增的函数,根据会话类型、会话ID返回消息提醒需要的头像位图:getAvatarForMessageNotifier(sessionType, sessionId),请参考最新 Demo 源码中 NimUserInfoProvider 类中提供的替换方案。3. 添加 NIMUitl#isMainProcess 接口,保证 SDK 初始化及 APP 初始化进程判断方式统一,请开发者替换 Application#onCreate 中主进程判断方法为此方法。4. 移除 SDKOptions#enableSDKBackgroundReconnectStrategy 后台自动重连开关,请采用弱 IM 模式替换。5. 修复 Push 进程自动登录被踢出后,部分机器进程被系统反复调度重启时依然发起连接的问题。6. 针对 SDKOptions#sdkStorageRootPath 配置的外置存储缓存根目录,如果开发者配置在 Context#getExternalCacheDir 及 Context#getExternalFilesDir 等应用扩展存储缓存目录下(即/sdcard/Android/data/{package}),SDK 内部将不再检查写权限。值得注意的是,改缓存目录下的的文件会随着App卸载而被删除,也可以由用户手动在设置界面里面清除。7. 优化唤醒策略,减少不必要的唤醒。优化 Push 进程无法唤醒 UI 时将采用的 “自杀机制”,先切断所有唤醒路径后再安全退出。8. 修复匿名聊天室断网重连过程中如果出现回调 1001 的错误码时(SDK无法通过回调获取聊天室ip)时,SDK 无法继续重连的问题。9. 修复聊天室调用 ChatRoomSerivce#updateMyRoomRole 后,在断网重连过程中,丢失角色信息更新的问题。Windows(PC) SDK 更新内容新增聊天室用户异常掉线或主动退出的时候自动清除队列, nim_chatroom.hnim_chatroom_queue_offer_async(...), json_extension = "{"transient":true}" 设置此次更新的元素会在特定场景下被自动清除新增通知类 kNIMChatRoomNotificationIdQueueBatchChanged 用在麦序队列中有批量变更,发生在元素提交者离开聊天室或者从聊天室异常掉线时修复修复获取最近会话列表时可能导致CPU增高的问题Web SDK 更新内容新增聊天室新增麦序队列元素,增加可配置选项,用户从聊天室掉线或退出的时候,需要删除这个元素变更取消同步群成员配置选项,强制要求开发者按需同步群成员列表下载地址请从以下官网地址下载:

摘要即时通讯云网易云集SDK新版发布,本次发布的版本号为:2.5.0。发布的版本本次发布的版本号为 2.5.0版,更新时间为:2016年7月08日。iOS 2.5.0 更新内容新增添加定期清理 SDK 日志的功能添加聊天室临时禁言的接口支持转发消息网络通话新增是否自动旋转远端画面的设置autoRotateRemoteVideo修正修复聊天室 Tip 消息无法正常解析的问题Android 2.5.0 更新内容新增1. 添加文本消息的全局搜索接口:MsgService#searchAllMessageHistory。2. 添加消息转发功能:MessageBuilder#createForwardMessage,支持除通知消息和音视频消息以外的消息类型。3. 添加聊天室临时禁言接口:ChatRoomService#markChatRoomTempMute,支持设置临时禁言时长。变更1. 将注册群通知消息过滤接口移动到 MsgService 中:MsgService#registerIMMessageFilter ,并支持单聊和群聊的通知类型消息过滤,不再限于群通知消息,同时支持音视频类型消息过滤。2. 聊天室架构调整,聊天室业务仅在 UI 进程处理。3. SDK 输出jar包按模块分离:nim-sdk.jar(必须)、nim-chatroom.jar(可选聊天室模块)、nim-rts.jar(可选实时会话白板模块)、nim-avchat.jar(可选实时音视频模块)、nrtc-sdk.jar(实时会话、实时音视频基础库),供开发者按需组合使用。Web SDK 2.5.0 更新内容变更获取用户名片数组限制每次最多只能获取150个名片新增转发消息重发消息获取包含关键词的本地历史记录新增参数global表示是否全局搜索同步开关syncExtraTeamInfo, 控制是否同步额外的群信息, 默认true会同步额外的群信息, 目前包括当前登录用户是否开启某个群的消息提醒 (SDK 只是存储了此信息, 具体用此信息来做什么事情完全由开发者控制)调用接口修改自己的群属性来关闭/开启某个群的消息提醒调用接口是否需要群消息通知来查询是否需要群消息通知设置聊天室临时禁言Windows(PC) SDK 2.5.0 更新内容修复语音播放停止延迟问题会话列表更新时消息未读数目错误的问题新增消息历史本地全局搜索, nim_msglog.h群组增加获取群信息和成员信息的同步接口, nim_team.h聊天室临时禁言, nim_chatroom.h消息转发接口, nim_talk.h音视频支持SOCKS5代理对端视频画面自动旋转开关下载地址请从以下官网地址下载:

摘要即时通讯云网易云信于2016年12月28日发布3.3.0版,本次更新为主要版本的次要更新,详情见文章内容。发布的版本本次发布的版本号为 3.3.0版,更新时间为:2016年12月28日。iOS 更新内容新增最近会话更新,开发者可以更方便地添加 @ 标记,会话置顶等功能NIMRecentSession新增本地扩展字段localExtNIMConversationManager增加本地更新接口updateRecentLocalExt:recentSession:新增进入聊天室时重连次数设置新增进入聊天室通知的信息:禁言标记临时禁言标记临时禁言时长新增文档转码,可以在 PC 端 提交文件转码任务,将 ppt 和 pdf 等文档转码为各种清晰度的图片存储在云端,在移动端获取、下载或者删除转码后的文档网络通话新增文件混音功能,支持实时音视频中开始、暂停、恢复及停止文件混音,支持设置文件播放次数、发送音量和播放音量新增支持高清语音,提供高采样率语音,提高通话体验新增网络探测功能,可探测通话网络的连通性、丢包率和延迟等信息Android 更新内容新增1. UIKit 优化,降低接入复杂度。2. UIKit 基于强推消息实现群组 @ 功能。3. 进入聊天室接口支持可配置重试次数:ChatRoomService#enterChatRoomEx。4. 添加消息通知栏展示样式配置(折叠或者展开):StatusBarNotificationConfig#notificationFolded。默认是折叠,即云信消息端内消息提醒最多之占一栏;也可以设置为展开,达到端内、端外通知栏提醒一致的表现。5. 聊天室通知消息中加入新的附件类型:ChatRoomTempMuteAddAttachment 可获取临时禁言时长, ChatRoomTempMuteRemoveAttachment 可获取解禁提前的时长,ChatRoomRoomMemberInAttachment 可获取进入聊天室的用户是否被禁言,是否被临时禁言以及临时禁言时长。6. 网络通话新增伴音功能复制- 开始伴音: AVChatManager#startAudioMixing- 暂停伴音: AVChatManager#pauseAudioMixing- 恢复伴音: AVChatManager#resumeAudioMixing- 停止伴音: AVChatManager#stopAudioMixing- 伴音音量: AVChatParameters#KEY_AUDIO_MIXING_STREAM_VOLUME- 伴音状态通知: AVChatStateObserver#onAudioMixingEvent7. 网络通话新增网络探测功能复制- 开始网络探测: AVChatNetDetector#startNetDetect- 停止网络探测: AVChatNetDetector#stopNetDetect- 探测结果通知: AVChatNetDetectCallback#onDetectResult8. 网络通话新增高清语音支持: AVChatOptionalConfig#enableAudioHighQuality9. 网络通话新增人声检测支持: AVChatOptionalConfig#enableAudioDtx10. 添加文档转码:复制- 文档分页查询, DocumentManager#queryDocumentDataList- 单个文档查询, DocumentManager#querySingleDocumentData- 单个文档删除, DocumentManager#delete变更1. SDK IPC 唤醒方式修改。2. SDK HTTP 网络库更新。3. NOS 资源传输支持 HTTPS。4. NOS 上传优化,修复文件传输过程中出现断网,偶现重连后无法继续上传的问题。5. 聊天室断网重连机制优化。6. SDK 初始化异常问题优化。7. SDK 网络层偶现的空指针问题修复。8. SDK 多线程问题优化。9. 手动登录返回 408,415 时进行网络检测并输出到日志。10. SDK 收到新消息后不再发送 Action 为 ACTION_RECEIVE_MSG 的广播通知。若开发者依赖此广播实现接收消息,在升级 SDK 请改为使用 Observer 监听的方式接收消息。11. 网络通话移除自动增益开关: AVChatOptionalConfig#setAudioEffectAGCModeWindows(PC) SDK 更新内容新增SDK 追加文档转换模块,文档上传和下载复用nos模块功能SDK 音视频设备中支持修改音频采集时是否开启降噪、人言检查、消回音功能SDK 音视频通话支持高清语音模式,3.3.0 之前的版本无法加入已经开启高清语音的多人会议SDK 初始化是增加配置登录最大重试次数, nim_client_def.hSDK IM/聊天室/音视频(C#)提供64位编译版本,伴音功能暂不提供64位版本。nim_nos.h HTTP上传下载扩展接口增加支持断点续传和暂停功能 nim_nos_def.hHTTP下载扩展接口增加“另存为”指定到自定义路径 nim_nos_def.hHTTP上传下载扩展接口增加超时时间的自定义设置入口, nim_nos_def.hnim_nos.h 增加监听上传任务结果回调全局广播的全局注册接口,开发者可以通过监听获取多媒体消息的下载地址。聊天室“进入聊天室”的聊天室通知增加三个内容:该进入成员是否被禁言,该进入成员是否被临时禁言,该进入成员临时禁言还剩时长, nim_chatroom_def.h修复优化 注销退出流程修复 退出后cleanup可能会卡住调用线程的问题下载地址请从以下官网地址下载:

  • 聊天室 - 独立聊天室模式 章节。添加当前聊天室鉴权模式接口@protocol NIMLoginManager <NSObject>/*** 当前 SDK 鉴权模式** @return 当前 SDK 鉴权模式*/- (NIMSDKAuthMode)currentAuthMode;end添加批量清空会话未读数接口@protocol NIMConversationManager <NSObject>/*** 设置所有会话消息为已读** @discussion 异步方法,消息会标记为设置的状态。不会触发单条 recentSession 更新的回调,但会触发回调 - (void)allMessagesRead*/- (void)markAllMessagesRead@end本地消息搜索接口支持多类型消息搜索添加全局广播推送监听服务NIMBroadcastManager高级群消息支持 "只接收管理员消息提醒" 的免打扰选项。增加是否支持动态缩略图的配置animatedImageThumbnailEnabled@protocol NIMSDKConfig NSObject/*** 是否支持动图缩略* @discusssion 默认为 NO。即默认情况下,从服务器获取原图缩略图时,如果原图为动图,我们将返回原图第一帧的缩略图。* 而开启这个选项后,我们将返回缩略图后的动图。这个选项只影响从服务器获取的缩略图,不影响本地生成的缩略图。*/@property (nonatomic,assign) BOOL animatedImageThumbnailEnabled;@end变更修改通知状态接口变更 (void)updateNotifyState:(BOOL)notify inTeam:(NSString *)teamId completion:(nullable NIMTeamHandler)completion;为- (void)updateNotifyState:(NIMTeamNotifyState)state inTeam:(NSString *)teamId completion:(nullable NIMTeamHandler)completion;查询通知状态接口变更- (BOOL)notifyForNewMsg:(NSString *)teamId;为- (void)updateNotifyState:(NIMTeamNotifyState)state inTeam:(NSString *)teamId completion:(nullable NIMTeamHandler)completion;Android 更新内容新增1. 添加聊天室独立登录模式:EnterChatRoomData#setIndependentMode。2. 添加批量清空所有会话未读数接口:MsgService#clearAllUnreadCount。3. 添加支持多类型的本地消息历史搜索接口:MsgService#queryMessageListByTypes。4. 添加大群清理逻辑。5. 添加全员广播消息,通过注册观察者接口接收广播消息:MsgServiceObserve#observeBroadcastMessage。6. 群消息支持 "只接收管理员消息提醒" 的免打扰选项。影响类和接口:添加枚举类型:TeamMessageNotifyTypeEnum,用于表示群消息提醒类型,包含全部提醒、仅管理员提醒、全部不提醒。变更接口:TeamService#muteTeam,参数类型从 boolean 更改为 TeamMessageNotifyTypeEnum。添加方法:Team#getMessageNotifyType,此外 Team#mute 方法废弃。7. 添加动图缩略图下载选项:SDKOptions#animatedImageThumbnailEnabled,支持下载原图或者第一帧图像(默认)。8. 添加聊天室获取机器人列表接口:ChatRoomService#pullAllRobots。9. 添加后台自动断网重连策略可选开关 SDKOptions#enableSDKBackgroundReconnectStrategy。Windows(PC) SDK 更新内容新增群消息支持「只接收管理员消息提醒」的免打扰选项全员广播批量清空所有会话未读数的接口搜索历史记录支持多类型组合聊天室游客模式获取图片缩略图需要支持动图缩略图修复修复群信息界面 普通成员无法修改群消息通知模式的bugWeb SDK 更新内容新增全部会话未读数清零全员广播接收接口展示消息图片自动转换https链接群消息支持「只接收管理员消息提醒」的免打扰选项变更获取及同步群成员不再进行本地存储,一律取服务器数据下载地址请从以下官网地址下载:

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);
}
}

  • 上一篇:没有了
  • 下一篇:没有了