使用腾讯云IM遇到的问题

过年前来记录一下个人在使用腾讯云通信中遇到的问题,本文只说移动端的问题,由于本人是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个问题。在此记录下,也希望对需要的人有所帮助。同时如有说得不对,或者是我使用不当的地方请在评论中指点一下,谢谢!



发布了13 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lanqi_x/article/details/54620172