Ausstehende Anrufeinladungen wiederherstellen

Wenn ein Benutzer eine Einladung zu einem eingehenden Anruf erhält und anschließend die Seite aktualisiert (oder die App neu startet), bevor er den Anruf annimmt, kann das Client SDK die Einladung automatisch erneut versenden – ein zusätzlicher API-Aufruf ist dabei nicht erforderlich.

Das funktioniert, weil der Conversation Service ausstehende Ereignisse für etwa 30 Sekunden. Wenn Sie die ID der vorherigen Sitzung an createSession, der Server spielt diese Ereignisse in der neuen Sitzung nach, und die callInvite Ereignis (oder onCallInvite (Delegat) wird automatisch ausgelöst.

Wie es funktioniert

  1. Die Sitzungs-ID beibehalten zurückgegeben von createSession (z. B. in sessionStorage im Internet oder UserDefaults / SharedPreferences (auf dem Handy).
  2. Bei der nächsten Ladung, die gespeicherte Sitzungs-ID abrufen und an createSession.
  3. Registrieren Sie den Invite-Listener, bevor Sie den Aufruf ausführen createSession damit es bereits vorhanden ist, wenn anstehende Ereignisse ausgelöst werden.

Warnung: Der Conversation-Dienst speichert ausstehende Ereignisse etwa 30 Sekunden lang. Ist seit dem Eingang der ursprünglichen Einladung mehr Zeit vergangen, wird sie nicht erneut zugestellt.

Randfälle

  • Das Zeitfenster ist abgelaufen: Wenn das 30-Sekunden-Zeitfenster abgelaufen ist, createSession gelingt dennoch – Sie erhalten eine gültige Sitzung, aber die ausstehende Einladung wird nicht erneut zugestellt. Der Anrufer wird bis dahin entweder das Zeitlimit überschritten oder den Anruf abgebrochen haben.
  • Ungültige Sitzungs-ID: Ist die gespeicherte Sitzungs-ID ungültig oder gehört sie zu einem anderen Benutzer, ignoriert das SDK sie und erstellt eine neue Sitzung. Ausstehende Ereignisse werden nicht nachgestellt.
  • App beendet vs. Seitenaktualisierung: Im Internet, sessionStorage wird beim Schließen des Tabs gelöscht, sodass dieses Muster für Aktualisierungen innerhalb des Tabs funktioniert. Bei einem Neustart der mobilen App sollte die Sitzungs-ID in einem dauerhaften Speicher gespeichert werden (UserDefaults / SharedPreferences).

Beispiel

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);
     }];
 }