Quickblox iOS-消息未读取



我遇到了一个问题,即消息在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];

我希望我回答了你的问题:)

快乐编码:)

最新更新