http://www.ox-holdings.com

2.5.0新匍京娱乐场官方下载 更新内容新增1. 网络通话新增语音处理模式设置,支持高清视频

摘要即时通讯云网易云信于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可能会卡住调用线程的问题下载地址请从以下官网地址下载:

摘要即时通讯云网易云集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客户经理服务。

优化读取数据库的性能;

处理系统通知

这里涉及到了好友的处理, 请跟好友关系托管合在一起看

function handleSysMsgs(sysMsgs) {
if (!Array.isArray(sysMsgs)) {sysMsgs=[sysMsgs];}
sysMsgs.forEach(function(sysMsg) {
var idServer = sysMsg.idServer;
switch (sysMsg.type) {
case 'addFriend':
onAddFriend(sysMsg.friend);
break;
case 'applyFriend':
break;
case 'passFriendApply':
onAddFriend(sysMsg.friend);
break;
case 'rejectFriendApply':
break;
case 'deleteFriend':
onDeleteFriend(sysMsg.from);
break;
case 'applyTeam':
break;
case 'rejectTeamApply':
break;
case 'teamInvite':
break;
case 'rejectTeamInvite':
break;
default:
break;
}
});
}

增加拆红包音效

预览生成缩略图

  • 只支持通过预览文件或发送文件消息拿到的图片 url, 或者经过其他图片操作后拿到的图片 url
  • width/height 限制了缩略图的尺寸
  • width/height 必须大于等于 0, 不能同时为 0, 必须小于 4096
  • 不同模式下生成的缩略图是不一样的, 目前支持以下三种模式
  • 'cover': 原图片等比缩略, 缩略图一边等于请求的尺寸, 另一边大于请求的尺寸, 即缩略图刚好能覆盖住尺寸为 width*height 的矩形
  • 举个栗子, 假如说之前通过预览文件拿到的 url 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=
  • 此模式下传入 80*100 的尺寸得到的缩略图 url 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80z100
  • 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同尺寸得到的缩略图
  • 'contain': 原图片等比缩略, 缩略图一边等于请求的尺寸, 另一边大于请求的尺寸, 即尺寸为 width*height 的矩形刚好能覆盖住缩略图
  • 还是拿上面的 url 为例, 传入 80*100 的尺寸得到的缩略图 RUL 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80x100
  • 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同尺寸得到的缩略图
  • 'crop': 先等比缩略原图片, 使得一边等于请求的尺寸, 另一边大于请求的尺寸, 然后对大于请求尺寸的那条边进行裁剪, 使得最终的图片大小刚好等于请求的尺寸
  • 还是拿上面的 url 为例, 传入 80*100 的尺寸得到的缩略图 url 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100
  • 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同尺寸得到的缩略图
  • 如果缩略图尺寸大于图片尺寸,默认情况下图片不会被放大,可以传入参数enlarge=true来放大图片
  • 举个栗子, 假如说之前通过预览文件拿到的 url 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=
  • 此 url 对应的图片尺寸为 512-256, 如果使用 'cover' 模式来裁剪, 传入尺寸 1024-512, 得到的缩略图 url 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=1024z512
  • 会发现图片尺寸并没有放大, 如果再传入参数 enlarge=true, 得到的缩略图 url 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=1024z512&enlarge=1
  • 会发现图片被放大了
  • 'crop' 模式下可以传入参数 axis.x 或 axis.y 来控制最后一步裁剪的位置
  • x/y 必须为整数, 取值范围为 0-10, 此方法内部使用 Math.round 来格式化 x/y
  • x 为 0 时表示裁取最左端, x 为 10 时表示裁取最右端
  • y 为 0 时表示裁取最上端, y 为 10 时表示裁取最下端
  • x/y 默认值均为 5, 即裁取正中间
  • 拿上面的 url 为例, 传入 80*100 的尺寸得到的缩略图 url 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100
  • 依次传入 x=0,1,2,3,4,5,6,7,8,9,10 得到的缩略图 url 为
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=0_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=1_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=2_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=3_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=4_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=5_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=6_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=7_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=8_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=9_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=10_5
  • 拿上面的 url 为例, 传入 200*50 的尺寸得到的缩略图 RUL 为
    https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50
  • 依次传入 y=0,2,4,6,8,10 得到的缩略图 url 为
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_0
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_1
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_2
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_3
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_4
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_5
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_6
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_7
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_8
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_9
  • https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=200y50&axis=5_10
