Freigeben über


Abonnieren von SDK-Ereignissen

Azure Communication Services SDKs sind dynamisch und enthalten eine Vielzahl von Eigenschaften. Wenn sich diese ändern, möchten Sie als Entwickler vielleicht wissen, wann und vor allem, was sich ändert. So geht's!

Ereignisse im Azure Communication Calling-SDK

In diesem Handbuch werden die verschiedenen Ereignisse oder Eigenschaftenänderungen beschrieben, die Ihre App abonnieren kann. Wenn Sie diese Ereignisse abonnieren, kann Ihre App über Zustandsänderungen im Calling-SDK informiert werden und entsprechend reagieren.

Das Nachverfolgen von Ereignissen ist von entscheidender Bedeutung, da der Status Ihrer Anwendung mit dem Status des ACSCalling-Frameworks synchronisiert werden kann, ohne dass Sie einen Pullmechanismus für die SDK-Objekte implementieren müssen.

In diesem Leitfaden wird davon ausgegangen, dass Sie die Schnellstartanleitung durchlaufen oder eine Anwendung implementiert haben, die Anrufe tätigen und empfangen kann. Wenn Sie den Einstiegsleitfaden nicht abgeschlossen haben, lesen Sie unsere Schnellstartanleitung.

Jedes Objekt im JavaScript-Calling-SDK verfügt über properties und collections. Ihre Werte ändern sich im Laufe der Lebensdauer des Objekts. Verwenden Sie die Methode on(), um Ereignisse von Objekten zu abonnieren, und verwenden Sie die Methode off(), um Ereignisse nicht mehr zu abonnieren.

Eigenschaften

Sie können das '<property>Changed'-Ereignis abonnieren, um Wertänderungen für die Eigenschaft zu überwachen.

Beispiel für ein Abonnement für eine Eigenschaft

In diesem Beispiel abonnieren wir Änderungen am Wert der isLocalVideoStarted-Eigenschaft.

call.on('isLocalVideoStartedChanged', () => {
    // At that point the value call.isLocalVideoStarted is updated
    console.log(`isLocalVideoStarted changed: ${call.isLocalVideoStarted}`);
});

Sammlungen

Sie können das Ereignis „<Auflistung>Updated“ abonnieren, um Benachrichtigungen über Änderungen in einer Objektsammlung zu erhalten. Das Ereignis „<Sammlung>Updated“ wird ausgelöst, wenn Elemente der überwachten Auflistung hinzugefügt oder daraus entfernt werden.

  • Die Nutzdaten des Ereignisses '<collection>Updated' enthalten ein added-Array, das Werte enthält, die der Auflistung hinzugefügt wurden.
  • Die Nutzdaten des Ereignisses '<collection>Updated' enthalten auch ein removed-Array, das Werte enthält, die aus der Auflistung entfernt wurden.

Beispielabonnement für eine Auflistung

In diesem Beispiel abonnieren wir Änderungen an Werten des Call-Objekts LocalVideoStream.

call.on('localVideoStreamsUpdated', updateEvent => {
    updateEvent.added.forEach(async (localVideoStream) => {
        // Contains an array of LocalVideoStream that were added to the call
        // Add a preview and start any processing if needed
        handleAddedLocalVideoStream(localVideoStream )
    });
    updateEvent.removed.forEach(localVideoStream => {
        // Contains an array of LocalVideoStream that were removed from the call
        // Remove the preview and stop any processing if needed
        handleRemovedLocalVideoStream(localVideoStream ) 
    });
});

Ereignisse für das CallAgent-Objekt

Ereignisname: incomingCall

Das incomingCall-Ereignis wird ausgelöst, wenn der Client einen eingehenden Anruf empfängt.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte den Benutzer über den eingehenden Anruf benachrichtigen. Die Benachrichtigungsaufforderung sollte dem Benutzer vorschlagen, den Anruf anzunehmen oder abzulehnen.

Codebeispiel:

