我遇到了一个问题,即消息在Quickblox中没有标记为已读,尽管消息确实正在被读取。
有没有一种简单的方法可以将对话框中的所有消息标记为在最新的Quickblox iOS SDK中读取?
Quickblox不会自动处理消息的读取状态:)为了保持消息的读取状况,客户端应用程序也必须协作:)
为了接收读取状态,您发送的所有预期读取状态的消息都必须标记为可标记:)
这是来自QB文档的示例代码
QBChatMessage *message = [QBChatMessage markableMessage];
[message setText:@"Hi there!"];
[message setRecipientID:1022725];
假设用户1向用户2发送Hi:)现在,用户2设备中的代码应该通知用户2已经看到或阅读了quickblox服务器的消息:)在通过特定的QBChatMessage向quickblox server通知阅读状态时,QB服务器向用户1发送通知,告诉他用户2已经阅读了消息:)
收到消息后,用户2应使用通知QB服务器有关状态
if([message markable]){
[[QBChat instance] readMessage:message completion:^(NSError * _Nullable error) {
}];
}
一旦用户2通知QB服务器读取状态,QB服务器就会向用户1发送通知,确认读取状态,可以使用以下方法捕获:)
- (void)chatDidReadMessageWithID:(NSString *)messageID dialogID:(NSString *)dialogID readerID:(NSUInteger)readerID
{
}
收到特定QBChatMessage的读取状态后,您可以更新UI以显示该消息的查看状态:)
TIP
现在,正如您可能已经注意到的,读取状态是以每条消息为基础工作的,这可能会非常令人恼火,并导致在您使用接收到大量消息时,将读取状态逐一发送到所有消息的复杂逻辑
[QBRequest messagesWithDialogID:@"54fda689535c125b0700bbfa" extendedRequest:nil forPage:resPage successBlock:^(QBResponse *response, NSArray *messages, QBResponsePage *responcePage) {
} errorBlock:^(QBResponse *response) {
NSLog(@"error: %@", response.error);
}];
所以简单的解决方案是:
不需要将读取状态逐个发送到数组中的所有消息,您可以只在用户点击对话框查看其中的消息时发送所看到的消息,直到消息结束:)
一旦用户进入聊天屏幕,属于该日志的所有消息都将被视为已读(这就是包括whatsApp在内的所有消息应用程序的行为)
因此,只向最后一条消息发送可见状态是有意义的:)在收到特定消息的可见状态时,您将可见状态更改为发送日期小于收到可见状态的消息的所有消息:)
编辑
总之,在某些情况下,您只需要将已读状态发送给属于特定对话框的所有消息,因为您的未读消息计数也取决于已读状态:)
例如,如果您想将特定对话框的未读消息计数从100更新为0,因此不建议将已读状态发送到所有100:)
您可以使用此API。Docs明确表示(我也在我的应用程序中使用它),你可以将阅读状态设置为属于特定对话框的所有消息,只是不要发送消息id:)
这是API
curl -X PUT
-H "Content-Type: application/json"
-H "QB-Token: eddf864695d72d33b959eec2ae6c640d817dfada"
-d '{"read": "1", "chat_dialog_id": "53a99a7be4b094c7c6d31b41"}'
https://api.quickblox.com/chat/Message/53aabe15e4b077ddd43e7fd3.json
这是指向文档的链接:)http://quickblox.com/developers/Chat#Update_message
你所要做的就是去
1> 对api进行web服务调用"https://api.quickblox.com/chat/Message"
注意53aabe15e4b077ddd43e7fd3是您的消息id:)如果您想将可见状态发送到属于特定对话框的所有消息,请不要将其附加到URL:)
2> 在标题字段中发送内容类型:application/json和QB令牌:current_user_Token
3> 在正文中,请发送read=1和chat_dialog_id=dialog_id:)
就是这样,属于该对话框的所有消息都将更新为已读消息,因此该对话框的未读消息计数将为0:)
NSURL *url = [NSURL URLWithString:@"https://api.quickblox.com/chat/Message"];
NSMutableURLRequest *mutableRequest=[NSMutableURLRequest requestWithURL:url];
[mutableRequest setHTTPMethod:@"PUT"];
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[mutableRequest setValue:[QBSession currentSession].sessionDetails.token forHTTPHeaderField:@"QB-Token"];
NSString *jsonString=[NSString stringWithFormat:@"{"read": "1", "chat_dialog_id": "%@"}",dialogToSendReadStatus.id];
[mutableRequest setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *uploadTask = [session dataTaskWithRequest:mutableRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error){
DLog(@"Error");
}
else{
DLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
[uploadTask resume];
我希望我回答了你的问题:)
快乐编码:)