var url = 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=';
var thumbnailUrl = nim.viewImageThumbnail({
url: url,
mode: 'cover',
width: 80,
height: 100
});
// 缩略后的图片的 url 如下
// thumbnailUrl === 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80z100'
// 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同的裁剪结果
*
thumbnailUrl = nim.viewImageThumbnail({
url: url,
mode: 'contain',
width: 80,
height: 100
});
// 缩略后的图片的 url 如下
// thumbnailUrl === 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80x100'
// 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同的裁剪结果
*
thumbnailUrl = nim.viewImageThumbnail({
url: url,
mode: 'contain',
width: 80,
height: 100
});
// 缩略后的图片的 url 如下
// thumbnailUrl === 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100'
// 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同的裁剪结果

thumbnailUrl = nim.viewImageThumbnail({
url: url,
mode: 'contain',
width: 80,
height: 100,
axis: {
// x 可取的值请参考上文描述
x: 0
}
});
// 缩略后的图片的 url 如下
// thumbnailUrl === 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=0_5'
// 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同的裁剪结果

thumbnailUrl = nim.viewImageThumbnail({
url: url,
mode: 'contain',
width: 80,
height: 100,
axis: {
// y 可取的值请参考上文描述
y: 0
}
});
// 缩略后的图片的 url 如下
// thumbnailUrl === 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&thumbnail=80y100&axis=5_0'
// 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同的裁剪结果

新匍京娱乐场官方下载 1

云端历史记录

优化读取数据库的性能;

消息

支持画面fit和fill模式;

发送消息的配置选项

  • 上面的各个发送消息的接口都可以配置额外的选项, 来满足开发者对服务器的自定义需求。
  • custom: 扩展字段
  • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  • pushContent: 自定义推送文案
  • pushPayload: 自定义的推送属性
  • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  • needPushNick: 是否需要推送昵称
  • apns: 特殊推送选项, 只在群会话中使用
  • apns.accounts: 需要特殊推送的账号列表, 不填表示推送给当前会话内的所有用户
  • apns.content: 需要特殊推送的文案, 不填的话默认为 pushContent
  • apns.forcePush 是否强制推送, 不填的话默认 true. true 表示即使推送列表中的用户屏蔽了当前会话(如静音), 仍能够推送当前这条内容给相应用户
  • isHistoryable: 是否存储云端历史
  • isRoamingable: 是否支持漫游
  • isSyncable: 是否支持发送者多端同步
  • cc: 是否支持抄送
  • isPushable: 是否需要推送
  • isOfflinable: 是否要存离线
  • isUnreadable: 是否计入消息未读数
  • yidunEnable: 是否需要过易盾反垃圾
  • antiSpamContent: 在开启yidunEnable后, 开发者自定义的反垃圾字段(json格式),格式如下:{"type": 1, "data": "custom content"} 字段说明:type:1.文本,2.图片,3视频,data内容:文本内容or图片地址or视频地址
  • 下面给一个发送文本消息的例子, 发送其它消息的接口类似
var msg = nim.sendText({
scene: 'p2p',
to: 'account',
text: 'hello',
custom: '{}',
done: sendMsgDone
});

增加个人间转账功能

预览高斯模糊图片

  • 只支持通过预览文件或发送文件消息拿到的图片 url, 或者经过其他图片操作后拿到的图片 url
var url = 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=';
var blurUrl = nim.viewImageBlur({
url: url,
radius: 5,
sigma: 3
});
// 高斯模糊后的图片 url 如下
// blurUrl === 'https://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=?imageView&blur=5x3'
// 开发者在浏览器中打开上面的链接之后, 可以直接修改 url 里面的数字来观察不同的高斯模糊后的结果

音视频包含大量升级改进,细节请参考集成文档

更新好友

  • 开发者可以用此接口来更新好友的备注
  • 开发者也可以使用JSON格式的扩展字段来进行扩展
nim.updateFriend({
account: 'account',
alias: 'alias',
custom: 'custom',
done: updateFriendDone
});
function updateFriendDone(error, obj) {
console.log(error);
console.log(obj);
console.log('更新好友' + (!error?'成功':'失败'));
if (!error) {
onUpdateFriend(obj);
}
}

支持横屏和竖屏自由转换;

获取云端历史记录

  • 获取某个会话的历史记录, 会在结果回调函数done里面接收到消息数组
  • 参数解释
  • scene: 请参考消息场景
  • to: 帐号或者群id
  • beginTime: 时间戳, 开始时间, 精确到ms, 默认为0
  • endTime: 时间戳, 结束时间, 精确到ms, 默认为服务器的当前时间
  • lastMsgId: 上次查询的最后一条消息的idServer, 第一次不填
  • limit: 本次查询的消息数量限制, 最多100条, 默认100条
  • reverse: 默认false表示从endTime开始往前查找历史消息; true表示从beginTime开始往后查找历史消息
  • asc: 默认false表示返回的消息按时间逆序排序; true表示按时间正序排序
  • 该接口用于获取一段时间内的历史消息, 由参数beginTimeendTime来控制时间范围。
  • reversefalse时, 后续查询的endTime对应上次查询的最后一条消息的time字段
  • reversetrue时, 后续查询的beginTime对应上次查询的最后一条消息的time字段
