[英]Quickblox iOS - Messages Not Read
我遇到問題,即使確實正在閱讀郵件,但消息在Quickblox中沒有被標記為已讀。
有沒有一種簡單的方法可以將對話框中的所有消息標記為在最新的Quickblox iOS SDK中已讀取?
Quickblox不會自行自動處理消息的讀取狀態:)為了保持消息的讀取狀態,客戶端應用程序也必須進行協作:)
為了接收已讀狀態,您發送的所有您希望已讀狀態的消息都必須標記為可標記:)
這是QB文檔中的示例代碼
QBChatMessage *message = [QBChatMessage markableMessage];
[message setText:@"Hi there!"];
[message setRecipientID:1022725];
假設用戶1向用戶2發送了Hi消息:)現在,用戶2的設備中的代碼應通知用戶2已看到或讀取了消息到quickblox服務器:)在通知特定QBChatMessage,QB到Quickblox服務器的讀取狀態時服務器向用戶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);
}];
如此簡單的解決方案是:
與其將讀取狀態一一發送給數組中的所有消息,您可以僅在用戶點擊對話框以查看其中的消息時才將可見消息發送到最后一條消息:)
一旦用戶進入聊天屏幕,所有屬於該日志的消息都將被視為已讀(這就是包括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“ https://api.quickblox.com/chat/Message ”進行Web服務調用
注意 53aabe15e4b077ddd43e7fd3是您的消息ID :)如果要將可見狀態發送給屬於特定對話框的所有消息,請不要將其附加到URL :)
2>在頭字段中發送Content-Type:application / json和QB-Token: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];
我希望我回答了你的問題:)
快樂的編碼:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.