Quickblox iOS - 消息未读

时间:2016-05-14 18:36:22

标签: ios objective-c quickblox

我遇到了Quickblox中没有标记为已读取的消息的问题,即使这些消息确实正在被读取。

是否有一种简单的方法可以在最近的Quickblox iOS SDK中标记对话框中的所有消息?

1 个答案:

答案 0 :(得分:2)

Quickblox不会自动处理消息的读取状态:)为了保持消息的读取状态,客户端应用程序也必须合作:)

为了接收读取状态,您发送的所有预期读取状态的消息必须标记为可标记:)

以下是QB docs的示例代码

QBChatMessage *message = [QBChatMessage markableMessage];
[message setText:@"Hi there!"];
[message setRecipientID:1022725];

假设用户1将Hi发送给用户2 :)现在用户2的设备中的代码应该通知用户2已经看到或读取了给quickblox服务器的消息:)告知Quickblox的读取状态来自特定QBChatMessage的服务器,QB服务器向用户1发出通知,告知用户2已阅读该消息:)

收到消息后,用户2应使用

通知QB服务器有关状态
if([message markable]){
        [[QBChat instance] readMessage:message completion:^(NSError * _Nullable error) {

        }];
    }

一旦用户2通知QB服务器有关读取状态,QB服务器就会向User1发送通知,确认相同,可以使用以下方式捕获:)

- (void)chatDidReadMessageWithID:(NSString *)messageID dialogID:(NSString *)dialogID readerID:(NSUInteger)readerID
{

}

一旦收到特定QBChatMessage的读取状态,您就可以更新UI以显示该消息的已显示状态:)

提示

现在您可能已经注意到,读取状态在每个消息的基础上工作,这可能非常令人恼火,并导致复杂的逻辑,当您使用

[QBRequest messagesWithDialogID:@"54fda689535c125b0700bbfa" extendedRequest:nil forPage:resPage successBlock:^(QBResponse *response, NSArray *messages, QBResponsePage *responcePage) {

} errorBlock:^(QBResponse *response) {
    NSLog(@"error: %@", response.error);
}];

如此简单的解决方案是:

不是将读取状态逐个发送到数组中的所有消息,而是当用户点击对话框以查看其中的消息时,您可以发送看到的消息,以便持续显示消息:)

一旦用户进入聊天屏幕,属于该dalog的所有消息都将被视为已读(这是所有消息应用程序包括whatsApp的行为)

因此,仅在最后一条消息上发送状态是有道理的:)在收到特定消息的显示状态时,您将所看到的状态更改为发送日期小于收到所见状态的消息的所有消息:)< / p>

修改

无论如何都说有些情况你需要将读取状态发送到属于特定对话框的所有消息,因为你的未读消息数量也取决于读取状态:)

例如,如果您想将特定对话框的未读消息计数从100更新为0,那么不建议将所见状态发送给所有100:)

您可以使用此API。文档清楚地说(我也在我的应用程序中使用它)你可以将读取状态设置为属于特定对话框的所有消息,只是不发送消息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

这是docs的链接:)  http://quickblox.com/developers/Chat#Update_message

您所要做的就是

1&GT;打电话给api&#34; https://api.quickblox.com/chat/Message&#34;

注意 53aabe15e4b077ddd43e7fd3是您的消息ID :)如果您想将所见的状态发送到属于特定对话框的所有消息,请不要将其附加到URL:)

2&gt;在标题字段中发送Content-Type:application / json和QB-Token:current_user_token

3&gt;并且在正文中请发送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];

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

快乐编码:)