nim.getHistoryMsgs({
scene: 'p2p',
to: 'a2',
done: getHistoryMsgsDone
});
function getHistoryMsgsDone(error, obj) {
console.log('获取p2p历史消息' + (!error?'成功':'失败'));
console.log(error);
console.log(obj);
if (!error) {
console.log(obj.msgs);
}
}

下载地址:sdk下载

性别

  • 'unknown' (未知)
  • 'male' (男)
  • 'female' (女)

发送语音或者视频时,如果文件内容过小会给出提示;

设置聊天室黑名单

  • 被加入黑名单的人将不能进入此聊天室
  • account: 待设置的账号
  • isAdd: true表示添加, false表示移除
  • 当有人被加入黑名单时, 所有聊天室成员会收到类型为'blackMember'的聊天室通知消息。
  • 当有人被移除黑名单时, 所有聊天室成员会收到类型为'blackMember'的聊天室通知消息。
  • custom: 扩展字段, 如果填了, 那么其它聊天室成员收到的聊天室通知消息的attach.custom的值为此字段
  • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
chatroom.markChatroomBlacklist({
account: 'account',
isAdd: true,
done: markChatroomBlacklistDone
});
function markChatroomBlacklistDone(error, obj) {
console.log('添加聊天室黑名单' + (!error?'成功':'失败'), error, obj.member);
}

增加个人间转账功能

群对象

群对象有如下字段

  • teamId: 群Id
  • appId: 群所属的app的id
  • type: 群类型
  • name: 群名字
  • avatar: 群头像
  • intro: 群简介
  • announcement: 群公告
  • joinMode: 群加入方式, 仅限高级群
  • beInviteMode: 群被邀请模式, 仅限高级群
  • inviteMode: 群邀请模式, 仅限高级群
  • updateTeamMode: 群信息修改权限, 仅限高级群
  • updateCustomMode: 群信息自定义字段修改权限, 仅限高级群
  • owner: 群主
  • level: 群人数上限
  • memberNum: 群成员数量
  • memberUpdateTime: 群成员最后更新时间
  • createTime: 群创建时间
  • updateTime: 群最后更新时间
  • custom: 第三方扩展字段, 开发者可以自行扩展, 建议封装成JSON格式字符串
  • serverCustom: 第三方服务器扩展字段, 开发者可以自行扩展, 建议封装成JSON格式字符串
  • valid: 是否有效, 解散后该群无效
  • validToCurrentUser: 该群是否对当前用户有效, 如果无效, 那么说明被踢了
  • mute: 是否禁言, 禁言状态下普通成员不能发送消息, 创建者和管理员可以发送消息

优化了语音算法,通话更清晰;

消息场景

消息对象有一个字段scene来标明消息所属的场景, 具体场景如下

  • 'p2p' (点对点消息)
  • 'team' (群消息)

十一长假归来,环信发布了Android ios V3.2.0 SDK,适配了ios10 ,增加红包转账等功能;值得一提的是本次V3.2.0对实时音视频做了大量升级改造,包括之前大家期待的横竖屏切换、高清视频模式等几项新功能上线!环信实时音视频,更懂移动端APP 的实时音视频,让小伙伴们玩得更爽!赶紧下载体验吧!

去除图片元信息

  • 只支持通过预览文件或发送文件消息拿到的图片 url, 或者经过其他图片操作后拿到的图片 url
  • 去除后的图片将不包含 EXIF 信息
var url = 'http://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=';
nim.stripImageMeta({
url: url,
strip: true,
done: stripImageMetaDone
});
function stripImageMetaDone(error, obj) {
console.log('去除图片元信息' + (!error?'成功':'失败'), error, obj);
}

Fix 个别情况下会话未读消息数显示不准确的bug;

系统通知

增加拆红包音效

踢人出群

  • 踢人出群后, 所有群成员会收到一条类型为'removeTeamMembers'的群通知消息。此类群通知消息的from字段的值为踢人的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段accounts的值为被踢的人的帐号列表。
nim.removeTeamMembers({
teamId: 123,
accounts: ['a3', 'a4'],
done: removeTeamMembersDone
});
function removeTeamMembersDone(error, obj) {
console.log(error);
console.log(obj);
console.log('踢人出群' + (!error?'成功':'失败'));
}

Android ​V3.2.0 2016-10-15

同步完成

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

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

示例代码

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

Fix 个别情况下获取联系人不正确的bug;

同步开关

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

支持高清视频,画质更细腻;