callClient.on('incomingCall', (async (incomimgCallEvent) => {
    try {
        // Store a reference to the call object
        incomingCall = incomimgCallEvent.incomingCall; 
        // Update your UI to allow
        acceptCallButton.disabled = false; 
        callButton.disabled = true;
    } catch (error) {
        console.error(error);
    }
});

Ereignisname: callsUpdated

Das callsUpdated-Aktualisierungsereignis wird ausgelöst, wenn ein Anruf entfernt oder dem Anruf-Agent hinzugefügt wird. Dieses Ereignis tritt ein, wenn der Benutzer einen Anruf tätigt, annimmt oder beendet.

Wie sollte Ihre Anwendung auf das Ereignis reagieren? Ihre Anwendung sollte die Benutzeroberfläche basierend auf der Anzahl der aktiven Aufrufe für die CallAgent-Instanz aktualisieren.

Ereignisname: connectionStateChanged

Das connectionStateChanged-Ereignis wird ausgelöst, wenn der Signalstatus von CallAgent aktualisiert wird.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte die Benutzeroberfläche basierend auf dem neuen Zustand aktualisieren. Die möglichen Verbindungsstatuswerte sind Connected und Disconnected.

Codebeispiel:

callClient.on('connectionStateChanged', (async (connectionStateChangedEvent) => {
    if (connectionStateChangedEvent.newState === "Connected") {
        enableCallControls() // Enable all UI element that allow user to make a call
    }

    if (connectionStateChangedEvent.newState === 'Disconnected') {
        if (typeof connectionStateChangedEvent.reason !== 'undefined') {
            alert(`Disconnected reason: ${connectionStateChangedEvent.reason}`)
        } 
        disableCallControls() // Disable all the UI element that allows the user to make a call
    }
});

Ereignisse für das Call-Objekt

Ereignisname: stateChanged

Das stateChanged-Ereignis wird ausgelöst, wenn sich der Aufrufstatus ändert. Beispiel: Wenn ein Anruf von connected zu disconnected wechselt.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte die Benutzeroberfläche entsprechend aktualisieren. und die jeweiligen Schaltflächen und andere UI-Elemente basierend auf dem neuen Anrufstatus aktualisieren.

Codebeispiel:

call.on('stateChanged', (async (connectionStateChangedEvent) => {
  if(call.state === 'Connected') {
      connectedLabel.hidden = false;
      acceptCallButton.disabled = true;
      startCallButton.disabled = true;
      startVideoButton.disabled = false;
      stopVideoButton.disabled = false
  } else if (call.state === 'Disconnected') {
      connectedLabel.hidden = true;
      startCallButton.disabled = false;
      console.log(`Call ended, call end reason={code=${call.callEndReason.code}, subCode=${call.callEndReason.subCode}}`);
  }
});

Ereignis: idChanged

Das idChanged-Ereignis wird ausgelöst, wenn sich die ID eines Anrufs ändert. Die ID eines Anrufs ändert sich, wenn der Anruf vom Zustand connecting zu connected wechselt. Sobald der Anruf verbunden ist, bleibt die ID des Anrufs identisch.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte die neue Anruf-ID speichern, sie kann aber auch später bei Bedarf aus dem Anrufobjekt abgerufen werden.

Codebeispiel:

let callId = "";
call.on('idChanged', (async (callIdChangedEvent) => {
  callId = call.id; // You can log it as the call ID is useful for debugging call issues
});

Ereignis: isMutedChanged

Das isMutedChanged-Ereignis wird ausgelöst, wenn das lokale Audio stummgeschaltet oder die Stummschaltung aufgehoben wird.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte die Schaltfläche „Stummschalten/Stummschaltung aufheben“ auf den richtigen Zustand aktualisieren.

Codebeispiel:

call.on('isMutedChanged', (async (isMutedChangedEvent) => {
    microphoneButton.disabled = call.isMuted;       
});

Ereignis: isScreenSharingOnChanged

Das isScreenSharingOnChanged-Ereignis wird ausgelöst, wenn die Bildschirmfreigabe für den lokalen Benutzer aktiviert oder deaktiviert wird.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte dem Benutzer eine Vorschau und/oder eine Warnung anzeigen, wenn die Bildschirmfreigabe aktiviert wurde. Wenn die Bildschirmfreigabe deaktiviert wurde, sollte die Anwendung die Vorschau und Warnung entfernen.

Codebeispiel:

call.on('isScreenSharingOnChanged', () => {
  if (!this.call.isScreenSharing) {
      displayStartScreenSharingButton();
      hideScreenSharingWarning()
      removeScreenSharingPreview();    
  } else {
      displayScreenSharingWarning()
      displayStopScreenSharingButton();
      renderScreenSharingPreview(); 
  }
});

Ereignis: isLocalVideoStartedChanged

Das isLocalVideoStartedChanged-Ereignis wird ausgelöst, wenn der Benutzer das lokale Video aktiviert oder deaktiviert hat.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte eine Vorschau des lokalen Videos anzeigen und die Kameraaktivierungsschaltfläche aktivieren oder deaktivieren.

Codebeispiel:

call.on('isLocalVideoStartedChanged', () => {
    showdDisableCameraButton(call.isLocalVideoStarted);
});

Ereignis: remoteParticipantsUpdated

Ihre Anwendung sollte das Ereignis für jeden hinzugefügten RemoteParticipants abonnieren und das Abonnement von Ereignissen für Teilnehmer kündigen, die den Anruf verlassen haben.

Wie sollte Ihre Anwendung auf das Ereignis reagieren? Ihre Anwendung sollte eine Vorschau des lokalen Videos anzeigen und die Kameraaktivierungsschaltfläche aktivieren oder deaktivieren.

Codebeispiel:

call.on('remoteParticipantsUpdated', (remoteParticipantsUpdatedEvent) => {
    remoteParticipantsUpdatedEvent.added.forEach(participant => {
        // handleParticipant should
        //   - subscribe to the remote participants events 
        //   - update the UI 
        handleParticipant(participant);
    });
    
    remoteParticipantsUpdatedEvent.removed.forEach(participant => {
        // removeParticipant should
        //   - unsubcribe from the remote participants events 
        //   - update the UI  
        removeParticipant(participant);
    });
});

Ereignis: localVideoStreamsUpdated

Das localVideoStreamsUpdated-Ereignis wird ausgelöst, wenn sich die Liste der lokalen Videostreams ändert. Diese Änderungen treten auf, wenn der Benutzer einen Videostream startet oder entfernt.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte Vorschauen für jeden hinzugefügten LocalVideoStream anzeigen. Ihre Anwendung sollte für jeden entfernten LocalVideoStream die Vorschau entfernen und die Verarbeitung beenden.

Codebeispiel:

call.on('localVideoStreamsUpdated', (localVideoStreamUpdatedEvent) => {
    localVideoStreamUpdatedEvent.added.forEach(addedLocalVideoStream => { 
        // Add a preview and start any processing if needed
        handleAddedLocalVideoStream(addedLocalVideoStream) 
    });

    localVideoStreamUpdatedEvent.removed.forEach(removedLocalVideoStream => {
         // Remove the preview and stop any processing if needed
        this.handleRemovedLocalVideoStream(removedLocalVideoStream) 
    });
});

Ereignis: remoteAudioStreamsUpdated

Das remoteAudioStreamsUpdated-Ereignis wird ausgelöst, wenn sich die Liste der Remoteaudiostreams ändert. Diese Änderungen treten auf, wenn Remoteteilnehmer Audiostreams zum Anruf hinzufügen oder entfernen.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Wenn ein Stream verarbeitet wurde und jetzt entfernt wird, sollte die Verarbeitung beendet werden. Wenn hingegen ein Stream hinzugefügt wird, ist der Ereignisempfang ein guter Ausgangspunkt, um die Verarbeitung des neuen Audiostreams zu starten.

Ereignis: totalParticipantCountChanged

totalParticipantCountChanged wird ausgelöst, wenn sich die totalParticipant-Anzahl in einem Anruf geändert hat.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Wenn Ihre Anwendung einen Teilnehmerzähler anzeigt, kann sie den Teilnehmerzähler aktualisieren, wenn das Ereignis empfangen wird.

Codebeispiel:

call.on('totalParticipantCountChanged', () => {
    participantCounterElement.innerText = call.totalParticipantCount;
});

Ereignis: roleChanged

roleChanged für den Teilnehmer wird ausgelöst, wenn sich die localParticipant-Rollen im Anruf ändern. Ein Beispiel wäre, wenn der lokale Teilnehmer Moderator (ACSCallParticipantRolePresenter) in einem Anruf wird.

Wie sollte Ihre Anwendung auf das Ereignis reagieren? Ihre Anwendung sollte die Schaltfläche basierend auf der neuen Benutzerrolle aktivieren oder deaktivieren.

Codebeispiel:

call.on('roleChanged', () => {
    this.roleElement = call.role;
});

Ereignis: mutedByOthers

Das mutedByOthers-Ereignis tritt ein, wenn andere Teilnehmer des Anrufs vom lokalen Teilnehmer stummgeschaltet werden.

Wie sollte Ihre Anwendung auf das Ereignis reagieren? Ihre Anwendung sollte dem Benutzer eine Benachrichtigung über die Stummschaltung anzeigen.

Codebeispiel:

call.on('mutedByOthers', () => {
    messageBanner.innerText = "You have been muted by other participant in this call";
});

Ereignisse für das RemoteParticipant-Objekt

Ereignis: roleChanged

Das roleChanged-Ereignis wird ausgelöst, wenn sich die RemotePartipant-Rolle im Aufruf ändert. Ein Beispiel wäre, wenn RemoteParticipant Moderator (ACSCallParticipantRolePresenter) in einem Anruf wird.

Wie sollte Ihre Anwendung auf das Ereignis reagieren? Ihre Anwendung sollte die Benutzeroberfläche basierend auf der neue RemoteParticipant-Rolle aktualisieren.

Codebeispiel:

remoteParticipant.on('roleChanged', () => {
    updateRole(remoteParticipant);
});

Ereignis: isMutedChanged

Das isMutedChanged-Ereignis wird ausgelöst, wenn ein RemoteParticipant das Mikrofon stummschaltet oder die Stummschaltung aufhebt.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung kann ein Symbol in der Nähe der Ansicht anzeigen, in der der Teilnehmer angezeigt wird.

Codebeispiel:

remoteParticipant.on('isMutedChanged', () => {
    updateMuteStatus(remoteParticipant); // Update the UI based on the mute state of the participant
});

Ereignis: displayNameChanged

displayNameChanged, wenn der Name des RemoteParticipant aktualisiert wird.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Die Anwendung sollte den Namen des Teilnehmers aktualisieren, wenn er in der Benutzeroberfläche angezeigt wird.

Codebeispiel:

remoteParticipant.on('displayNameChanged', () => {
    remoteParticipant.nameLabel.innerText = remoteParticipant.displayName;
});

Ereignis: isSpeakingChanged

isSpeakingChanged, wenn sich der dominante Sprecher in einem Anruf ändert.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendungsbenutzeroberfläche sollte den RemotePartipant mit höherer Priorität anzeigen, der zum dominanten Sprecher geworden ist.

Codebeispiel:

remoteParticipant.on('isSpeakingChanged', () => {
    showAsRemoteSpeaker(remoteParticipant) // Display a speaking icon near the participant
});

Ereignis: videoStreamsUpdated

videoStreamsUpdated, wenn ein Remoteteilnehmer einen VideoStream zum Anruf hinzufügt oder daraus entfernt.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Wenn Ihre Anwendung einen Stream verarbeitet hat, wird dieser entfernt. Ihre Anwendung sollte die Verarbeitung beenden. Wenn ein neuer Stream hinzugefügt wird, sollte Ihre Anwendung ihn rendern oder verarbeiten.

Codebeispiel:

remoteParticipant.on('videoStreamsUpdated', (videoStreamsUpdatedEvent) => {

     videoStreamsUpdatedEvent.added.forEach(addedRemoteVideoStream => { 
       // Remove a renderer and start processing the stream if any processing is needed
        handleAddedRemoteVideoStream(addedRemoteVideoStream) 
    });

    videoStreamsUpdatedEvent.removed.forEach(removedRemoteVideoStream => {
        // Remove the renderer and stop processing the stream if any processing is ongoing
        this.handleRemovedRemoteVideoStream(removedRemoteVideoStream) 
    });
});

Ereignis für das AudioEffectsFeature-Objekt

Ereignis: effectsStarted

Dieses Ereignis tritt ein, wenn der ausgewählte Audioeffekt auf den Audiostream angewendet wird. Wenn beispielsweise jemand die Rauschunterdrückung aktiviert, wird effectsStarted ausgelöst.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung kann eine Schaltfläche anzeigen oder aktivieren, mit der der Benutzer den Audioeffekt deaktivieren kann.

Codebeispiel:

audioEffectsFeature.on('effectsStarted', (effects) => {
    stopEffectButton.style.visibility = "visible"; 
});

Ereignis: effectsStopped

Dieses Ereignis tritt ein, wenn der ausgewählte Audioeffekt auf den Audiostream angewendet wird. Wenn beispielsweise jemand die Rauschunterdrückung deaktiviert, wird effectsStopped ausgelöst.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung kann eine Schaltfläche anzeigen oder aktivieren, mit der der Benutzer den Audioeffekt aktivieren kann.

Codebeispiel:

audioEffectsFeature.on('effectsStopped', (effects) => {
    startEffectButton.style.visibility = "visible"; 
});

Ereignis: effectsError

Dieses Ereignis tritt ein, wenn ein Fehler auftritt, während ein Audioeffekt gestartet oder angewendet wird.

Wie sollte Ihre Anwendung auf das Ereignis reagieren?

Ihre Anwendung sollte eine Warnung oder eine Fehlermeldung anzeigen, dass der Audioeffekt nicht wie erwartet funktioniert.

Codebeispiel:

audioEffectsFeature.on('effectsError', (error) => {
    console.log(`Error with the audio effect ${error}`);
    alert(`Error with the audio effect`);
});

Das SDK installieren

Wählen Sie Ihre Datei build.gradle auf Projektebene aus, und fügen Sie mavenCentral() der Liste der Repositorys unter buildscript und allprojects hinzu:

buildscript {
    repositories {
    ...
        mavenCentral()
    ...
    }
}
allprojects {
    repositories {
    ...
        mavenCentral()
    ...
    }
}

Fügen Sie anschließend in der Datei build.gradle auf Modulebene die folgenden Zeilen im Abschnitt dependencies hinzu:

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

Initialisieren der erforderlichen Objekte

Zum Erstellen einer CallAgent-Instanz müssen Sie die createCallAgent-Methode für eine CallClient-Instanz aufrufen. Dieser Aufruf gibt asynchron ein CallAgent-Instanzobjekt zurück.

Die createCallAgent-Methode verwendet CommunicationUserCredential als Argument, womit ein Zugriffstoken gekapselt wird.

Um auf DeviceManager zuzugreifen, müssen Sie zuerst eine callAgent-Instanz erstellen. Anschließend können Sie die CallClient.getDeviceManager-Methode zum Abrufen von DeviceManager verwenden.

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();

Zum Festlegen eines Anzeigenamens für den Anrufer verwenden Sie diese alternative Methode:

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();

Mit unserem Android SDK können Sie die meisten Objekte und Sammlungen abonnieren, um bei Änderungen von Werten benachrichtigt zu werden.

Eigenschaften

So abonnieren Sie property changed-Ereignisse

// subscribe
PropertyChangedListener callStateChangeListener = new PropertyChangedListener()
{
    @Override
    public void onPropertyChanged(PropertyChangedEvent args)
    {
        Log.d("The call state has changed.");
    }
}
call.addOnStateChangedListener(callStateChangeListener);

//unsubscribe
call.removeOnStateChangedListener(callStateChangeListener);

Binden Sie bei der Verwendung von Ereignislistenern, die innerhalb derselben Klasse definiert sind, den Listener an eine Variable. Übergeben Sie die Variable als Argument, um Listenermethoden hinzuzufügen und zu entfernen.

Wenn Sie versuchen, den Listener direkt als Argument zu übergeben, geht der Verweis auf diesen Listener verloren. Java erstellt neue Instanzen dieser Listener und verweist nicht auf zuvor erstellte Instanzen. Sie werden weiterhin ordnungsgemäß ausgelöst, können aber nicht entfernt werden, da kein Verweis mehr darauf vorhanden ist.

Sammlungen

So abonnieren Sie collection updated-Ereignisse

LocalVideoStreamsChangedListener localVideoStreamsChangedListener = new LocalVideoStreamsChangedListener()
{
    @Override
    public void onLocalVideoStreamsUpdated(LocalVideoStreamsEvent localVideoStreamsEventArgs) {
        Log.d(localVideoStreamsEventArgs.getAddedStreams().size());
        Log.d(localVideoStreamsEventArgs.getRemovedStreams().size());
    }
}
call.addOnLocalVideoStreamsChangedListener(localVideoStreamsChangedListener);
// To unsubscribe
call.removeOnLocalVideoStreamsChangedListener(localVideoStreamsChangedListener);

Einrichten des Systems

Führen Sie die unten angegebenen Schritte aus, um Ihr System einzurichten.

Erstellen des Xcode-Projekts

Erstellen Sie in Xcode ein neues iOS-Projekt, und wählen Sie die Vorlage Single View App (Einzelansicht-App) aus. In diesem Artikel wird das SwiftUI-Framework verwendet. Legen Sie daher Sprache auf Swift und Schnittstelle auf SwiftUI fest.

Sie werden in diesem Artikel keine Tests erstellen. Sie können das Kontrollkästchen Tests einschließen deaktivieren.

Screenshot: Fenster zum Erstellen eines Projekts in Xcode

Installieren des Pakets und der Abhängigkeiten mithilfe von CocoaPods

  1. Erstellen Sie eine Podfile-Datei für die Anwendung, wie in diesem Beispiel:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Führen Sie pod install aus.

  3. Öffnen Sie .xcworkspace mithilfe von Xcode.

Anfordern des Zugriffs auf das Mikrofon

Um auf das Mikrofon des Geräts zuzugreifen, müssen Sie die Liste der Informationseigenschaften Ihrer App mithilfe von NSMicrophoneUsageDescription aktualisieren. Legen Sie den zugehörigen Wert auf eine Zeichenfolge fest. Diese wird in den Dialog aufgenommen, mit dem das System den Zugriff beim Benutzer anfordert.

Klicken Sie mit der rechten Maustaste auf den Eintrag info.plist in der Projektstruktur, und wählen Sie dann Öffnen als>Quellcode aus. Fügen Sie im Abschnitt <dict> der obersten Ebene die folgenden Zeilen hinzu, und speichern Sie dann die Datei.

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

Einrichten des App-Frameworks

Öffnen Sie die Datei ContentView.swift Ihres Projekts. Fügen Sie am Anfang der Datei eine import-Deklaration hinzu, um die AzureCommunicationCalling-Bibliothek zu importieren. Importieren Sie außerdem AVFoundation. Sie ist für Audioberechtigungsanforderungen im Code erforderlich.

import AzureCommunicationCalling
import AVFoundation

Initialisieren von „CallAgent“

Um eine CallAgent-Instanz auf der Grundlage von CallClient zu erstellen, müssen Sie eine Methode vom Typ callClient.createCallAgent verwenden, die asynchron ein Objekt vom Typ CallAgent zurückgibt, nachdem es initialisiert wurde.

Übergeben Sie für die Erstellung eines Anrufclients ein Objekt vom Typ CommunicationTokenCredential:

import AzureCommunication

let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
    let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
    userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
    updates("Couldn't created Credential object", false)
    initializationDispatchGroup!.leave()
    return
}

// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
    let newToken = self.tokenProvider!.fetchNewToken()
    onCompletion(newToken, nil)
}

Übergeben Sie das von Ihnen erstellte CommunicationTokenCredential-Objekt an CallClient, und legen Sie den Anzeigenamen fest:

self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"

self.callClient!.createCallAgent(userCredential: userCredential!,
    options: callAgentOptions) { (callAgent, error) in
        if error == nil {
            print("Create agent succeeded")
            self.callAgent = callAgent
        } else {
            print("Create agent failed")
        }
})

Mit unserem iOS SDK können Sie die meisten Objekte und Sammlungen abonnieren, um bei Änderungen von Werten benachrichtigt zu werden.

Eigenschaften

Verwenden Sie den folgenden Code, um Ereignisse vom Typ property changed zu abonnieren:

call.delegate = self
// Get the property of the call state by getting on the call's state member
public func call(_ call: Call, didChangeState args: PropertyChangedEventArgs) {
{
    print("Callback from SDK when the call state changes, current state: " + call.state.rawValue)
}

// to unsubscribe
self.call.delegate = nil

Sammlungen

Verwenden Sie den folgenden Code, um Ereignisse vom Typ collection updated zu abonnieren:

call.delegate = self
// Collection contains the streams that were added or removed only
public func call(_ call: Call, didUpdateLocalVideoStreams args: LocalVideoStreamsUpdatedEventArgs) {
{
    print(args.addedStreams.count)
    print(args.removedStreams.count)
}
// to unsubscribe
self.call.delegate = nil

Nächste Schritte