Récupérer les invitations d'appel en attente
Lorsqu'un utilisateur reçoit une invitation à un appel entrant et qu'il actualise la page (ou redémarre l'application) avant d'y répondre, le Client SDK peut renvoyer automatiquement l'invitation, sans qu'aucun appel API supplémentaire ne soit nécessaire.
Cela fonctionne car le service de conversation stocke les événements en attente pendant environ 30 secondes. Lorsque vous transmettez l'identifiant de session précédente à createSession, le serveur reproduit ces événements dans la nouvelle session et le callInvite (ou onCallInvite (délégué) se déclenche automatiquement.
Comment ça marche
- Conserver l'identifiant de session renvoyée par
createSession(par exemple, danssessionStoragesur Internet, ouUserDefaults/SharedPreferences(sur mobile). - Lors du prochain chargement, récupérer l'identifiant de session enregistré et le transmettre à
createSession. - Enregistrer l'écouteur d'invitation avant l'appel
createSessionde sorte qu’il soit déjà en place lorsque les événements en attente sont déclenchés.
Avertissement : Le service de conversation conserve les événements en attente pendant environ 30 secondes. Si ce délai a été dépassé depuis la réception de l'invitation initiale, celle-ci ne sera pas renvoyée.
Cas limites
- La période de validité a expiré: Si le délai de conservation de 30 secondes est écoulé,
createSessionl'opération aboutit tout de même : vous obtenez une session valide, mais l'invitation en attente n'est pas renvoyée. À ce moment-là, l'appelant aura déjà dépassé le délai d'attente ou aura annulé la demande. - Identifiant de session non valide: Si l'identifiant de session enregistré n'est pas valide ou appartient à un autre utilisateur, le SDK l'ignore et crée une nouvelle session. Aucun événement en attente n'est rejoué.
- Fermeture de l'application vs actualisation de la page: Sur le Web,
sessionStorageest effacé à la fermeture de l'onglet ; ce modèle fonctionne donc pour les actualisations au sein d'un onglet. En cas de redémarrage de l'application mobile, conservez l'identifiant de session dans un espace de stockage durable (UserDefaults/SharedPreferences).
Exemple
client.on('callInvite', (callId, from) => {
console.log(`Received call invite ${callId} from ${from}`);
});
const previousSessionId = store.getSessionId();
try {
const sessionId = previousSessionId
? await client.createSession(jwt, previousSessionId)
: await client.createSession(jwt);
store.saveSessionId(sessionId);
console.log(`Session ready: ${sessionId}`);
} catch (error) {
console.error('Failed to create/reconnect session', error);
}
client.setCallInviteListener { callId, from, channelType ->
println("Received call invite $callId from $from on $channelType")
}
val previousSessionId = store.getSessionId()
if (previousSessionId != null) {
client.createSession(jwt, previousSessionId) { error, sessionId ->
if (error != null) {
println("Failed to reconnect session: $error")
return@createSession
}
sessionId?.let(store::saveSessionId)
println("Reconnected session: $sessionId")
}
} else {
client.createSession(jwt) { error, sessionId ->
if (error != null) {
println("Failed to create session: $error")
return@createSession
}
sessionId?.let(store::saveSessionId)
println("Session created: $sessionId")
}
}
client.setCallInviteListener((callId, from, channelType) -> {
System.out.println(
"Received call invite " + callId + " from " + from + " on " + channelType
);
return null;
});
String previousSessionId = store.getSessionId();
if (previousSessionId != null) {
client.createSession(jwt, previousSessionId, (error, sessionId) -> {
if (error != null) {
System.out.println("Failed to reconnect session: " + error);
return null;
}
if (sessionId != null) {
store.saveSessionId(sessionId);
}
System.out.println("Reconnected session: " + sessionId);
return null;
});
} else {
client.createSession(jwt, null, (error, sessionId) -> {
if (error != null) {
System.out.println("Failed to create session: " + error);
return null;
}
if (sessionId != null) {
store.saveSessionId(sessionId);
}
System.out.println("Session created: " + sessionId);
return null;
});
}
class InviteDelegate: NSObject, VGVoiceClientDelegate {
func voiceClient(_ client: VGVoiceClient, didReceiveInviteForCall callId: VGCallId, from caller: String, with type: VGVoiceChannelType) {
print("Received call invite \(callId) from \(caller)")
}
func voiceClient(_ client: VGVoiceClient, didReceiveHangupForCall callId: VGCallId, withQuality callQuality: VGRTCQuality, reason: VGHangupReason) {}
func voiceClient(_ client: VGVoiceClient, didReceiveInviteCancelForCall callId: VGCallId, with reason: VGVoiceInviteCancelReason) {}
func client(_ client: VGBaseClient, didReceiveSessionErrorWith reason: VGSessionErrorReason) {}
}
let delegate = InviteDelegate()
client.delegate = delegate
if let previousSessionId = store.getSessionId() {
client.createSession(jwt, sessionId: previousSessionId) { error, sessionId in
guard error == nil, let sessionId = sessionId else {
print("Failed to reconnect session: \(error?.localizedDescription ?? "unknown")")
return
}
store.saveSessionId(sessionId)
print("Reconnected session: \(sessionId)")
}
} else {
client.createSession(jwt) { error, sessionId in
guard error == nil, let sessionId = sessionId else {
print("Failed to create session: \(error?.localizedDescription ?? "unknown")")
return
}
store.saveSessionId(sessionId)
print("Session created: \(sessionId)")
}
}
self.store = store;
client.delegate = self;
NSString *previousSessionId = [store getSessionId];
if (previousSessionId != nil) {
[client createSession:jwt sessionId:previousSessionId callback:^(NSError * _Nullable error, NSString * _Nullable sessionId) {
if (error != nil || sessionId == nil) {
NSLog(@"Failed to reconnect session: %@", error);
return;
}
[store saveSessionId:sessionId];
NSLog(@"Reconnected session: %@", sessionId);
}];
} else {
[client createSession:jwt callback:^(NSError * _Nullable error, NSString * _Nullable sessionId) {
if (error != nil || sessionId == nil) {
NSLog(@"Failed to create session: %@", error);
return;
}
[store saveSessionId:sessionId];
NSLog(@"Session created: %@", sessionId);
}];
}