删除所有本地消息

  • 如果不支持数据库, 算成功
  • 此方法同时会清空所有的会话, 请开发者自己清空内存里面的会话列表
nim.deleteAllLocalMsgs({
done: deleteAllLocalMsgsDone
});
function deleteAllLocalMsgsDone(error, obj) {
console.log(error);
console.log(obj);
console.log('删除所有本地消息' + (!error?'成功':'失败'));
}

增强的自适应视频质量算法,根据网络环境动态调整清晰度;

未读数

SDK 会自动管理会话的未读数, 会话对象的unread的值为会话的未读数, 如果开发者发现会话的未读数大于收到的离线消息数, 那么需要从本地拉取未读取的消息

会话未读数的初始化在不同的配置环境下,会有不同的计算规则:

  • 开启数据库: db = true
  • 开启同步会话未读数: syncSessionUnread = true
  • 此时会话未读数通过服务器下推的Ack或本地存储的Ack时间戳,与本地数据库中对应会话的本地历史记录做比较,晚于该Ack且不是自己发的消息的数量,为未读数
  • 参见会话初始化参数
  • 未开启会话未读数: syncSessionUnread = false
  • 此时会话未读数通过从本地数据库上次所记录的未读数中取得,如果有离线消息且消息属性标记为isUnreadable,则会在原来的未读数上增加计数
  • 不开启数据库: db = false
  • 不开启自动标记消息已读: autoMarkRead = false
  • 此时服务器下推的所有离线消息算未读,漫游消息算已读
  • 开启自动标记消息已读: autoMarkRead = true
  • 此时每次收到离线消息,均会告知服务器该消息已读,下一次登录,服务器就不会下推离线消息,而将这些消息标记为漫游消息。没有离线消息,未读数在表现上均为0
  • 参见标记消息为已收到

支持客户端视频和语音数据回调,;

发送聊天室文件消息

  • 文件消息是聊天室消息的一种
  • 开发者可以直接发送文件消息
  • 支持以下几种场景
  • 通过参数fileInput传入文件选择 dom 节点或者节点 ID
  • 通过参数blob传入 Blob 对象
  • 通过参数dataURL传入包含 MIME type 和 base64 数据的 data URL, 此用法需要浏览器支持 window.Blob
  • SDK会先将文件上传到文件服务器, 然后把拿到的文件对象在uploaddone回调中传给用户, 然后将其拼装成文件消息发送出去。
  • 开发者也可以先预览聊天室文件来获取文件对象, 然后调用此接口发送文件消息。
  • 直接发送文件消息的话会在beforesend回调里面传入SDK生成的idClient, 如果先预览文件再发送, 那么此接口会直接返回idClient
  • 参数type指定了要发送的文件类型, 包括图片、音频、视频和普通文件, 对应的值分别为'image''audio''video''file', 不传默认为'file'
  • 图片、音频、视频和普通文件的区别在于具体的文件信息不一样, 具体字段请参考
  • 图片对象
  • 音频对象
  • 视频对象
  • 文件对象
  • 文件大小限制为最大100M
  • 高级浏览器会在上传前就检测文件大小
  • IE8和IE9会在上传完成后检测文件大小
chatroom.sendFile({
type: 'image',
fileInput: fileInput,
uploadprogress: function(obj) {
console.log('文件总大小: ' + obj.total + 'bytes');
console.log('已经上传的大小: ' + obj.loaded + 'bytes');
console.log('上传进度: ' + obj.percentage);
console.log('上传进度文本: ' + obj.percentageText);
},
uploaddone: function(error, file) {
console.log('上传' + (!error?'成功':'失败'), error, file);
},
beforesend: function(msg) {
console.log('正在发送聊天室image消息, id=' + msg.idClient);
},
done: sendChatroomMsgDone
});

其他改进:

获取聊天室成员列表

  • guest: true表示获取游客, false表示获取非游客成员
  • 游客列表按照游客进入聊天室的时间倒序排列
  • 非游客(即固定成员)列表按照成为固定成员的时间倒序排列
  • 当设置guest=false来获取非游客成员时, 默认会获取所有的固定成员, 包括不在线的, 可以设置onlyOnline=true来只获取在线的固定成员
  • time 分页用, 查找该时间戳之前的成员
  • 默认 0 代表当前服务器时间
  • 获取游客时, 此字段填上次获取的最后一个游客的enterTime
  • 获取非游客时, 此字段填上次获取的最后一个非游客的updateTime
  • limit 分页用, 默认 100
chatroom.getChatroomMembers({
guest: false,
limit: 100,
done: getChatroomMembersDone
});
function getChatroomMembersDone(error, obj) {
console.log('获取聊天室成员' + (!error?'成功':'失败'), error, obj.members);
}

音视频包含大量升级改进,细节请参考集成文档

