2016-10-19 9 views
1

Я использую QuickBlox-iOS SDK для общения. Вход/регистрация работает отлично. Кроме того, я могу отправить сообщение, но метод делегатаchatDidReceiveMessage метод не называется QuickBlox

- (void)chatDidReceiveMessage:(QBChatMessage *)message;

не вызывался. Вот код, который я использую для настройки чата. Добавление следующий код в AppDelegate:

// connect to Chat 
    [[QBChat instance] addDelegate:self]; 

    QBUUser *currentUser = [QBUUser user]; 
    currentUser.ID = [Global sharedInstance].currentUser.ID; 
    currentUser.password = @"password"; 
    [[QBChat instance] connectWithUser:currentUser completion:^(NSError * _Nullable error) { 
     NSLog(@"connect to chat error %@",error); 
    }]; 

И ниже код, я использую, чтобы отправить сообщение:

QBChatMessage *message = [QBChatMessage message]; 
message.recipientID=[Global sharedInstance].QBUserID; 
      message.senderID=[Global sharedInstance].currentUser.ID; 
      [message setText:messageTextView.text]; 

      message.dateSent = [NSDate date]; 
      NSMutableDictionary *params = [NSMutableDictionary dictionary]; 
      params[@"save_to_history"] = @YES; 
      [message setCustomParameters:params]; 
      [QBRequest createMessage:message successBlock:^(QBResponse *response, QBChatMessage *createdMessage) { 
       NSLog(@"success: %@", createdMessage); 
      } errorBlock:^(QBResponse *response) { 
       NSLog(@"ERROR: %@", response.error); 
      }] 

Я проверил на QuickBlox приборной панели. Он показывает все отправленные/полученные сообщения. Но делегат не вызывается, когда я отправляю сообщение другому пользователю. Я не использую никаких дополнительных классов услуг (QMServices), как они используют в своем примере Project. Любая помощь будет оценена по достоинству. Спасибо

ответ

3

Я не понимаю, почему вы используете метод [QBRequest createMessage:successBlock:errorBlock:] для отправки сообщений другому пользователю.

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

QBChatDialog *dialog = [[QBChatDialog alloc] initWithDialogID:nil 
                 type: QBChatDialogTypePrivate]; 
dialog.occupantIDs = @[@([Global instance].QBUserID), 
         @([Global instance].currentUser.user.ID)]; 

После этого, вы можете вызвать метод Quickblox создать диалог на серверах:

if (dialog.ID == nil) { 
    [QBRequest createDialog:dialog successBlock:^(QBResponse *response, QBChatDialog *createdDialog) { 

     [self sendMessageToDialog: dialog withText:@"Hello friend!"]; 

    } errorBlock:^(QBResponse *response) { 
     NSLog(@"dialog creation err: %@", response); 
    }]; 
} 

Создать сообщение:

- (QBChatMessage *) createMessageWithText: (NSString *)text andDialog: (QBChatDialog*)dialog { 
    QBChatMessage *message = [QBChatMessage message]; 
    message.text = text; 
    message.senderID = [Global instance].currentUser.ID; 
    message.markable = YES; 
    message.deliveredIDs = @[@([Global instance].currentUser.ID)]; 
    message.readIDs = @[@([Global instance].currentUser.ID)]; 
    message.dialogID = dialog.ID; 
    message.dateSent = [NSDate date]; 
    message.recipientID = dialog.recipientID; 
    message.customParameters = [NSMutableDictionary dictionary]; 

    message.customParameters[kQMCustomParameterDialogID] = dialog.ID; 
    message.customParameters[kQMCustomParameterDialogType] = [NSString stringWithFormat:@"%lu",(unsigned long)dialog.type]; 
    message.customParameters[@"application_id"] = @"<your-application-id>"; 
    message.customParameters[@"save_to_history"] = @"1"; 

    if (dialog.lastMessageDate != nil){ 
     NSNumber *lastMessageDate = @((NSUInteger)[dialog.lastMessageDate timeIntervalSince1970]); 
     message.customParameters[kQMCustomParameterDialogRoomLastMessageDate] = [lastMessageDate stringValue]; 
    } 
    if (dialog.updatedAt != nil) { 
     NSNumber *updatedAt = @((NSUInteger)[dialog.updatedAt timeIntervalSince1970]); 
     message.customParameters[kQMCustomParameterDialogRoomUpdatedDate] = [updatedAt stringValue]; 
    } 

    return message; 
} 

А затем отправить сообщение в диалоговом окне:

- (void) sendMessageToDialog: (QBChatDialog *)dialog withText: (NSString *)text { 

    QBChatMessage *message = [[ChatService shared] createMessageWithText:text andDialog:self.dialog]; 

    [dialog sendMessage:message completionBlock:^(NSError * _Nullable error) { 
     if (error != nil) { 
      NSLog(@"error creating message %@", error); 
     } else { 
      NSLog(@"message sent!"); 
     } 
    }]; 
} 

Я думаю, что после этого потока вы сможете получить обратный вызов через делегата.

EDIT - я забыл упомянуть о consts я использовал в коде выше:

NSString const *kQMCustomParameterDialogID = @"dialog_id"; 
NSString const *kQMCustomParameterDialogRoomName = @"room_name"; 
NSString const *kQMCustomParameterDialogRoomPhoto = @"room_photo"; 
NSString const *kQMCustomParameterDialogRoomLastMessageDate = @"room_last_message_date"; 
NSString const *kQMCustomParameterDialogUpdatedDate = @"dialog_updated_date"; 
NSString const *kQMCustomParameterDialogType = @"type"; 
NSString const *kQMCustomParameterDialogRoomUpdatedDate = @"room_updated_date"; 
+0

Спасибо за ответ. Что это за константы 'kQMCustomParameterDialogID',' kQMCustomParameterDialogRoomUpdatedDate', 'kQMCustomParameterDialogRoomLastMessageDate',' kQMCustomParameterDialogType'? –

+0

Спасибо. Теперь делегат получает вызов. но сообщение не сохраняется в истории на панели управления. Он появляется в последнем сообщении. Но при нажатии на историю просмотров. Сообщение там не отображается. Я не хочу, чтобы данные ядра пользователя были в моем приложении. –

+0

@SushilSharma Переменная, которая управляет историей, представляет собой настраиваемый параметр 'save_to_history', в этом примере я помещаю его туда. Вы удалили какой-либо пользовательский параметр? – gaskbr

0

Вы добавили <QBChatDelegate> в свой .h файл.

+0

да я добавил его в классе реализации. –

+0

Бро, проверьте эту ссылку: http://stackoverflow.com/questions/33697942/voidchatdidreceivemessageqbchatmessage-message-not-working –

+0

Спасибо за ответ. Я попробовал метод, указанный в ответе. но это не сработало. Используя метод sendMessage, я даже не могу отправить сообщение. –