Indicateurs de frappe
Product deprecation notice
Effective April 30th, 2026, Vonage In-App Messaging will no longer be available. Access for new users will be closed, and the service will be discontinued for all existing users.
If you have any questions regarding this product’s discontinuation, please contact your account manager or our support team.
Vue d'ensemble
Ce guide couvre les indicateurs de saisie de texte dans une conversation.
Avant de commencer, assurez-vous que ajouter le SDK à votre application et vous êtes en mesure de créer une conversation.
NOTE: A step-by-step tutorial to build a chat application is available here.
Ce guide s'appuie sur les concepts suivants :
- Événements de conversation -
text:typing:on(commencer à taper) ettext:typing:off(stop typing) événements qui se déclenchent sur une conversation, après que vous ayez été membre
Indicateurs de frappe
Les indicateurs de frappe sont utilisés pour indiquer aux membres de la conversation si un membre est en train de taper un message texte ou non.
Envoi d'événements relatifs à l'état de frappe
Définir l'état de frappe actuel du membre (activé/désactivé) lorsqu'il commence ou arrête de taper un message texte :
// call this when a member starts typing
conversation.startTyping();
// call this when a member stops typing
conversation.stopTyping();
// call this when a member starts typing
conversation.startTyping()
// call this when a member stops typing
conversation.stopTyping()
// call this when a member starts typing
conversation.startTyping();
// call this when a member stops typing
conversation.stopTyping();
conversation.sendStartTyping(completionHandler:)
conversation.sendStopTyping(completionHandler:)
// call this when a member starts typing
[conversation sendStartTyping:^(NSError * _Nullable error) completionHandler];
// call this when a member stops typing
[conversation sendStopTyping:^(NSError * _Nullable error) completionHandler];
Écouter l'état des autres membres
La procédure suivante permet d'écouter les événements de frappe (marche/arrêt) créés par les appels ci-dessus :
conversation.on('text:typing:on', (event) => {
console.log(event.user.name + " is typing");
});
conversation.on("text:typing:off", (event) => {
console.log(event.user.name + " stopped typing");
});
// Option 1: Listen for typing events using NexmoTypingEventListener
conversation.addTypingEventListener(typingEventListener)
// or
// Option 2: Listen for typing events using NexmoMessageEventListener
conversation.addMessageEventListener(messageListener)
private val typingEventListener = NexmoTypingEventListener { typingEvent ->
val typingState = if(typingEvent?.state == NexmoTypingState.ON) "typing" else "not typing"
Timber.d("User ${typingEvent.fromMemberId} is $typingState")
}
private val messageListener = object : NexmoMessageEventListener {
override fun onTypingEvent(typingEvent: NexmoTypingEvent) {
val typingState = if(typingEvent.state == NexmoTypingState.ON) "typing" else "not typing"
Log.d("TAG", "User ${typingEvent.fromMemberId} is $typingState")
}
override fun onAttachmentEvent(attachmentEvent: NexmoAttachmentEvent) {}
override fun onTextEvent(textEvent: NexmoTextEvent) {}
override fun onSeenReceipt(seenEvent: NexmoSeenEvent) {}
override fun onEventDeleted(deletedEvent: NexmoDeletedEvent) {}
override fun onDeliveredReceipt(deliveredEvent: NexmoDeliveredEvent) {}
}
// Option 1: Listen for typing events using NexmoTypingEventListener
conversation.addTypingEventListener(typingEventListener);
// or
// Option 2: Listen for typing events using NexmoMessageEventListener
conversation.addMessageEventListener(messageListener);
private NexmoTypingEventListener typingEventListener = new NexmoTypingEventListener() {
@Override
public void onTyping(NexmoTypingEvent typingEvent) {
String typingState;
if (typingEvent.getState() == NexmoTypingState.ON) {
typingState = "typing";
} else {
typingState = "not typing";
}
Timber.d("User " + typingEvent.getFromMemberId() + " is " + typingState);
}
};
private NexmoMessageEventListener messageListener = new NexmoMessageEventListener() {
@Override
public void onTypingEvent(@NonNull NexmoTypingEvent typingEvent) {
String typingState;
if (typingEvent.getState() == NexmoTypingState.ON) {
typingState = "typing";
} else {
typingState = "not typing";
}
Log.d("TAG", "User " + typingEvent.getFromMemberId() + " is " + typingState);
}
@Override
public void onTextEvent(@NonNull NexmoTextEvent textEvent) {}
@Override
public void onAttachmentEvent(@NonNull NexmoAttachmentEvent attachmentEvent) {}
@Override
public void onEventDeleted(@NonNull NexmoDeletedEvent deletedEvent) {}
@Override
public void onSeenReceipt(@NonNull NexmoSeenEvent seenEvent) {}
@Override
public void onDeliveredReceipt(@NonNull NexmoDeliveredEvent deliveredEvent) {}
};
Add NXMConversationDelegate as an extension to a ViewController or similar, and implement conversation(_ conversation: NXMConversation, didReceive event: NXMTextTypingEvent):
Note: The first method below is required when implementing NXMConversationDelegate:
extension ViewController: NXMConversationDelegate {
func conversation(_ conversation: NXMConversation, didReceive error: Error) {
NSLog("Conversation error: \(error.localizedDescription)")
}
func conversation(_ conversation: NXMConversation, didReceive event: NXMTextTypingEvent) {
if event.status == .on {
NSLog("Started typing")
} else {
NSLog("Typing ended")
}
}
}
Have a ViewController, or similar, conform to NXMConversationDelegate and implement conversation:didReceiveTypingEvent::
Note: The first method below is required when implementing NXMConversationDelegate:
- (void)conversation:(NXMConversation *)conversation didReceive:(NSError *)error {
NSLog(@"Conversation error: %@", error.localizedDescription);
}
- (void)conversation:(NXMConversation *)conversation didReceiveTypingEvent:(NXMTextTypingEvent *)event {
if (event.status == NXMTextTypingEventStatusOn) {
NSLog(@"Started typing");
} else {
NSLog(@"Typing ended");
}
}