会话对象

会话对象有以下字段:

  • id: 会话ID
  • scene: 场景
  • to: 聊天对象, 账号或群ID
  • updateTime: 会话更新的时间
  • unread: 未读数
  • lastMsg: 此会话的最后一条消息
  • msgReceiptTime: 消息已读回执时间戳, 如果有此字段, 说明此时间戳之前的所有消息对方均已读
  • 目前仅对'p2p'会话起作用
  • 此字段不一定有, 只有对方发送过已读回执之后才会有
  • 调用接口发送消息已读回执来发送消息已读回执
  • 调用接口查询消息是否被对方读过了来查询消息是否被对方读过了
  • localCustom: 本地自定义扩展字段
  • 在支持数据库时可以调用更新本地会话来更新此字段, 此字段只会被更新到本地数据库, 不会被更新到服务器上

iOS SDK V3.2.0 2016-10-15

发布订阅事件

  • 向各个客户端发布独立事件

示例代码

nim.publishEvent({
type: 100000,
value: 2,
custom: 'hello world',
vaildTime: 60,
sync: false,
done: publishEventDone
});
function publishEventDone(error, obj) {
console.log('发布事件' + (!error?'成功':'失败'), error, obj);
}

参数解释

  • type, 事件类型,用户自定义可发布事件类型值为100000以上,通过上层逻辑定义其含义
  • value, 事件值,与对应事件类型一一对应,用上层订阅其含义,必须是自然数
  • custom, 用户自定义事件的扩展属性,可选参数,最大256字节
  • vaildTime, 用户发布事件的有效时间,可选参数,以秒为单位,范围在60s~7天(604800s),默认7天
  • broadcastType, 事件广播类型,可选参数,1:仅在线 2:在线和离线,默认2(在线和离线)
  • sync, 是否同步给自己,可选参数,true/false,默认false
  • done, 用户自定义的结果回调函数,第一个参数为error,如果成功则error为null

Fix 登录户马上加入聊天室某些情况下会失败的bug;

完整的初始化代码

  • 请查阅其它章节的初始化参数
  • 初始化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('同步完成');
}

iOS10进行适配

删除某个会话的本地消息

  • 如果不支持数据库, 算成功
nim.deleteLocalMsgsBySession({
scene: 'p2p',
to: 'account',
done: deleteLocalMsgsBySessionDone
});
function deleteLocalMsgsBySession(error, obj) {
console.log(error);
console.log(obj);
console.log('删除会话本地消息' + (!error?'成功':'失败'));
}

优化了语音算法,通话更清晰;

发送聊天室自定义消息

var value = Math.ceil(Math.random()*3);
var content = {
type: 1,
data: {
value: value
}
};
var msg = chatroom.sendCustomMsg({
content: JSON.stringify(content),
done: sendChatroomMsgDone
});
console.log('正在发送聊天室自定义消息, id=' + msg.idClient);

cmd消息增加“em_” 和 “easemob::” 开头的action为内部保留字段;

聊天室成员对象

聊天室成员对象有以下字段

  • chatroomId: 聊天室 ID
  • account: 账号
  • nick: 聊天室内的昵称
  • avatar: 聊天室内的头像
  • type: 聊天室成员类型
  • guest 是否是游客
  • blacked 是否被拉黑
  • gaged 是否被禁言
  • level: 级别
  • online: 是否在线, 只有固定成员才能离线, 对游客而言只能是在线
  • enterTime: 进入聊天室的时间, 如果离线, 无该字段
  • custom: 扩展字段
  • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  • updateTime: 更新时间
  • tempMuted: 是否被临时禁言
  • tempMuteDuration: 临时禁言剩余时长

版本历史:Androidsdk更新日志iossdk更新日志

SDK 概述

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

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

Fix 个别情况下获取联系人不正确的bug;

聊天室信息对象

聊天室信息对象有以下字段

  • id: 聊天室 id
  • name: 聊天室名字
  • announcement: 聊天室公告
  • broadcastUrl: 直播地址
  • custom: 第三方扩展字段
  • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  • createTime: 创建时间
  • updateTime: 更新时间
  • creator: 创建者账号
  • onlineMemberNum: 当前在线人数
  • mute 是否禁言, 禁言状态下普通成员不能发送消息, 创建者和管理员可以发送消息

支持画面fit和fill模式;

申请加为好友

  • 申请加某个用户为好友后, 对方会收到一条类型为'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?'成功':'失败'));
}

支持高清视频,画质更细腻;

不使用数据库

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

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

增强的自适应视频质量算法,根据网络环境动态调整清晰度;

群组功能概述

