Objective-C

Chat-Ereignisse

Zuvor haben Sie in der Vonage CLI eine Konversation erstellt und die beiden Benutzer zu dieser Konversation hinzugefügt. Konversationen, modelliert als NXMConversation Objekte im Client SDK, sind die Kommunikationsmittel der Benutzer. Mehr über Konversationen erfahren Sie in der Conversation API-Dokumentation. Chat-Ereignisse, oder NXMEvent Objekte werden über die von Ihnen erstellte Konversation gesendet. Um ein Chat-Ereignis zu erhalten, müssen Sie also zunächst die Konversation abrufen. Um dies zu implementieren, werden die Zusätze zu ChatViewController.m die in den folgenden Abschnitten aufgeführt sind, erforderlich.

Hinzufügen von Eigenschaften für die Konversation und Ereignisse sowie Konformität mit dem NXMConversationDelegate in der Schnittstelle:

@interface ChatViewController () <UITextFieldDelegate, NXMConversationDelegate> 
...
@property NXMConversation *conversation;
@property NSMutableArray<NXMEvent *> *events;
@end

Fügen Sie einen Funktionsaufruf zu getConversation am Ende der viewDidLoad Funktion:

Fügen Sie die Funktionen zum Abrufen der Konversation, der Ereignisse und der Verarbeitung dieser Ereignisse am Ende der ChatViewController.m Datei:

- (void)getConversation {
    [self.client getConversationWithUuid:self.user.conversationId completion:^(NSError * _Nullable error, NXMConversation * _Nullable conversation) {
        self.conversation = conversation;
        if (conversation) {
            [self getEvents];
        }
        conversation.delegate = self;
    }];
}

- (void)getEvents {
    if (self.conversation) {
        [self.conversation getEventsPageWithSize:100 order:NXMPageOrderAsc completionHandler:^(NSError * _Nullable error, NXMEventsPage * _Nullable events) {
            self.events = [NSMutableArray arrayWithArray:events.events];
            [self processEvents];
        }];
    }
}

- (void)processEvents {
    dispatch_async(dispatch_get_main_queue(), ^{
        self.conversationTextView.text = @"";
        for (NXMEvent *event in self.events) {
            if ([event isMemberOfClass:[NXMMemberEvent class]]) {
                [self showMemberEvent:(NXMMemberEvent *)event];
            } else if ([event isMemberOfClass:[NXMMessageEvent class]]) {
                [self showTextEvent:(NXMMessageEvent *)event];
            }
        }
    });
}

- (void)showMemberEvent:(NXMMemberEvent *)event {
    switch (event.state) {
        case NXMMemberStateInvited:
            [self addConversationLine:[NSString stringWithFormat:@"%@ was invited", event.embeddedInfo.user.name]];
            break;
        case NXMMemberStateJoined:
            [self addConversationLine:[NSString stringWithFormat:@"%@ joined", event.embeddedInfo.user.name]];
            break;
        case NXMMemberStateLeft:
            [self addConversationLine:[NSString stringWithFormat:@"%@ left", event.embeddedInfo.user.name]];
            break;
        case NXMMemberStateUnknown:
             [NSException raise:@"UnknownMemberState" format:@"Member state is unknown"];
             break;
    }
}

- (void)showTextEvent:(NXMMessageEvent *)event {
    NSString *message = [NSString stringWithFormat:@"%@ said %@", event.embeddedInfo.user.name, event.text];
    [self addConversationLine:message];
}

- (void)addConversationLine:(NSString *)line {
    NSString *currentText = self.conversationTextView.text;
    
    if (currentText.length > 0) {
        self.conversationTextView.text = [NSString stringWithFormat:@"%@\n%@", currentText, line];
    } else {
        self.conversationTextView.text = line;
    }
}

getConversation verwendet die Konversations-ID aus der Vonage CLI, um die Konversation abzurufen, wenn dies erfolgreich ist getEvents wird aufgerufen, um die Chat-Ereignisse abzurufen. Das Client SDK unterstützt die Paginierung, so dass Sie zum Abrufen der Chat-Ereignisse eine Seitengröße angeben müssen.

Sobald die Ereignisse abgerufen sind, werden sie verarbeitet durch processEvents. Unter processEvents gibt es eine Typumwandlung in entweder eine NXMMemberEvent oder eine NXMMessageEvent die dann an die conversationTextView von showMemberEvent und showTextEvent beziehungsweise. Weitere Informationen über die unterstützten Ereignistypen finden Sie in der Conversation API-Dokumentation.

Der Gesprächsdelegierte

Die Anwendung muss auch auf Ereignisse in einer Konversation nach dem anfänglichen Laden reagieren, daher müssen Sie einige Funktionen aus der NXMConversationDelegate. Am Ende der ChatViewController.m Klasse hinzufügen:

@implementation ViewController
    ...

- (void)conversation:(NXMConversation *)conversation didReceiveMessageEvent:(NXMMessageEvent *)event {
    [self.events addObject:event];
    [self processEvents];
}

- (void)conversation:(NXMConversation *)conversation didReceiveMemberEvent:(NXMMemberEvent *)event {
    [self.events addObject:event];
    [self processEvents];
}

- (void)conversation:(NXMConversation *)conversation didReceive:(NSError *)error {
    NSLog(@"Conversation error: %@", error.localizedDescription);
}

Wenn ein neues Ereignis empfangen wird, wird es an die events Array, dann beginnt die Verarbeitung der Ereignisse erneut.

Bauen und Ausführen

Presse Cmd + R zu erstellen und erneut auszuführen. Nach der Anmeldung sehen Sie, dass beide Benutzer wie erwartet der Unterhaltung beigetreten sind:

Chat interface with connection events