为了让开发者更快更方便的使用SDK,悟空SDK提供了一个唯一的入口来访问SDK中的所有功能。就像书籍的目录一样可以通过目录查找对应的内容。如连接IMWKIM.getInstance().getConnectionManager().connection()
SDK常用功能介绍
在Application的onCreate方法中初始化SDK
Java
WKIM.getInstance().init(context,uid,token)监听获取连接服务器IP和Port的事件
WKIM.getInstance().getConnectionManager().addOnGetIpAndPortListener(newIGetIpAndPort(){@OverridepublicvoidgetIP(IGetSocketIpAndPortListeneriGetSocketIpAndPortListener){//返回连接IP和端口iGetSocketIpAndPortListener.onGetSocketIpAndPort("xxx",xxx);}});Kotlin
//连接IMWKIM.getInstance().getConnectionManager().connection();//断开IMWKIM.getInstance().getConnectionManager().disconnect(isLogout);Kotlin
WKIM.getInstance().getConnectionManager().addOnConnectionStatusListener("key",newIConnectionStatus(){@OverridepublicvoidonStatus(intstatus,Stringreason){if(status==WKConnectStatus.success){//连接成功}}});Kotlin
/****@paramtextContent消息正文*@paramchannelID投递的频道ID*@paramchannelType投递的频道类型(个人频道,群频道,客服频道等等)*/WKIM.getInstance().getMsgManager().sendMessage(textContent,channelID,channelType);Kotlin
WKIM.getInstance().msgManager.sendMessage(textContent,channelID,channelType)如给用户A发送一条文本消息。构建文本消息正文
WKTextContenttextContent=newWKTextContent("你好,悟空");Kotlin
valtextContent=WKTextContent("你好,悟空")将消息发送给用户A
WKIM.getInstance().getMsgManager().sendMessage(textContent,"A",WKChannelType.PERSONAL);Kotlin
WKIM.getInstance().getMsgManager().addOnSendMsgCallback("key",newISendMsgCallBackListener(){@OverridepublicvoidonInsertMsg(WKMsgwkMsg){//可以在这里将保存在数据库的消息`wkMsg`展示在UI上//...}});Kotlin
WKIM.getInstance().getMsgManager().addOnNewMsgListener("key",newINewMsgListener(){@OverridepublicvoidnewMsg(List
WKIM.getInstance().getMsgManager().addOnRefreshMsgListener("key",newIRefreshMsg(){@OverridepublicvoidonRefresh(WKMsgwkMsg,booleanisEnd){//wkMsg:刷新的消息对象//isEnd:为了避免频繁刷新UI导致卡顿,当isEnd为true时在刷新UI}});Kotlin
在打开应用时需同步最近会话列表,获取某个channel的未读数量、消息提醒、最后一条消息等
WKIM.getInstance().getConversationManager().addOnSyncConversationListener(newISyncConversationChat(){@OverridepublicvoidsyncConversationChat(Stringlast_msg_seqs,intmsg_count,longversion,ISyncConversationChatBackiSyncConversationChatBack){/***同步会话**@paramlast_msg_seqs最近会话列表msg_seq集合*@parammsg_count会话里面消息同步数量*@paramversion最大版本号*@paramiSyncConvChatBack回调*/}});Kotlin
WKIM.getInstance().conversationManager.addOnSyncConversationListener{last_msg_seqs,msg_count,version,iSyncConversationChatBack->//todo同步最近会话数据}当在聊天页面中时用户可以上拉下拉,或者搜索查看聊天数据,对此悟空sdk提供了如下方法
/***查询或同步某个频道消息**@paramchannelId频道ID*@paramchannelType频道类型*@paramoldestOrderSeq最后一次消息大orderSeq第一次进入聊天传入0*@paramcontain是否包含oldestOrderSeq这条消息*@paramdropDown是否下拉*@paramaroundMsgOrderSeq查询此消息附近消息如aroundMsgOrderSeq=20返回数据则是[16,17,19,20,21,22,23,24,25]*@paramlimit每次获取数量*@paramiGetOrSyncHistoryMsgBack请求返还*/WKIM.getInstance().getMsgManager().getOrSyncHistoryMessages(StringchannelId,bytechannelType,longoldestOrderSeq,booleancontain,booleandropDown,intlimit,longaroundMsgOrderSeq,finalIGetOrSyncHistoryMsgBackiGetOrSyncHistoryMsgBack){}Kotlin
WKIM.getInstance().msgManager.getOrSyncHistoryMessages(channelId,channelType,oldestOrderSeq,contain,dropDown,limit,aroundMsgOrderSeq,object:IGetOrSyncHistoryMsgBack{overridefunonResult(list:MutableList
WKIM.getInstance().getMsgManager().addOnSyncChannelMsgListener(newISyncChannelMsgListener(){@OverridepublicvoidsyncChannelMsgs(StringchannelID,bytechannelType,longstartMessageSeq,longendMessageSeq,intlimit,intpullMode,ISyncChannelMsgBackiSyncChannelMsgBack){/***同步某个频道的消息**@paramchannelID频道ID*@paramchannelType频道类型*@paramstartMessageSeq开始消息列号(结果包含start_message_seq的消息)*@paramendMessageSeq结束消息列号(结果不包含end_message_seq的消息)*@paramlimit消息数量限制*@parampullMode拉取模式0:向下拉取1:向上拉取*@paramiSyncChannelMsgBack请求返回*/}});Kotlin
WKIM.getInstance().getConversationManager().addOnRefreshMsgListener("key",newIRefreshConversationMsg(){@OverridepublicvoidonRefreshConversationMsg(WKUIConversationMsgwkUIConversationMsg,booleanisEnd){//wkUIConversationMsg最近会话消息内容UI上已有该会话需进行更新,反之添加到UI上//isEnd为了防止频繁刷新UI,当isEnd为true可刷新UI}});Kotlin
WKIM.getInstance().getConversationManager().addOnDeleteMsgListener("key",newIDeleteConversationMsg(){@OverridepublicvoidonDelete(StringchannelID,bytechannelType){//channelID聊天频道ID//channelType聊天频道类型}});Kotlin
WKIM.getInstance().conversationManager.addOnDeleteMsgListener("key"){channelID,channelType->//channelID聊天频道ID//channelType聊天频道类型}WKUIConversationMsg类核心数据
//查询所有最近会话WKIM.getInstance().getConversationManager().getAll();//修改消息红点WKIM.getInstance().getConversationManager().updateRedDot(StringchannelID,bytechannelType,intredDot);//删除某个会话WKIM.getInstance().getConversationManager().deleteMsg(StringchannelId,bytechannelType);Kotlin
//获取channel信息先获取内存如果没有再从数据库获取WKIM.getInstance().getChannelManager().getChannel(StringchannelID,bytechannelType)//从远程服务器获取channel信息WKIM.getInstance().getChannelManager().fetchChannelInfo(StringchannelID,bytechannelType)//批量导入频道信息该方法会触发channel刷新事件WKIM.getInstance().getChannelManager().addOrUpdateChannels(List
//监听channel刷新事件WKIM.getInstance().getChannelManager().addOnRefreshChannelInfo("key",newIRefreshChannel(){@OverridepublicvoidonRefreshChannel(WKChannelchannel,booleanisEnd){//}});//监听获取channel信息WKIM.getInstance().getChannelManager().addOnGetChannelInfoListener(newIGetChannelInfo(){@OverridepublicWKChannelonGetChannelInfo(StringchannelID,bytechannelType,IChannelInfoListeneriChannelInfoListener){//获取个人资料还是群资料可通过channelType区分//如果app本地有该channel信息可直接返回数据,反之可获取网络数据后通过iChannelInfoListener返回returnnull;}});Kotlin
定义消息对象并继承WKMessageContent并在构造方法中指定消息类型
publicclassWKCardContentextendsWKMessageContent{publicWKCardContent(){type=3;//指定消息类型}//定义需发送给对方的字段publicStringuid;//用户IDpublicStringname;//名称publicStringavatar;//头像}Kotlin
{"type":3,"uid":"xxxx","name":"xxx","avatar":"xxx"}重写WKMessageContent的encodeMsg方法开始编码
@OverridepublicJSONObjectencodeMsg(){JSONObjectjsonObject=newJSONObject();try{jsonObject.put("uid",uid);jsonObject.put("name",name);jsonObject.put("avatar",avatar);}catch(JSONExceptione){e.printStackTrace();}returnjsonObject;}Kotlin
overridefunencodeMsg():JSONObject{valjsonObject=JSONObject()jsonObject.put("uid",uid)jsonObject.put("name",name)jsonObject.put("avatar",avatar)returnjsonObject}重写WKMessageContent的decodeMsg方法开始解码
@OverridepublicWKMessageContentdecodeMsg(JSONObjectjsonObject){uid=jsonObject.optString("uid");name=jsonObject.optString("name");avatar=jsonObject.optString("avatar");returnthis;}Kotlin
overridefundecodeMsg(jsonObject:JSONObject):WKMessageContent{this.uid=jsonObject.optString("uid")this.name=jsonObject.optString("name")this.avatar=jsonObject.optString("avatar")returnthis}如果您想控制该自定义消息在获取时显示的内容可重写getDisplayContent方法
@OverridepublicStringgetDisplayContent(){return"[名片消息]";}Kotlin
overridefungetDisplayContent():String{return"[名片消息]"}如果你想在全局搜索时能搜索到该类型的消息,可重写getSearchableWord方法
@OverridepublicStringgetSearchableWord(){return"[名片]";}Kotlin
WKIM.getInstance().getMsgManager().registerContentMsg(WKCardContent.class);Kotlin
WKIM.getInstance().msgManager.registerContentMsg(WKCardContent::class.java)对此通过这三步自定义普通消息就已完成。在收到消息时WKMsg中的type为3就表示该消息是名片消息,其中baseContentMsgModel则为自定义的WKCardContent,这时可将baseContentMsgModel强转为WKCardContent并渲染到UI上
我们在发送消息的时候有时需发送带附件的消息。WuKongIM也提供自定义附件消息,自定义附件消息和普通消息区别不大。下面我们已地理位置消息举例
值得注意的是自定义附件消息需继承WKMediaMessageContent而不是WKMessageContent
publicclassWKLocationContentextendsWKMediaMessageContent{//定义需发送给对方的字段publicdoublelongitude;//经度publicdoublelatitude;//纬度publicStringaddress;//地址详细信息publicWKLocationContent(doublelongitude,doublelatitude,Stringaddress){type=6;this.longitude=longitude;this.latitude=latitude;this.address=address;}//这里必须提供无参数的构造方法publicWKLocationContent(){type=6;}}Kotlin
{"type":6,"longitude":115.25,"latitude":39.26,"url":"xxx","address":"xxx"}重写WKMessageContent的encodeMsg方法开始编码
@OverridepublicJSONObjectencodeMsg(){JSONObjectjsonObject=newJSONObject();try{jsonObject.put("address",address);jsonObject.put("latitude",latitude);jsonObject.put("longitude",longitude);jsonObject.put("url",url);//位置截图jsonObject.put("localPath",localPath);}catch(JSONExceptione){e.printStackTrace();}returnjsonObject;}Kotlin
overridefunencodeMsg():JSONObject{valjsonObject=JSONObject()jsonObject.put("longitude",longitude)jsonObject.put("latitude",latitude)jsonObject.put("address",address)jsonObject.put("url",url)jsonObject.put("localPath",localPath)returnjsonObject}重写WKMessageContent的decodeMsg方法开始解码
@OverridepublicWKMessageContentdecodeMsg(JSONObjectjsonObject){latitude=jsonObject.optDouble("latitude");longitude=jsonObject.optDouble("longitude");address=jsonObject.optString("address");url=jsonObject.optString("url");if(jsonObject.has("localPath"))localPath=jsonObject.optString("localPath");returnthis;}Kotlin
WKIM.getInstance().getMsgManager().registerContentMsg(WKLocationContent.class);Kotlin
WKIM.getInstance().getMsgManager().addOnUploadAttachListener(newIUploadAttachmentListener(){@OverridepublicvoidonUploadAttachmentListener(WKMsgwkMsg,IUploadAttacResultListenerlistener){//在这里将未上传的文件上传到服务器并返回给sdkif(wkMsg.type==6){WKMediaMessageContentmediaMessageContent=(WKMediaMessageContent)wkMsg.baseContentMsgModel;if(TextUtils.isEmpty(mediaMessageContent.url)){//todo上传文件//...mediaMessageContent.url="xxxxxx";//设置网络地址并返回给sdklistener.onUploadResult(true,mediaMessageContent);}}}});Kotlin
/***修改消息内容体**@paramclientMsgNo客户端消息ID*@parammessageContent消息module将本地地址保存在messageContent中*@paramisRefreshUI是否通知UI刷新对应消息*/WKIM.getInstance().getMsgManager().updateContent(StringclientMsgNo,WKMessageContentmessageContent,booleanisRefreshUI);Kotlin
本地扩展就是消息对象WKMsg中的localExtraMap字段
/***修改消息本地扩展**@paramclientMsgNo客户端ID*@paramhashExtra扩展字段*/WKIM.getInstance().getMsgManager().updateLocalExtraWithClientMsgNo(StringclientMsgNo,HashMap
/***保存远程扩展*@paramchannel某个channel信息*@paramlist远程扩展数据*/WKIM.getInstance().getMsgManager().saveRemoteExtraMsg(WKChannelchannel,List
/***修改编辑内容*@parammsgID消息服务器ID*@paramchannelID频道ID*@paramchannelType频道类型*@paramcontent编辑后的内容*/WKIM.getInstance().getMsgManager().updateMsgEdit(StringmsgID,StringchannelID,bytechannelType,Stringcontent);Kotlin
WKIM.getInstance().msgManager.updateMsgEdit(msgID,channelID,channelType,content)更改sdk消息编辑内容后需将编辑后的内容上传到服务器,则需要监听上传消息扩展
//监听上传消息扩展WKIM.getInstance().getMsgManager().addOnUploadMsgExtraListener(newIUploadMsgExtraListener(){@OverridepublicvoidonUpload(WKMsgExtramsgExtra){//上传到自己的服务器}});Kotlin
WKIM.getInstance().msgManager.addOnUploadMsgExtraListener(object:IUploadMsgExtraListener{overridefunonUpload(msgExtra:WKMsgExtra){//上传到服务器}})如果自己或者别人编辑了消息,都会触发cmd(命令)消息syncMessageExtra,收到此消息后去同步消息扩展即可app需监听消息更新的事件完成对UI的刷新
在发送消息时,只需将消息正文WKMessageContent中的WKReply对象赋值就能对达到消息回复效果
WKReply对象核心字段
WKIM.getInstance().getMsgManager().addOnSyncMsgReactionListener(newISyncMsgReaction(){@OverridepublicvoidonSyncMsgReaction(StringchannelID,bytechannelType,longmaxSeq){//请求接口获取最新消息回应}});Kotlin
WKIM.getInstance().msgManager.addOnSyncMsgReactionListener{channelID,channelType,maxSeq->//请求接口获取最新消息回应}请求到最新消息回应后将数据设置到sdk
/***保存消息回应*@paramlist回应数据*/WKIM.getInstance().getMsgManager().saveMessageReactions(List
WKIM.getInstance().getMsgManager().addOnRefreshMsgListener("key",newIRefreshMsg(){@OverridepublicvoidonRefresh(WKMsgwkMsg,booleanisEnd){//wkMsg.reactionList最新消息的回应//...刷新UI}});Kotlin
WKMsgSettingsetting=newWKMsgSetting();setting.receipt=1;//开启回执//发送消息WKIM.getInstance().getMsgManager().sendMessage(wkBaseContentMsgModel,setting,channelID,channelType);Kotlin
/***保存同步后的消息扩展*@paramchannel属于某个channel的扩展*@paramlist消息扩展*/WKIM.getInstance().getMsgManager().saveRemoteExtraMsg(WKChannelchannel,List
WKIM.getInstance().msgManager.saveRemoteExtraMsg(channel,list)app需监听消息更新的事件完成对UI的刷新
WKIM.getInstance().getMsgManager().addOnRefreshMsgListener("key",newIRefreshMsg(){@OverridepublicvoidonRefresh(WKMsgwkMsg,booleanisEnd){//wkMsg.remoteExtra.readedCount已读数量//wkMsg.remoteExtra.unreadCount未读数量//...刷新UI}});Kotlin
/***保存消息提醒*@paramlist提醒数据*/WKIM.getInstance().getReminderManager().saveReminders(result);Kotlin
WKIM.getInstance().reminderManager.saveReminders(result)当sdk更新了提醒项,会话提醒会触发最近会话的刷新事件,此时需监听刷新最近会话事件
WKIM.getInstance().getConversationManager().addOnRefreshMsgListener("key",newIRefreshConversationMsg(){@OverridepublicvoidonRefreshConversationMsg(WKUIConversationMsgwkUIConversationMsg,booleanisEnd){//wkUIConversationMsg.getReminderList()最新消息提醒//更新最近会话UI}});Kotlin
WKIM.getInstance().getReminderManager().addOnNewReminderListener("key",newINewReminderListener(){@OverridepublicvoidnewReminder(List
sdk内提供的事件监听分为两种:
1、需要传入key的监听。这类监听可以在多个地方监听数据变化,并且可通过传入的key进行移除监听。如新消息监听和取消监听:
//开始监听WKIM.getInstance().getMsgManager().addOnNewMsgListener("new_msg_key",newINewMsgListener(){@OverridepublicvoidnewMsg(List