SDK 提供了普通群以及高级群两种形式的群功能。 高级群拥有更多的权限操作,两种群聊形式在共有操作上保持了接口一致。推荐 APP 开发时只选择一种群类型进行开发。普通群和高级群在原则上是不能互相转换的,他们的群类型在创建时就已经确定。在 SDK 2.4.0 版本后,高级群可以拥有普通群的全部功能,推荐使用高级群进行开发。

  • 普通群 开发手册中所提及的普通群都等同于 Demo 中的讨论组。普通群没有权限操作,适用于快速创建多人会话的场景。每个普通群只有一个管理员。管理员可以对群进行增减员操作,普通成员只能对群进行增员操作。在添加新成员的时候,并不需要经过对方同意。
  • 高级群 高级群在权限上有更多的限制,权限分为群主、管理员、以及群成员。

Fix 登录户马上加入聊天室某些情况下会失败的bug;

预览文件

  • 开发者可以预览文件, 支持以下几种场景
  • 通过参数fileInput传入文件选择 dom 节点或者节点 ID
  • 通过参数blob传入 Blob 对象
  • 通过参数dataURL传入包含 MIME type 和 base64 数据的 data URL, 此用法需要浏览器支持 window.Blob
  • 通过参数wxFilePath传入临时文件路径, 仅供微信小程序使用, 通过 wx.chooseImage 或者 wx.startRecord 拿到的临时文件路径
  • SDK会将文件上传到文件服务器, 然后将拿到的文件对象在done回调中传给开发者, 文件对象有以下几种
  • 图片对象
  • 音频对象
  • 视频对象
  • 文件对象
  • 开发者在拿到文件对象之后, 可以调用发送文件消息来发送文件消息。
  • 文件大小限制为最大100M
  • 高级浏览器会在上传前就检测文件大小
  • IE8/IE9 会在上传完成后检测文件大小
nim.previewFile({
type: 'image',
fileInput: fileInput,
uploadprogress: function(obj) {
console.log('文件总大小: ' + obj.total + 'bytes');
console.log('已经上传的大小: ' + obj.loaded + 'bytes');
console.log('上传进度: ' + obj.percentage);
console.log('上传进度文本: ' + obj.percentageText);
},
done: function(error, file) {
console.log('上传image' + (!error?'成功':'失败'));
// show file to the user
if (!error) {
var msg = nim.sendFile({
scene: 'p2p',
to: 'account',
file: file,
done: sendMsgDone
});
console.log('正在发送p2p image消息, id=' + msg.idClient);
pushMsg(msg);
}
}
});

红包功能改进:

退出聊天室

  • 初始化聊天室并收到onconnect回调之后, 表明进入了聊天室
  • 在收到onconnect回调后可以调用chatroom.disconnect();来退出聊天室
  • 退出聊天室后可以调用chatroom.connect();来重新进入聊天室

发送语音或者视频时,如果文件内容过小会给出提示;

