2016-05-14 3 views
0

У меня проблема с сообщениями, которые не помечены как прочитанные в Quickblox, даже несмотря на то, что сообщения действительно читаются.Quickblox iOS - Сообщения не прочитаны

Есть ли простой способ отметить все сообщения в диалоговом окне, которые читаются в последнем пакете Quickblox iOS SDK?

ответ

2

Quickblox он не обрабатывает состояние сообщений автоматически на его собственном :) прочитал Для того, чтобы сохранить статус чтения из сообщений клиентских приложений должен сотрудничать, а :)

Для того, чтобы получить статус чтения все сообщения, которые отсылают, для которых вы ожидаете, что статус чтения должен быть отмечен как маркируемый :)

Вот пример кода из QB Docs

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

Предположим, что пользователь 1 посылает Привет пользователю 2 :) Теперь код в U Ser 2 в устройство должно сообщить, что пользователь 2 видел или прочитать сообщение для quickblox сервера :) На информирование о состоянии чтения к серверу Quickblox сюда конкретного QBChatMessage, QB сервер отправляет уведомление пользователя 1, говоря ему, что пользователь 2 Прочитала сообщение :)

При получении сообщения пользователя 2 должен информировать сервер QB о состоянии с помощью

if([message markable]){ 
     [[QBChat instance] readMessage:message completion:^(NSError * _Nullable error) { 

     }]; 
    } 

После User 2 информирует QB сервер о состоянии чтения, QB сервер отправляет уведомление Пользователя1 подтверждающее то же самое, что может быть получены с помощью :)

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

} 

После получения статуса чтения для конкретного QBChatMessage вы можете обновить пользовательский интерфейс, чтобы показать видел статус этого сообщения :)

TIP

Теперь, как вы могли заметить, прочитать статус работы на основе сообщений , это может быть очень раздражает и приводит к сложной логики для отправки чтения статуса для всех сообщений, один за другим, когда вы получаете весь много сообщений с использованием

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

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

Так простое решение:

Вместо того, чтобы посылать статус чтения всех сообщений в массиве по одному вы можете отправить увиденные сообщения только последнее сообщение, когда пользователь вводит в диалоговом окне, чтобы увидеть сообщения внутри него :)

Как только пользователь войдет в экран чатов, все сообщения, принадлежащие этому dalog, будут считаться прочитанными (Thats, как ведут себя все приложения для обмена сообщениями, включая whatsApp)

Таким образом, отправка видимого статуса только в последнее сообщение имеет смысл :) И на получив статус видели для конкретного сообщения, которое вы видели изменения статуса всех сообщений с отправленной датой меньше, чем сообщение, которое получило статус видели :)

EDIT

Во всяком случае все сказанное есть сценарии, где, в которых нужно просто отправить статус чтения всех сообщений, относящихся к конкретному диалогу как ваше непрочитанных количество сообщений зависит от состояния чтения, а :)

Например, если вы хотите обновить непрочитанные сообщения для конкретного диалога как 0 из 100 так что его не advicable отправить видел статус на все 100 :)

вы можете использовать этот API.Docs ясно говорит (и я использую его в моем приложении, а) вы можете установить статус чтения для всех сообщений, относящихся к конкретному диалогу просто не передать идентификатор сообщения :)

Вот в 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> сделать вызов веб-службы УПУ «https://api.quickblox.com/chat/Message»

Уведомление 53aabe15e4b077ddd43e7fd3 Ваш идентификатор сообщения :) Если вы хотите отправить видел статус всех сообщений, относящихся к конкретному диалогу Dont добавить его к URL :)

2> В поле заголовка отправить Content-Type: приложение/JSON и QB-Токен: current_user_token

3> и в теле, пожалуйста, отправить прочитать = 1 и chat_dialog_id = dialog_id :)

Thats это все сообщения, относящиеся к этому диалогу будет обновляться по мере чтения и, следовательно, непрочитанные количество сообщений в диалоговом окне будет 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]; 

Я надеюсь, что я ответил на ваш вопрос :)

Happy кодирования :)