即时通讯常见问题

Q:IM的开源地址是什么?
A:
Android:bmob-android-im-sdk
iOS : bmob-iOS-im-sdk


Q:为什么我的手机接收不到信息
A:请先在Web后台配置包名或者证书。


Q:消息推送的时候我没开启网络,在推送一段时间后再开启网络,会收到消息吗?
A:在断网开始的一分钟内发的消息是接收不到的,因为心跳包的默认时间是一分钟,这一分钟内,服务器不认为该链接是断开的,所以消息不会保存成离线消息。


Q:Bmob可以做群聊吗?
A:可以利用数据实时同步来实现群聊。

思路可以这样:

1.创建一个群聊表,包括 群组id信息 发送人信息 聊天信息,这里可以把所有的聊天内容放进去;
2.创建一个群组信息表,包括 群组用户列表 创建时间 群组名称等;
3.创建一个群组信息变更表,包括 群组id信息,用一个字段记录有消息新增;

当有人在群组中发起聊天时,首先先往群聊表中新增一条记录,然后往群组信息表更表中更新一下记录。所有群组的人都监听自己群组对应的群组信息表更表的几行。


Q:为什么发送位置的时候定位不了
A:
1.如果你是直接用demo里面的bin目录下的apk的话,是不存在这个问题的。
2.如果你是下载demo之后直接运行的话,需要去重新去百度地图官网申请key,因为demo里面的可以是和我的eclipse绑定在一起的,相信做过百度地图开发的知道这是为什么。

Q:我想实现私信功能 应该用IM来实现吗
A:有两种方案:
1.使用IM实现
2.如果私信功能对实时信要求并不是很高,那么也可以将聊天记录放在表中,并且采用定时拉取的方法。


Q:im sdk支持群聊活着广播消息么?
A:SDK内部暂时还没有实现群聊部分,只是在内部预留了相关的接口,方便后续开发而已。


Q:android新版IM不支持好友管理?
A:新版IM不同于旧版IM,不再提供与用户相关的操作了,比如登录、注册、好友管理相关的。开发者可以自行实现


Q:用自己的key运行新版BmobIMDemo,IM通讯的各种消息的数据库表在哪?(IM即使通讯的注册数据是保存在哪里,BmobIM里面的聊天数据储存在哪个数据库

A:目前新版IM是没有将发送的消息存储到Bmob后台的,开发者可自行选择存储,sdk的聊天消息都是本地存储的


Q:不论对方是否为我的好友,开启聊天的方式都是BmobIM.getInstance().startPrivateConversation()吗

意思是说好友和陌生人开启聊天的方式都是一样的?只是好友在聊天列表里方便查找?

那陌生人的好友的区别在哪里? 可以在聊天界面的标题 设置类似qq的添加好友吗?
A:只有会话的概念,没有好友的概念,新版的IM好友管理需要开发者自行实现。


Q:Unity使用Android和iOS的IM的SDK,可以实现即时通讯么?
A:Unity支持调用android和iOS和IMSDK,可以实现


Q:Bmob Im 是采用什么协议?
A:基于TCP的自定义协议。


Q:新版本IM兼容老版本吗?
A:不兼容,新版IM采用全新的协议实现。


Q:利用数据同步功能实现群聊
答:用数据实时同步实现群聊的思路可以这样:

1.创建一个群聊表,包括 群组id信息 发送人信息 聊天信息,这里可以把所有的聊天内容放进去
2.创建一个群组信息表,包括 群组用户列表 创建时间 群组名称等
3.创建一个群组信息变更表,包括 群组id信息,用一个字段记录有消息新增

当有人在群组中发起聊天时,首先先往群聊表中新增一条记录,然后往群组信息表更表中更新一下记录。所有群组的人都监听自己群组对应的群组信息表更表的几行。

热心的用户实现了一个Android基于Bmob群聊功能的实现


Q:怎样用邮箱查找用户?

参考查找用户那部分的代码:(如果希望邮箱是唯一的话,还需要在Web后台指定email字段是唯一键)

查询用户
查询用户和查询普通对象一样,只需指定BmobUser类即可,如下:

  1. BmobQuery<BmobUser> query = new BmobQuery<BmobUser>();
  2. query.addWhereEqualTo("email", "heshaoyue@bmob.cn");
  3. query.findObjects(this, new FindListener<BmobUser>() {
  4. @Override
  5. public void onSuccess(List<BmobUser> object) {
  6. // TODO Auto-generated method stub
  7. //这里得到的就是用户信息
  8. toast("查询用户邮箱成功:"+object.size());
  9. }
  10. @Override
  11. public void onError(int code, String msg) {
  12. // TODO Auto-generated method stub
  13. toast("查询用户失败:"+msg);
  14. }
  15. });

Q:关于离线消息的推送机制问题
为什么我们离线能接受到消息呢?我们登陆的时候是不是因为服务器知道我们的帐号id再某个地方登陆了,就把消息推送到那个设备上,那么我们离线的时候下次再上线能接受到消息是怎么做到的?
A:离线消息这个需要服务端支撑的,服务端在向特定用户(设备)下发消息的时候,会去检测下当前用户的客户端连接是否正常,如果连接已经关闭了,表明该设备下线或者处于关机状态,此时服务端会将发给该用户的所有消息凑存在一个数组中,之后在等该用户上线(重新建立连接)的时候,服务器会再将这些离线消息按照时间先后顺序依次下发给该用户。


Q:使用了IM组件,推送怎么搞?
A:最新版本的IM不需要再使用推送,如果需要在用户离线时使用推送功能,可以直接使用推送sdk推送内容。


Q:为什么IM组件在有的手机上可以接受到聊天推送,有的手机上就接收不到呢?
A:有一些定制过的机器,比如小米、魅族这些,你根据系统的情况做一下处理。


Q:一个用户发送消息,另一个用户怎么知道他发送消息了。里面的工作原理是什么
A:首先,两个用户对应的终端都跟Bmob服务器保持了一个心跳长连接服务,这样的话,终端和服务器端就可以双通道通讯了。

接着,一个用户发送消息给另外一个用户,消息首先到Bmob服务器,Bmob服务器根据消息的内容体判断是发给哪个终端,然后再把消息发送下去。

整个的工作原理就是:websocket长连接。


Q:关于 BmobRealTimeData 的几个问题
1.isConnected() 的返回结果是实时更新的吗?比如用户本来连接成功,但是过一会儿没有网络了,再调用该函数是不是会返回false?
2.失去网络连接,然后又恢复网络连接后,BmobRealTimeData 实例会不会自动重连?
3.这个是基于长连接的吗?耗电情况如何?

A:
1.实时的,没有网络返回false.
2.会自动重连
3.长连接, websocket,不会怎么耗电,你可以自行测试下


Q:在IMSDK中如何获得用户的状态(在线,或下线,无打扰,等)
A:可以定时(比如5分钟)更新一下用户表,这样就可以通过用户表的updatedAt和当前时间的比较,知道用户是否在线了。


Q:BmobI’M2.0 有没有系统消息功能
A:没有,需要用户自行扩展


Q:发送请求添加好友,BmobIMUserInfo 是发送方,还是接收方的信息啊?
A:发送方的信息,SDK内部已经弄好了,给别人发送消息,肯定需要接收方的信息


Q:新版本IM是不是没有附近的人这个功能了
A:新版IM已经不提供这样的功能了,这些功能开发者可以自行封装,新版IM采用的是全新架构,只负责消息的发送和接收,并不再提供与具体业务逻辑相关的API方法