群通知消息

  • 群通知消息是消息的一种
  • 某些群操作后所有群成员会收到一条相应的群通知消息
  • 群通知消息对应的消息对象有一个字段attach包含了额外的信息, attach有一个字段type来标识群通知消息的类型
  • 'updateTeam' (更新群)
  • 更新群后, 所有群成员会收到一条类型为'updateTeam'的群通知消息。此类群通知消息的from字段的值为更新群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为被更新的群信息
  • 'addTeamMembers' (拉人入群)
  • 普通群, 拉人入群后, 所有群成员会收到一条类型为'addTeamMembers'的群通知消息。此类群通知消息的from字段的值为拉人的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段accounts的值为被拉的人的帐号列表, attach有一个字段members的值为被拉的群成员列表。
  • 'removeTeamMembers' (踢人出群)
  • 踢人出群后, 所有群成员会收到一条类型为'removeTeamMembers'的群通知消息。此类群通知消息的from字段的值为踢人的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段accounts的值为被踢的人的帐号列表。
  • 'acceptTeamInvite' (接受入群邀请)
  • 高级群的群主和管理员在邀请成员加入群(通过操作创建群或拉人入群)之后, 被邀请的人会收到一条类型为'teamInvite'的系统通知, 此类系统通知的from字段的值为邀请方的帐号, to字段的值为对应的群ID, 此类系统通知的attach有一个字段team的值为被邀请进入的群, 被邀请的人可以选择接受邀请或者拒绝邀请。
  • 如果接受邀请, 那么该群的所有群成员会收到一条类型为'acceptTeamInvite'的群通知消息, 此类群通知消息的from字段的值为接受入群邀请的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段members的值为接收入群邀请的群成员列表。
  • 如果拒绝邀请, 那么邀请你的人会收到一条类型为'rejectTeamInvite'的系统通知, 此类系统通知的from字段的值为拒绝入群邀请的用户的帐号, to字段的值为对应的群ID。
  • 'passTeamApply' (通过入群申请)
  • 用户可以申请加入高级群, 目标群的群主和管理员会收到一条类型为'applyTeam'的系统通知, 此类系统通知的from字段的值为申请方的帐号, to字段的值为对应的群ID, 高级群的群主和管理员在收到入群申请后, 可以选择通过或者拒绝入群申请。
  • 如果通过申请, 那么该群的所有群成员会收到一条类型为'passTeamApply'的群通知消息, 此类群通知消息的from字段的值为通过入群申请的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段account的值为申请方的帐号, attach有一个字段members的值为被通过申请的群成员列表。
  • 如果拒绝申请, 那么申请人会收到一条类型为'rejectTeamApply'的系统通知, 此类系统通知的from字段的值为拒绝方的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群。
  • 'addTeamManagers' (添加群管理员)
  • 添加群管理员后, 所有群成员会收到一条类型为'addTeamManagers'的群通知消息。此类群通知消息的from字段的值为添加群管理员的人的帐号, to字段的值为对应的群ID, attach有一个字段accounts的值为被加为管理员的帐号列表, attach有一个字段members的值为被加为管理员的群成员列表
  • 'removeTeamManagers' (移除群管理员)
  • 移除群管理员后, 所有群成员会收到一条类型为'removeTeamManagers'的群通知消息。此类群通知消息的from字段的值为移除群管理员的人的帐号, to字段的值为对应的群ID, attach有一个字段accounts的值为被移除的管理员的帐号列表, attach有一个字段members的值为被移除管理员的群成员列表
  • 'leaveTeam' (主动退群)
  • 主动退群后, 所有群成员会收到一条类型为'leaveTeam'的群通知消息。此类群通知消息的from字段的值为退群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象。
  • 'dismissTeam' (解散群)
  • 解散群后, 所有群成员会收到一条类型为'dismissTeam'的群通知消息。此类群通知消息的from字段为解散群的人的帐号, to字段的值为被对应的群ID。
  • 'transferTeam' (转让群)
  • 转让群后, 所有群成员会收到一条类型为'transferTeam'的群通知消息。此类群通知消息的from字段的值为转让群的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段account的值为为新群主的帐号, attach有一个字段members的值为包含新旧群主的群成员列表。
  • 'updateTeamMute' (更新群成员禁言状态)
  • 更新群成员禁言状态后, 所有群成员会收到一条类型为'updateTeamMute'的群通知消息。此类群通知消息的from字段的值为操作方, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段account的值为被禁言的帐号, attach有一个字段members的值为被禁言的群成员列表。
  • 如果attachaccount或者accounts字段, 那么attach的字段users包含这些账号对应的用户名片
  • 更新群昵称不会收到群通知消息, 所有其它在线的群成员会收到初始化SDK时传入的onupdateteammember回调, 请参考修改自己的群属性和修改别人的群昵称

红包功能改进:

智能机器人简介

  • 智能聊天机器人解决方案依托网易IM即时通讯、语音识别、语义理解等服务,为开发者提供人机交互API/SDK、语音识别、意图识别、知识库配置、动态接口等功能,可以在应用IM内快速集成场景丰富的智能聊天机器人。
  • 详见网易人工智能

支持客户端视频和语音数据回调,;

聊天室消息对象

聊天室消息对象有以下字段

  • chatroomId: 聊天室 ID
  • idClient: SDK生成的消息id, 在发送消息之后会返回给开发者, 开发者可以在发送消息的结果回调里面根据这个ID来判断相应消息的发送状态, 到底是发送成功了还是发送失败了, 然后根据此状态来更新页面的UI。如果发送失败, 那么可以重新发送此消息
  • from: 消息发送方, 帐号
  • fromNick: 消息发送方的昵称
  • fromAvatar: 消息发送方的头像
  • fromCustom: 消息发送方的扩展字段
  • fromClientType: 发送方的设备类型
  • type: 聊天室消息类型
  • flow: 消息的流向
  • 'in'表示此消息是收到的消息
  • 'out'表示此消息是发出的消息
  • text: 文本消息的文本内容, 请参考发送聊天室文本消息
  • file: 文件消息的文件对象, 具体字段请参考图片对象、音频对象、视频对象、文件对象, 请参考发送聊天室文件消息
  • geo: 地理位置消息的地理位置对象, 请参考发送聊天室地理位置消息
  • tip: 提醒消息的内容, 请参考发送聊天室提醒消息
  • content: 自定义消息的消息内容, 开发者可以自行扩展, 建议封装成JSON格式字符串, 请参考发送聊天室自定义消息
  • attach: 聊天室通知消息的附加信息, 参考聊天室通知消息的类型来查看详细解释
  • custom: 扩展字段
  • 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  • resend: 是否是重发的消息
  • time: 时间戳

