我在做一个类似微信公众号这种形式的东西,需求是这样的

实时聊天,用公众号的形式。

创建系统对话,有多人(一个班多个老师)可以通过这个系统对话给绑定的用户发消息(发作业),用户(家长)可以给公众号发消息(交作业),但是只能收到公众号发来的消息(收作业)。公众号可以收到所有绑定用户发来的消息。

看了文档,发现系统对话可以满足我的需求。查了reset api,对它的使用有一些问题。

最重要的问题

首先,关于对话内容

我看了Tom&Jerry的demo,我很想知道他们的对话内容存放在了哪里?后台的存储/数据表中并没有聊天记录内容,难道说聊天记录对后台是不可见的吗?

其次,关于对话的记录机制--_Conversation表

就像Tom&Jerry,两个相同的用户的对话 是只有唯一的object_Id,还是每发一条消息就产生一个对话(在_Conversation表中产生一条新的记录)?

一,使用reset api获取对话的聊天记录,是否需要用户先登录 保持在线状态。

我看到reset api 有登录api:https://leancloud.cn/docs/rest_api.html#登录,这个登录不是长连接,用户不是在线状态,其意义是什么?

二、通过reset api创建系统对话,创建之后如何通过该对话给用户发消息?

找到以下的资料,
* 开发者可以通过 REST API 以系统对话的渠道给指定的用户发消息
https://leancloud.cn/docs/realtime_rest_api.html#给系统对话发消息3
利用 REST API 给通过系统对话给用户发消息时,除了 conv_id 需要设置为对应系统对话的 ID 以外,还需要设置 to_peers(数组)指定实际接收消息的 Client ID。
目前你可以在一次调用中传入至多 20 个 Client ID。

三、用户如何给系统(公众号)发消息?

四、用户和公众号如何获取与对方的聊天记录

用户只获得自己与公众号的记录,公众号获得与所有绑定用户的消息记录

https://leancloud.cn/docs/realtime_rest_api.html#获取系统对话中某个特定用户与系统的消息记录3
将md5作为convid,在请求体中传过去就好了吗?
我没有登录,这是 401: unauthorized的错误返回的原因吗?

你好,

聊天记录是会存储的,只是目前没有在控制台里体现出来。聊天记录可以通过 REST API 获取,这并不要求用户在线;在线的用户可以通过 SDK 的相关接口拉取到聊天记录:
https://leancloud.cn/docs/realtime_rest_api.html#%E8%8E%B7%E5%8F%96%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%957
例如在 Android 上:
https://leancloud.cn/docs/realtime_guide-android.html#%E8%81%8A%E5%A4%A9%E8%AE%B0%E5%BD%954

对话的原理是创建一次即可,之后发送的消息都和这个对话关联起来。如果你使用系统对话,只需要为每个公众号创建一个系统对话即可。

用户给公众号发消息可以直接通过 SDK 发送,系统对话和普通对话在 SDK 中是完全一样的对话,用户只要在这个对话上发送消息就可以了。公众号给用户发送消息需要通过 REST API 实现:
https://leancloud.cn/docs/realtime_rest_api.html#%E9%80%9A%E8%BF%87_REST_API_%E5%8F%91%E6%B6%88%E6%81%AF9

公众号与用户的聊天记录可以从 REST API 获取,其中的参数“对话 id“需要以一个规则来构建,详见:
https://leancloud.cn/docs/realtime_rest_api.html#%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%AF%B9%E8%AF%9D%E4%B8%AD%E6%9F%90%E4%B8%AA%E7%89%B9%E5%AE%9A%E7%94%A8%E6%88%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%958

除此以外,你还可以通过 _SysMessage 表查到用户发给公众号的所有消息:
https://leancloud.cn/docs/realtime_v2.html#%E7%B3%BB%E7%BB%9F%E5%AF%B9%E8%AF%9D%E6%B6%88%E6%81%AF%E7%BB%93%E6%9E%844

返回 401 可能是你的 appid/appkey 没有正确设置

1 人赞了这个帖子.

非常感谢您的回答,它对我很有帮助!

我检查了我的appid/appkey没有错,以下是我的代码

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];

[manager.requestSerializer setValue:@"LktD7tobdMivDjYLbjSQwvlw-gzGzoHsz" forHTTPHeaderField:@"X-LC-Id"];
[manager.requestSerializer setValue:@"yqKbIRsjysrJjiigtJLaKGQI" forHTTPHeaderField:@"X-LC-Key"];

//加不加paramDict这个参数 返回错误都一样
NSDictionary *paramDict = @{@"objectId":@"56720e3600b01b78ac0b7753"};

NSString *urlStr = @"https://leancloud.cn/1.1/rtm/messages/logs";
[manager GET:urlStr parameters:paramDict success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
    NSLog(@"%@", responseObject);
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
    NSLog(@"%@", error);
}];

以下是错误信息

2015-12-17 15:28:22.885 InstanceMessaging[1031:348808] Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unauthorized (401)" UserInfo={com.alamofire.serialization.response.error.response= { URL: https://leancloud.cn/1.1/rtm/messages/logs?objectId=56720e3600b01b78ac0b7753 } { status code: 401, headers {
"Cache-Control" = "no-cache,no-store";
"Content-Length" = 48;
"Content-Type" = "application/json;charset=utf-8";
Date = "Thu, 17 Dec 2015 07:28:19 GMT";
Pragma = "no-cache";
Server = nginx;
} }, NSErrorFailingURLKey=https://leancloud.cn/1.1/rtm/messages/logs?objectId=56720e3600b01b78ac0b7753, com.alamofire.serialization.response.error.data=<7b22636f 6465223a 3430312c 22657272 6f72223a 226d7573 74207573 65206d61 73746572 206b6579 20617574 682e227d>, NSLocalizedDescription=Request failed: unauthorized (401)}

你能用文档描述的 curl 的方式尝试调用一下吗?
代码中的库我不太熟悉,不确定会不会缺少了什么

curl的方式 在终端中试过了也是401
curl -X GET -H "X-LC-Id: LktD7tobdMivDjYLbjSQwvlw-gzGzoHsz" -H "X-LC-Key: yqKbIRsjysrJjiigtJLaKGQI" https://leancloud.cn/1.1/rtm/messages/logs
{"code":401,"error":"must use master key auth."}

提示必须使用master key,但是文档中并没有说必须使用master key,也没有master key的使用说明。
ps:设置/应用选项/聊天服务签名认证也是关闭的

你没有提供参数的场景是拉取整个应用范围内的聊天记录,是需要 master key 的
增加一个 convid 参数试一下

好的,谢谢

通过convid确实没有出错
curl -X GET -H "X-LC-Id: LktD7tobdMivDjYLbjSQwvlw-gzGzoHsz" -H "X-LC-Key: yqKbIRsjysrJjiigtJLaKGQI" https://leancloud.cn/1.1/rtm/messages/logs?convid=5672714f60b25b79db29bd7e3
{"code":401,"error":"must use master key auth."}

之前一直不理解convid是什么,刚刚试了下objectId请求到数据了。
文档中是不是没有convid即objectid的说明?