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