Swift

Eventos de chat

Anteriormente, creaste una conversación en la CLI de Vonage y agregaste los dos usuarios a esa conversación. Las conversaciones, modeladas como NXMConversation en el Client SDK, son la forma en que se comunicarán los usuarios. Puede obtener más información sobre las conversaciones en la sección Documentación de la Conversation API. Eventos de chat, o NXMEvent se envían utilizando la conversación que has creado, por lo que para obtener el evento de chat primero tendrás que recuperar la conversación. Para implementar esto, las adiciones a ChatViewController.swift que se muestran en las secciones siguientes.

Añade propiedades para la conversación y los eventos, debajo de la etiqueta conversationTextView:

class ChatViewController: UIViewController {
    ...
    let conversationTextView = UITextView()

    var conversation: NXMConversation?
    var events: [NXMEvent]? {
        didSet {
            processEvents()
        }
    }
    ...
}

Añadir una llamada a la función getConversation al final del viewDidLoad función:

override func viewDidLoad() {
    ...

    getConversation()
}

Añade las funciones para obtener la conversación, los eventos y procesar esos eventos al final del archivo ChatViewController.swift archivo:

class ChatViewController: UIViewController {
    ...
    func getConversation() {
        client.getConversationWithUuid(user.conversationId) { [weak self] (error, conversation) in
            self?.conversation = conversation
            if conversation != nil {
                self?.getEvents()
            }
            conversation?.delegate = self
        }
    }
    
    func getEvents() {
        guard let conversation = self.conversation else { return }
        conversation.getEventsPage(withSize: 100, order: .asc) { (error, page) in
            self.events = page?.events
        }
    }
    
    func processEvents() {
        DispatchQueue.main.async { [weak self] in
            guard let self = self else { return }
            self.conversationTextView.text = ""
            self.events?.forEach { event in
                if let memberEvent = event as? NXMMemberEvent {
                    self.showMemberEvent(event: memberEvent)
                }
                if let textEvent = event as? NXMMessageEvent {
                    self.showTextEvent(event: textEvent)
                }
            }
        }
    }
    
    func showMemberEvent(event: NXMMemberEvent) {
        switch event.state {
        case .invited:
            addConversationLine("\(event.embeddedInfo?.user.name ?? "") was invited.")
        case .joined:
            addConversationLine("\(event.embeddedInfo?.user.name ?? "") joined.")
        case .left:
            addConversationLine("\(event.embeddedInfo?.user.name ?? "") left.")
        case .unknown:
             fatalError("Unknown member event state.")
        @unknown default:
            fatalError("Unknown member event state.")
        }
    }

    func showTextEvent(event: NXMMessageEvent) {
        if let message = event.text {
            addConversationLine("\(event.embeddedInfo?.user.name ?? "A user") said: '\(message)'")
        }
    }

    func addConversationLine(_ line: String) {
        if let text = conversationTextView.text, text.count > 0 {
            conversationTextView.text = "\(text)\n\(line)"
        } else {
            conversationTextView.text = line
        }
    }
}

getConversation utiliza el identificador de conversación de la CLI de Vonage para recuperar la conversación, si tiene éxito getEvents para obtener los eventos de chat. El Client SDK admite la paginación, por lo que para obtener los eventos de chat debe especificar un tamaño de página.

Una vez obtenidos los eventos, son procesados por processEvents. En processEvents hay una conversión de tipo a NXMMemberEvent o un NXMMessageEvent que se añaden al conversationTextView por showMemberEvent y showTextEvent respectivamente. Puede obtener más información sobre los tipos de eventos admitidos en la sección Documentación de la Conversation API.

El Delegado de Conversación

La aplicación también tiene que reaccionar a los eventos en una conversación después de cargar inicialmente por lo que necesita tener ChatViewController ajustarse a NXMConversationDelegate. Al final del archivo, añada:

extension ChatViewController: NXMConversationDelegate {
    func conversation(_ conversation: NXMConversation, didReceive error: Error) {
        NSLog("Conversation error: \(error.localizedDescription)")
    }

    func conversation(_ conversation: NXMConversation, didReceive event: NXMMessageEvent) {
        self.events?.append(event)
    }
}

Cuando se recibe un nuevo evento, éste se añade al archivo events que a su vez inicia de nuevo el procesamiento de los eventos.

Construir y ejecutar

Pulse Cmd + R para construir y ejecutar de nuevo. Después de iniciar sesión verás que ambos usuarios se han unido a la conversación como se esperaba:

Chat interface with connection events