初始化JS代码
请查阅集成方式>引入SDK来下载并引入SDK文件,完整的初始化配置文档请查阅API文档
示例代码
NIM.getInstance
接口为单例模式, 对于同一个账号, 永远返回同一份实例, 即只有第一次调用会初始化一个实例- 后续调用此接口会直接返回初始化过的实例, 同时也会调用接口更新 IM 配置更新传入的配置
- 后续调用此接口时, 如果连接已断开, 会自动建立连接
- 当发生掉线时,SDK 会自动进行重连
- 开发者在收到
onconnect
回调之后代表链接已经建立(登录成功), 此时 SDK 会开始同步数据, 随后在收到onsyncdone
回调之后表示 SDK 完成了数据同步工作, 此时开发者可以进行渲染 UI 等操作了。 - 这里的
data
代表数据, 在后面章节的示例代码中会多次用到这个对象 - 这里的
nim
代表 SDK初始化后的实例, 在后面章节的示例代码中会多次用到这个对象. - 这里的参数并不是所有的初始化参数, 请查阅其它章节的初始化参数
var data = {};
// 注意这里, 当引入的SDK文件是NIM_Web_NIM_v.js时,请通过 NIM.getInstance 来初始化;当引入的SDK文件为NIM_Web_SDK_v时,请使用 SDK.NIM.getInstance 来初始化。SDK文件的选择请参见集成方式。
var nim = NIM.getInstance({
debug: true, // 是否开启日志,将其打印到console。集成开发阶段建议打开。
appKey: 'appKey',
account: 'account',
token: 'token',
db:true, //若不要开启数据库请设置false。SDK默认为true。
// privateConf: {}, // 私有化部署方案所需的配置
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 会将关键操作的信息打印到控制台上, 便于调试logFunc
: 日志分析函数。默认情况下,开发者使用云信 SDK 会将日志打印到 console 中,但在诸如移动端、混合应用场景,对错误的跟踪与查询并不是很方便。SDK 提供了logFunc
配置参数,可截获日志信息,输入到用户自定义的函数中(sdk 也提供了 plugin 供开发者参考)。辅助开发在在混合应用/PC 端/移动端浏览器上对信息做二次处理。appKey
: 在云信管理后台查看应用的 appKeyaccount
: 帐号, 应用内唯一token
: 帐号的 token, 用于建立连接customTag
: 客户端自定义tag,最大32个字符transports
: 用于建立长连接的协议数组,可不填,默认为['websocket', 'xhr-polling']- 默认状态 sdk 优先使用 websocket 连接,如果浏览器不支持 websocket,则使用 xhr-polling
- 开发者可手动设置连接及顺序,可支持选项包括 websocket、xhr-polling、flashsocket
- 示例如: transports: ['websocket'、'xhr-polling'、'flashsocket']
keepNosSafeUrl
: 表示是否保持NOS文件安全短链不变,默认为false
,自动将短链替换为源链。设置为true
则保持不变,用户可通过NOS文件短链换源链。rollbackDelMsgUnread
: 表示收到撤回消息是否同时撤销被撤回消息影响的未读数,默认为false
。决定是否会将被撤回的消息计入未读计算。如置为true
,则在被撤回消息未读场景下,撤回时未读消息数减一。noCacheLinkUrl
: 表示不缓存链接地址,默认为false
。如置为true
,则在每次重连、连接时都从lbs地址获取最新的link地址。privateConf
: 私有化部署所需的配置,可通过管理后台配置并下载相应的js文件,将相应内容引入配置onconnect
: 连接建立后的回调(登录成功), 会传入一个对象, 包含登录的信息, 有以下字段lastLoginDeviceId
: 上次登录的设备的设备号customTag
: 客户端自定义tagconnectionId
: 本次登录的连接号ip
: 客户端 IPport
: 客户端端口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, 以及其它章节的初始化参数
var nim = NIM.getInstance({
onsyncdone: onSyncDone
});
function onSyncDone() {
console.log('同步完成');
}
初始化配置(同步协议)
- SDK 默认对以下参数进行同步,对其他参数不进行同步
syncRelations
同步用户关系syncFriends
同步好友关系syncFriendUsers
同步好友对应的用户名片列表syncRoamingMsgs
同步漫游消息(离线消息自动下推,不需要开关)syncMsgReceipts
同步消息已读回执syncTeams
同步群syncExtraTeamInfo
同步额外群资料
开发者可以通过开关来选择同步或不同步可配置参数的同步数据, 这些开关都是初始化参数
所有可配置同步参数如下:
syncRelations
, 是否同步黑名单和静音列表, 默认true
. 如果传false
就收不到黑名单和静音列表, 即不会收到onblacklist
回调和onmutelist
回调, 开发者后续可以调用获取黑名单和静音列表来获取黑名单和静音列表。syncFriends
, 是否同步好友列表, 默认true
. 如果传false
就收不到onfriends
回调, 开发者后续可以调用获取好友列表来获取好友列表。syncFriendUsers
, 是否同步好友对应的用户名片列表, 默认true
, 如果传false
就收不到onusers
回调.syncRobots
, 是否同步机器人列表,默认false
, 如果传false
就收不到onrobots
回调。syncTeams
, 是否同步群列表, 默认true
. 如果传false
就收不到群列表, 即不会收到onteams
回调, 开发者后续可以调用获取群列表来获取群列表.syncExtraTeamInfo
, 是否同步额外的群信息, 默认true
会同步额外的群信息, 目前包括syncTeamMembers
,Deprecated
, 4.4.0 版本以后废弃,是否同步群成员, 4.2.0 版本及以前默认true
,4.3.0 版本及以后默认false
,只有在syncTeams
=true
的时候才起作用, 如果传false
就不会同步群成员, 即不会收到onteammembers
和onsyncteammembersdone
回调, 开发者可以调用获取群成员来按需获取群成员.syncRoamingMsgs
, 是否同步漫游消息, 默认true
. 如果传false
就收不到漫游消息, 即不会收到onroamingmsgs
回调.syncMsgReceipts
, 是否同步已读回执时间戳, 默认true
. 如果传false
就收不到已读回执时间戳.syncBroadcastMsgs
, 是否同步广播消息, 默认false
.syncSessionUnread
, 是否同步会话未读数(开启数据库时有效,保证多端未读数相一致)
示例代码
- 这里的参数并不是所有的初始化参数, 请查阅初始化 SDK, 以及其它章节的初始化参数
var nim = NIM.getInstance({
syncRelations: false,
syncBroadcastMsgs: true,
onsyncRelationsdone: function(err, obj) {
// ....
}
});
初始化配置(其它协议)
debug
是否开启日志,参数为:true/false,开发者可以开启日志, 这样 SDK 会将关键操作的信息打印到控制台上, 便于调试db
是否开启本地数据库存储数据,参数为:true/false,使用 indexedDbnosScene
nos存储场景 默认imnosSurvivalTime
nos存储场景有效时间 默认InfinityuploadUrl/downloadUrl
私有化部署方案对文件处理专用接口,参考预览图片通用方法enabledHttpsForMessage
针对 iOS 对 https 链接的要求而设计,若设置为 true,则所有文件类型消息的链接转为 https,现在所有使用云信 sdk 进行上传的文件链接均为 https。开发者一般不需要关注此项needReconnect
连接失败时是否需要自动重连autoMarkRead
对收到的消息,是否自动标记为已读shouldIgnoreNotification
该参数类型为函数(function),表示是否要忽略某条通知类消息。该方法会将接收到的通知类消息对象,按照用户上层定义的逻辑进行过滤, 如果该方法返回 true,那么 SDK 将忽略此条通知类消息shouldCountNotifyUnread
该参数类型为函数(function),群消息通知是否加入未读数开关,有上层对回调参数对象做分析,如果返回 true,则计入未读数,否则不计入ntServerAddress
连接统计上报地址,设为null
则不上报,用户可填写自己的日志上报地址,不填则默认为云信服务器的统计地址
日志分析
- SDK 提供初始化参数,辅助用户对日志信息做收集,并进一步分析。如在混合应用中,用户甚至可以直接传入 js-bridge 的方法收集日志。
- 例子为移动端应用将日志上报给服务器做分析
// 客户端代码
// 日志统计插件
function LoggerPlugin(options) {
var logLevelMap = {
debug: 0,
log: 1,
info: 2,
warn: 3,
error: 4
};
var self = this;
var postUrl = options.url || null;
self.level = logLevelMap[options.level] || 0;
self.logCache = [];
self.logNum = 1;
self.timeInterval = 5000;
window.onerror = function(
errorMessage,
scriptURI,
lineNumber,
columnNumber,
errorObj
) {
self.error.call(self, errorObj);
};
setInterval(function() {
if (self.logCache.length > 0 && postUrl) {
self.postLogs(postUrl, self.logCache);
}
}, self.timeInterval);
}
LoggerPlugin.prototype.debug = function() {
if (this.level > 0) {
return;
}
console.debug.apply(this, arguments);
this.cacheLogs.apply(this, ['[degbug]'].concat(arguments));
};
LoggerPlugin.prototype.log = function() {
if (this.level > 1) {
return;
}
console.log.apply(this, arguments);
this.cacheLogs.apply(this, ['[log]'].concat(arguments));
};
LoggerPlugin.prototype.info = function() {
if (this.level > 2) {
return;
}
console.info.apply(this, arguments);
this.cacheLogs.apply(this, ['[info]'].concat(arguments));
};
LoggerPlugin.prototype.warn = function() {
if (this.level > 3) {
return;
}
console.warn.apply(this, arguments);
this.cacheLogs.apply(this, ['[warn]'].concat(arguments));
};
LoggerPlugin.prototype.error = function() {
if (this.level > 4) {
return;
}
console.error.apply(this, arguments);
this.cacheLogs.apply(this, ['[error]'].concat(arguments));
};
LoggerPlugin.prototype.cacheLogs = function(logLevel, args) {
var currentCache = [];
for (var i = 0; i < args.length; i++) {
var arg = args[i];
if (typeof arg === 'object') {
currentCache.push(JSON.stringify(arg));
} else {
currentCache.push(arg);
}
}
var logStr = this.logNum++ + ' ' + logLevel + ' ' + currentCache.join('; ');
this.logCache.push(logStr.replace('%c', ''));
};
LoggerPlugin.prototype.postLogs = function(url, data) {
var self = this;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
console.info('LoggerPlugin::日志上报完成');
self.logCache = [];
self.timeInterval = 5000;
} else {
self.timeInterval += 5000;
}
}
};
xhr.open('POST', url);
xhr.setRequestHeader('Content-Type', 'plain/text;charset=utf-8');
xhr.timeout = 360;
xhr.send(data.join('\n'));
};
- LoggerPlugin 代码,sdk 也已集成,用户可直接使用
NIM.LoggerPlugin
做调用,文档中是希望用户可以参考代码做自己的一些高级开发
// 客户端代码
var nim = NIM.getInstance({
debug: true,
logFunc: new LoggerPlugin({
url: '/getlogger',
level: 'info'
})
});
- 这里使用
nodejs
+express
作为服务器,写了相关的服务器代码,仅供参考
// 服务端代码
const express = require('express');
const fs = require('fs');
const app = express();
app.post('/getlogger', (req, res) => {
req.setEncoding('utf8');
req.rawBody = '';
req.on('data', chunk => {
req.rawBody += chunk;
});
req.on('end', () => {
let body = req.rawBody;
fs.appendFile('sdklog.log', body, () => {
res.end();
});
});
});
完整的初始化代码
- 请查阅其它章节的初始化参数
var data = {};
var nim = NIM.getInstance({
// 初始化SDK
// debug: true
appKey: 'appKey',
account: 'account',
token: 'token',
customTag: 'TV',
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,
onUpdateTeam: onUpdateTeam,
onteammembers: onTeamMembers,
// onsyncteammembersdone: onSyncTeamMembersDone,
onupdateteammember: onUpdateTeamMember,
// 群消息业务已读通知
onTeamMsgReceipt: onTeamMsgReceipt,
// 会话
onsessions: onSessions,
onupdatesession: onUpdateSession,
// 消息
onroamingmsgs: onRoamingMsgs,
onofflinemsgs: onOfflineMsgs,
onmsg: onMsg,
// 系统通知
onofflinesysmsgs: onOfflineSysMsgs,
onsysmsg: onSysMsg,
onupdatesysmsg: onUpdateSysMsg,
onsysmsgunread: onSysMsgUnread,
onupdatesysmsgunread: onUpdateSysMsgUnread,
onofflinecustomsysmsgs: onOfflineCustomSysMsgs,
oncustomsysmsg: onCustomSysMsg,
// 收到广播消息
onbroadcastmsg: onBroadcastMsg,
onbroadcastmsgs: onBroadcastMsgs,
// 同步完成
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 onUpdateTeam (team) {
console.log('群状态更新', team)
}
function onUpdateTeamMember(teamMember) {
console.log('群成员信息更新了', teamMember);
onTeamMembers({
teamId: teamMember.teamId,
members: teamMember
});
}
function refreshTeamMembersUI() {
// 刷新界面
}
function onTeamMsgReceipt (teamMsgReceipts) {
console.log('群消息已读通知', teamMsgReceipts)
}
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 onBroadcastMsg(msg) {
console.log('收到广播消息', msg);
}
function onBroadcastMsgs(msgs) {
console.log('收到广播消息列表', msgs);
}
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('同步完成');
}
清除单例实例
web sdk 连接实例均为单例模式,但可以调用相应接口清除内存中记录的实例,即断开连接,清除内存消息记录及时间戳,方便开发者做到干净重连。
var nim = NIM.getInstance({...})
// 清除实例
nim.destroy({
done: function (err) {
console.log('实例已被完全清除')
}
})
`
注意:
- 手动调用
nim.disconnect()
方法或nim.destroy()
方法后,会直接触发实例的ondisconnect
方法,但此时websocket并没有真正意义上被销毁,只有在done
回调的时候,才能保证socket是onclose
状态的。 - 这点在微信小程序里尤其重要,因为小程序只有两条websocket可用,如果在前一条socket没有close的时候,会占用socket资源,导致反复重连或者悄悄被踢的错误。
本篇文档内容是否对您有帮助?


此文档对你是否有帮助
×


×