其他改进:

黑名单

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

支持横屏和竖屏自由转换;

发送聊天室消息

包括以下接口

  • 发送聊天室文本消息
  • 预览聊天室文件
  • 发送聊天室文件消息
  • 发送聊天室地理位置消息
  • 发送聊天室提醒消息
  • 发送聊天室自定义消息
  • 发送聊天室消息的配置选项

cmd消息增加“em_” 和 “easemob::” 开头的action为内部保留字段;

按账号取消订阅事件

  • 向特定用户取消订阅特定事件

示例代码

nim.unSubscribeEventsByAccounts({
type: 100000,
accounts: ['cs3'],
done: unSubscribeEventDone
});
function unSubscribeEventDone(error, obj) {
console.log('取消订阅事件' + (!error?'成功':'失败'), error, obj);
}

参数解释

  • type, 事件类型,用户自定义可发布事件类型值为100000以上,通过上层逻辑定义其含义;1为服务器特殊事件,即多端登录状态,可订阅不可发布。
  • accounts, 取消订阅好友的账号列表。当accounts元素数量大于100时,SDK会以每100个帐号做为一组事务进行处理,按组并行执行操作(每组操作为一个事务),任意一组失败都会抛出异常,但之前成功的组不会因后续失败的组而异常回滚;若用户有较强烈的事务处理要求,可多次调用此接口,且每次accounts元素数量小于100,进行上层实现
  • done, 用户自定义的结果回调函数
  • 此回调包含两个参数,第一个参数为error,如果成功则error为null;第二个参数为obj, 它有一个字段failedAccounts的值为操作的类型, 具体类型如下:
  • failedAccounts, 失败的账号数组,如果为空数组则表示操作全部成功

Fix 个别情况下会话未读消息数显示不准确的bug;

预览去除图片元信息

  • 只支持通过预览文件或发送文件消息拿到的图片 url, 或者经过其他图片操作后拿到的图片 url
  • 去除后的图片将不包含 EXIF 信息
var url = 'http://nim.nos.netease.com/MTAxMTAwMg==/bmltYV8xNDc5OTNfMTQ0MzE0NTgyNDI0M184YjFkYTMwMS02NjcxLTRiYjktYTUwZC04ZTVlZjZlNzZjMzA=';
var stripMetaUrl = nim.viewImageStripMeta({
url: url,
strip: true
});

通过入群申请

  • 用户可以申请加入高级群, 目标群的群主和管理员会收到一条类型为'applyTeam'的系统通知, 此类系统通知的from字段的值为申请方的帐号, to字段的值为对应的群ID, 高级群的群主和管理员在收到入群申请后, 可以选择通过或者拒绝入群申请。
  • 如果通过申请, 那么该群的所有群成员会收到一条类型为'passTeamApply'的群通知消息, 此类群通知消息的from字段的值为通过入群申请的人的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群对象, attach有一个字段account的值为申请方的帐号, attach有一个字段members的值为被通过申请的群成员列表。
  • 如果拒绝申请, 那么申请人会收到一条类型为'rejectTeamApply'的系统通知, 此类系统通知的from字段的值为拒绝方的帐号, to字段的值为对应的群ID, attach有一个字段team的值为对应的群。
  • 参数from填申请方的帐号, 该参数的名字在v1.3.0版本中从account变为from
// 假设 sysMsg 是通过回调 `onsysmsg` 收到的系统通知
nim.passTeamApply({
idServer: sysMsg.idServer,
teamId: 123,
from: 'a2',
done: passTeamApplyDone
});
function passTeamApplyDone(error, obj) {
console.log(error);
console.log(obj);
console.log('通过入群申请' + (!error?'成功':'失败'));
}

智能机器人消息模板

  • 参见机器人消息体模板说明

批量删除服务器上的会话

  • 删了服务器上的会话之后, 在不支持数据库时, 下次同步就同步不到对应的会话以及会话对应的漫游消息; 此外, 在新设备上也同步不到对应的会话以及会话对应的漫游消息
  • scene请参考消息场景
  • to 为对方账号或群ID
nim.deleteSessions({
sessions: {[
scene: 'p2p',
to: 'account'
], [
scene: 'p2p',
to: 'account1'
]},
done: deleteSessionsDone
});
function deleteSessionsDone(error, obj) {
console.log(error);
console.log(obj);
console.log('批量删除会话' + (!error?'成功':'失败'));
}

数据库兼容性

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

管理聊天室成员

包括以下接口

  • 设置聊天室管理员
  • 设置聊天室普通成员
  • 设置聊天室黑名单
  • 设置聊天室禁言名单
  • 设置聊天室临时禁言

群组

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