首页 > 编程知识 正文

腾讯云 im,腾讯云通信im

时间:2023-05-05 13:49:39 阅读:279147 作者:2519

过年前来记录一下个人在使用腾讯云通信中遇到的问题,本文只说移动端的问题,由于本人是android开发的,所以以下出现腾讯API以android的为主,但ios也是对应方法名。

如有说得不对,或者是我使用不当的地方请在评论中指点一下,谢谢!本文地址:http://blog.csdn.net/lanqi_x/article/details/54620172

1、 官网中的SDK API文档不是最新的,类、方法不全,请下载sdk解压后里面的文档,ios和android都一样。 2、  初始化

在登录前,请将文档中的初始化部分的事件监听给加上


目的就是为了登录后可以立即获得新消息,以防消息漏接,最重要的千万别忘了在登录前进行sdk初始化,TIMManager.getInstance().init(context);缺少这一句,程序就会崩溃。

事件监听中需要注意的是消息监听器public void addMessageListener(TIMMessageListener listener);我看他的内部是放了一个消息监听器数组的,就是你add多少个都会进行回调,如果你有多种回调处理,但同一个时刻只要一种回调处理,那么在add之前,请将之前的监听器移除掉,方法public void removeMessageListener(TIMMessageListener listener);

3、  public void getMessage(int count, TIMMessage lastMsg,TIMValueCallBack<List<TIMMessage>> callback)获取历史消息不全。

原因

(1)一次获取的消息数最多20条,即使参数count你传大于20的值,他返回的最多也只有20条。

(2)默认情况ImSDK会进行消息的存储,在本地有缓存后就会读取本地缓存,官方说法是通过“ImSDK 的 getMessage 接口可以获取漫游消息,如果本地消息全部都是连续的,则不会通过网络获取,如果本地消息不连续,会通过网络获取断层消息”。且腾讯云IM提供的漫游记录默认保存7天,所以在这个时间有接收过的消息会有缓存以后也可以读取得到,但如果是之前未登录的,那么就会获取不到消息了。

(3)这个方法本地有缓存则取缓存且异步的,所以有时是离线消息还没同步下来。解决方法,可以设置同步离线消息回调public void setRefreshListener(TIMRefreshListener listener),getMessage改为在onRefresh()方法中调用 。

 

4、  onRefresh()多次调用

此方法不仅在登录后会调用,在掉线后重新连上线后也会调用。可以在

TIMManager.getInstance().setConnectionListener(newTIMConnListener() { @Override public void onConnected() {//连接建立 Log.e(tag, "connected"); } @Override public void onDisconnected(int code, Stringdesc) {//连接断开 //接口返回了错误码code和错误描述desc,可用于定位连接断开原因 //错误码code含义请参见错误码表 Log.e(tag, "disconnected"); }});

在这两个方法中做标记,来区分当前是否断线,和onRefresh()是否为重新连上线后而调用的,同时也可以利用该标记用来获取掉线期间的历史消息。

5、  最后一条消息重复

在获取历史消息时,有时最新的那一条消息也会在新消息通知onNewMessages收到,个人处理方式是登录后的第一条新消息和历史消息中的最新一条的id进行比较,以此来判断是否重复。

6、  部分消息的getSenderProfile()返回值为null

这部分的消息是由该手机机发出的消息。这是个坑。

ios发送消息

[conversationsendMessage:msg succ:^(){ NSLog(@"SendMsg Succ");}fail:^(intcode, NSString * err) { NSLog(@"SendMsgFailed:%d->%@", code, err);}];

并没有把发送出去的消息返回。所以只能拿自己构建的消息去显示。

Android发送消息

conversation.sendMessage(msg,new TIMValueCallBack<TIMMessage>() {//发送消息回调 @Override public void onError(int code, String desc){//发送消息失败 //错误码code和错误描述desc,可用于定位请求失败原因 //错误码code含义请参见错误码表 Log.d(tag, "send message failed.code: " + code + " errmsg: " + desc); } @Override public void onSuccess(TIMMessage msg) {//发送消息成功 Log.e(tag, "SendMsg ok"); }});

虽然有返回TIMMessage,但其实就是将你给他的原原本本的还给你。

所以自己发出去的消息getSenderProfile()是为null的。

个人处理方法是如果TIMMessage.isSelf()为true就直接显示自己的信息,不去getSenderProfile()。

所以在登录成功后调用public void getSelfProfile(TIMValueCallBack<TIMUserProfile>cb),将自己的个人信息保存下来。

个人觉得登录成功后不将自己的信息返回是个坑,因为getSelfProfile又是一个异步请求。


因为我并没有使用全部功能像什么离线推送,群组管理都没有用,只是利用它来实现简单的即时聊天功能而已,所以目前就这6个问题。在此记录下,也希望对需要的人有所帮助。同时如有说得不对,或者是我使用不当的地方请在评论中指点一下,谢谢!



版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。