Udostępnij za pośrednictwem


Zasubskrybuj zdarzenia SDK

Zalecamy subskrybowanie zdarzeń zestawu SDK wywoływania. Zestawy SDK usług Azure Communication Services są dynamiczne i zawierają właściwości, które mogą ulec zmianie w czasie. Możesz subskrybować te zdarzenia, aby otrzymywać powiadomienia przed wszelkimi zmianami. Postępuj zgodnie z instrukcjami w tym artykule, aby subskrybować zdarzenia zestawu SDK usług Azure Communication Services.

Zdarzenia w zestawie SDK wywoływania komunikacji platformy Azure

W tej sekcji opisano zdarzenia i zmiany właściwości, do których aplikacja może subskrybować. Subskrybowanie tych zdarzeń umożliwia aplikacji bycie informowaną o zmianie stanu w wywołującym zestawie SDK oraz odpowiednie reagowanie.

Śledzenie zdarzeń ma kluczowe znaczenie, ponieważ umożliwia synchronizowanie stanu aplikacji z stanem struktury wywołującej usługi Azure Communication Services. Śledzenie zdarzeń pozwala śledzić zmiany bez implementowania mechanizmu pobierania w obiektach zestawu SDK.

Zakłada się, że w tej sekcji przeszedłeś przez szybki start lub zaimplementowałeś aplikację, która może wykonywać i odbierać połączenia. Jeśli nie ukończono przewodnika wprowadzającego, zapoznaj się z Dodawanie połączeń głosowych do aplikacji.

Każdy obiekt w zestawie JavaScript Calling SDK ma properties oraz collections. Ich wartości zmieniają się przez cały okres istnienia obiektu.

Użyj metody on(), aby subskrybować zdarzenia obiektów. Użyj metody off() do anulowania subskrypcji zdarzeń obiektów.

Właściwości

Możesz subskrybować zdarzenie, '<property>Changed' aby nasłuchiwać zmian wartości we właściwości.

Przykład subskrypcji we właściwości

W tym przykładzie subskrybujemy zmiany wartości isLocalVideoStarted właściwości.

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

Kolekcje

Możesz zasubskrybować wydarzenie \<collection>Updated, aby otrzymywać powiadomienia o zmianach w kolekcji obiektów. Zdarzenie \<collection>Updated jest wyzwalane za każdym razem, gdy elementy zostaną dodane do lub usunięte z monitorowanej kolekcji.

  • '<collection>Updated' Ładunek zdarzenia zawiera tablicę zawierającą added wartości dodane do kolekcji.
  • '<collection>Updated' Ładunek zdarzenia zawiera również tablicę zawierającą removed wartości usunięte z kolekcji.

Przykładowa subskrypcja w kolekcji

W tym przykładzie zapisujemy się na zmiany wartości obiektu LocalVideoStreamCall.

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

Zdarzenia obiektu CallAgent

Nazwa zdarzenia: incomingCall

Zdarzenie incomingCall jest uruchamiane, gdy klient odbiera połączenie przychodzące.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi powiadomić adresata połączenia przychodzącego. Monit o powiadomienie musi umożliwić odbiorcy akceptowanie lub odrzucanie połączenia.

Przykładowy kod:

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

Nazwa zdarzenia: callsUpdated

Zaktualizowane callsUpdated zdarzenie zostaje wywołane, gdy połączenie zostaje usunięte lub dodane do agenta połączeń. To zdarzenie występuje, gdy użytkownik wykonuje, odbiera lub przerywa wywołanie.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi zaktualizować interfejs użytkownika na podstawie liczby aktywnych wywołań dla wystąpienia CallAgent.

Nazwa zdarzenia: connectionStateChanged

Zdarzenie connectionStateChanged zostało wyzwolone po zaktualizowaniu stanu sygnału CallAgent .

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi zaktualizować interfejs użytkownika na podstawie nowego stanu. Możliwe wartości stanu połączenia to Connected i Disconnected.

Przykładowy kod:

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

Zdarzenia obiektu Call

Nazwa zdarzenia: stateChanged

Zdarzenie stateChanged jest uruchamiane po zmianie stanu wywołania. Na przykład gdy wywołanie przechodzi z connected do disconnected.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi odpowiednio zaktualizować interfejs użytkownika. Wyłączanie lub włączanie odpowiednich przycisków i innych elementów interfejsu użytkownika na podstawie nowego stanu wywołania.

Przykładowy kod:

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

Wydarzenie: idChanged

Zdarzenie idChanged wyzwalane jest, gdy identyfikator wywołania ulega zmianie. Identyfikator wywołania zmienia się, gdy wywołanie przechodzi ze connecting stanu na connected. Po nawiązaniu połączenia identyfikator wywołania pozostaje identyczny.

Jak aplikacja reaguje na zdarzenie?

Aplikacja może zapisać nowy identyfikator wywołania lub pobrać go z obiektu wywołania później w razie potrzeby.

Przykładowy kod:

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

Wydarzenie: isMutedChanged

Zdarzenie isMutedChanged jest uruchamiane, gdy lokalny dźwięk jest wyciszony lub ponownie włączony.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi zaktualizować przycisk wyciszenia/wyciszenia do odpowiedniego stanu.

Przykładowy kod:

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

Wydarzenie: isScreenSharingOnChanged

Zdarzenie isScreenSharingOnChanged jest uruchamiane, gdy udostępnianie ekranu dla użytkownika lokalnego jest włączone lub wyłączone.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi wyświetlać podgląd i/lub ostrzeżenie dla użytkownika, jeśli udostępnianie ekranu jest włączone.

Jeśli udostępnianie ekranu jest wyłączone, aplikacja musi usunąć podgląd i ostrzeżenie.

Przykładowy kod:

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

Wydarzenie: isLocalVideoStartedChanged

Zdarzenie isLocalVideoStartedChanged jest uruchamiane, gdy użytkownik włączył lub wyłączył swoje lokalne wideo.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi wyświetlać podgląd lokalnego wideo i włączać lub wyłączać przycisk aktywacji aparatu.

Przykładowy kod:

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

Wydarzenie: remoteParticipantsUpdated

Aplikacja musi subskrybować zdarzenia dla każdego dodanego RemoteParticipants i anulować subskrypcję zdarzeń dla uczestników, którzy opuszczają połączenie.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi wyświetlać podgląd lokalnego wideo i włączać lub wyłączać przycisk aktywacji aparatu.

Przykładowy kod:

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
        //   - unsubscribe from the remote participants events 
        //   - update the UI  
        removeParticipant(participant);
    });
});

Wydarzenie: localVideoStreamsUpdated

Zdarzenie localVideoStreamsUpdated jest uruchamiane po zmianie listy lokalnego strumienia wideo. Te zmiany mają miejsce po uruchomieniu lub usunięciu strumienia wideo przez użytkownika.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi wyświetlać podglądy dla każdego dodanego LocalVideoStream elementu. Aplikacja musi usunąć podgląd i przerwać obróbkę przy każdym usunięciu elementu LocalVideoStream.

Przykładowy kod:

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

Wydarzenie: remoteAudioStreamsUpdated

Zdarzenie remoteAudioStreamsUpdated jest wywoływane, gdy zmienia się lista zdalnych strumieni audio. Te zmiany mają miejsce, gdy uczestnicy zdalni dodają lub usuwają strumienie audio w połączeniu.

Jak aplikacja reaguje na zdarzenie?

Jeśli strumień był przetwarzany i jest teraz usuwany, przetwarzanie musi zostać zatrzymane. Z drugiej strony, jeśli strumień zostanie dodany, moment odbioru zdarzenia jest dobrym miejscem do rozpoczęcia przetwarzania nowego strumienia audio.

Wydarzenie: totalParticipantCountChanged

Pożary totalParticipantCountChanged , gdy liczba całkowitapartycypacja zmieniła się w wywołaniu.

Jak aplikacja reaguje na zdarzenie?

Jeśli aplikacja wyświetla licznik uczestnika, aplikacja może zaktualizować licznik uczestnika po odebraniu zdarzenia.

Przykładowy kod:

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

Wydarzenie: roleChanged

Uczestnik roleChanged jest uruchamiany, gdy w wywołaniu zmieniają się role lokalnego uczestnika. Przykładem może być sytuacja, gdy lokalny uczestnik zostaje prezenterem ACSCallParticipantRolePresenter w rozmowie.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi włączać lub wyłączać przycisk na podstawie nowej roli użytkownika.

Przykładowy kod:

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

Wydarzenie: mutedByOthers

Zdarzenie mutedByOthers ma miejsce, gdy lokalny uczestnik wycisza innych uczestników połączenia.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi wyświetlić komunikat użytkownikowi, informujący, że jest wyciszony.

Przykładowy kod:

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

Wydarzenie: callerInfoChanged

Zdarzenie callerInfoChanged występuje, gdy informacje o dzwoniącym zostały zaktualizowane. Dzieje się tak, gdy obiekt wywołujący zmienia nazwę wyświetlaną.

Jak aplikacja reaguje na zdarzenie? Aplikacja może aktualizować informacje o obiekcie wywołującym.

Przykładowy kod:

call.on('callerInfoChanged', () => {
    showCallerInfo(call.callerInfo)
});

Wydarzenie: transferorInfoChanged

Zdarzenie transferorInfoChanged ma miejsce po zaktualizowaniu informacji o przekazującym. Dzieje się tak, gdy transferujący zmienia swoją nazwę wyświetlaną.

Jak aplikacja reaguje na zdarzenie? Aplikacja może aktualizować informacje o zbywcy.

Przykładowy kod:

call.on('transferorInfoChanged', () => {
    showTransferorInfo(call.transferorInfo)
});

Zdarzenia obiektu RemoteParticipant

Wydarzenie: roleChanged

Zdarzenie roleChanged jest wywoływane, gdy rola RemoteParticipant zmienia się w trakcie połączenia. Przykładem może być to, gdy RemoteParticipant stanie się prezenterem ACSCallParticipantRolePresenter podczas rozmowy.

Jak aplikacja reaguje na zdarzenie?

Twoja aplikacja musi zaktualizować interfejs użytkownika na RemoteParticipant podstawie nowej roli.

Przykładowy kod:

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

Wydarzenie: isMutedChanged

Zdarzenie isMutedChanged jest uruchamiane, gdy jeden z RemoteParticipant wyciszy lub wyłączy wyciszenie swojego mikrofonu.

Jak aplikacja reaguje na zdarzenie?

Aplikacja może wyświetlić ikonę w pobliżu widoku, który wyświetla uczestnika.

Przykładowy kod:

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

Wydarzenie: displayNameChanged

Wartość displayNameChanged po zaktualizowaniu nazwy elementu RemoteParticipant .

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi zaktualizować nazwę uczestnika, jeśli jest on wyświetlany w interfejsie użytkownika.

Przykładowy kod:

remoteParticipant.on('displayNameChanged', () => {
    remoteParticipant.nameLabel.innerText = remoteParticipant.displayName;
});
remoteParticipant.on('displayNameChanged', (args: {newValue?: string, oldValue?: string, reason?: DisplayNameChangedReason}) => {
    remoteParticipant.nameLabel.innerText = remoteParticipant.displayName;
    console.log(`Display name changed from ${oldValue} to ${newValue} due to ${reason}`);
});

Wydarzenie: isSpeakingChanged

Gdy isSpeakingChanged zmienia się dominujący mówca w rozmowie.

Jak aplikacja reaguje na zdarzenie?

Interfejs użytkownika aplikacji musi priorytetowo wyświetlać RemoteParticipant osobę mówiącą, która stała się dominującą.

Przykładowy kod:

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

Wydarzenie: videoStreamsUpdated

Gdy videoStreamsUpdated zdalny uczestnik dodaje lub usuwa strumień wideo do/ze połączenia.

Jak aplikacja reaguje na zdarzenie?

Jeśli aplikacja przetwarzała strumień, który został usunięty, aplikacja musi zatrzymać przetwarzanie. Po dodaniu nowego strumienia zalecamy, aby aplikacja rozpoczęła renderowanie lub przetwarzanie tego strumienia.

Przykładowy kod:

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

Zdarzenie w AudioEffectsFeature obiekcie

Wydarzenie: effectsStarted

To zdarzenie występuje, gdy wybrany efekt dźwiękowy jest stosowany do strumienia audio. Na przykład gdy ktoś włączy funkcję Tłumienie szumu, effectsStarted uruchamia się.

Jak aplikacja reaguje na zdarzenie?

Aplikacja może wyświetlać lub włączać przycisk, który umożliwia użytkownikowi wyłączenie efektu audio.

Przykładowy kod:

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

Wydarzenie: effectsStopped

To zdarzenie występuje, gdy wybrany efekt dźwiękowy jest stosowany do strumienia audio. Na przykład gdy ktoś wyłączy funkcję Tłumienie szumów, effectsStopped zostanie wyzwolony.

Jak aplikacja reaguje na zdarzenie?

Aplikacja może wyświetlać lub włączać przycisk, który umożliwia użytkownikowi włączenie efektu dźwiękowego.

Przykładowy kod:

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

Wydarzenie: effectsError

To zdarzenie występuje, gdy wystąpi błąd podczas uruchamiania lub stosowania efektu dźwiękowego.

Jak aplikacja reaguje na zdarzenie?

Aplikacja musi wyświetlić alert lub komunikat o błędzie informujący, że efekt dźwiękowy nie działa zgodnie z oczekiwaniami.

Przykładowy kod:

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

Instalacja zestawu SDK

Znajdź na poziomie projektu plik build.gradle i dodaj mavenCentral() do listy repozytoriów w obszarze buildscript i allprojects.

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

Następnie w pliku build.gradle na poziomie modułu dodaj następujące wiersze do sekcji dependencies.

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

Inicjowanie wymaganych obiektów

Aby utworzyć CallAgent wystąpienie, należy wywołać createCallAgent metodę na wystąpieniu CallClient. To wywołanie asynchroniczne zwraca wystąpienie obiektu CallAgent.

Metoda createCallAgent przyjmuje CommunicationUserCredential jako argument, który hermetyzuje token dostępu.

Aby uzyskać dostęp do DeviceManager, należy najpierw utworzyć wystąpienie callAgent. Następnie możesz użyć metody CallClient.getDeviceManager, aby uzyskać DeviceManager.

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();

Aby ustawić nazwę wyświetlaną elementu wywołującego, użyj tej alternatywnej metody:

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();

Po zainstalowaniu zestawu SDK systemu Android możesz subskrybować większość właściwości i kolekcji, aby otrzymywać powiadomienia o zmianie wartości.

Właściwości

Aby zapisać się na property changed wydarzenia:

// 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);

Jeśli używasz odbiorników zdarzeń zdefiniowanych w tej samej klasie, powiąż odbiornik ze zmienną. Aby dodać i usunąć metody odbiornika, przekaż zmienną jako argument.

Jeśli próbujesz przekazać odbiornik bezpośrednio jako argument, utracisz odwołanie do tego odbiornika. Język Java tworzy nowe wystąpienia tych odbiorników i nie odwołuje się do utworzonych wcześniej. Nadal uruchamiają się prawidłowo, ale nie można ich usunąć, ponieważ nie masz już do nich odwołania.

Kolekcje

Aby zapisać się na collection updated wydarzenia:

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

Konfigurowanie systemu

Wykonaj następujące kroki, aby skonfigurować system.

Tworzenie projektu Xcode

W programie Xcode utwórz nowy projekt systemu iOS i wybierz szablon Aplikacja z jednym widokiem. W tym artykule jest używana struktura SwiftUI, dlatego należy ustawić wartość Language na Swift i ustawić wartość Interface na SwiftUI.

Nie zamierzasz tworzyć testów w tym artykule. Możesz śmiało wyczyścić pole wyboru Include Tests.

Zrzut ekranu przedstawiający okno tworzenia projektu w programie Xcode.

Instalowanie pakietu i zależności przy użyciu narzędzia CocoaPods

  1. Utwórz plik Podfile dla aplikacji, podobnie jak w tym przykładzie:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Uruchom program pod install.

  3. Otwórz .xcworkspace za pomocą programu Xcode.

Żądanie dostępu do mikrofonu

Aby uzyskać dostęp do mikrofonu urządzenia, należy zaktualizować listę właściwości informacji aplikacji przy użyciu polecenia NSMicrophoneUsageDescription. Ustaw powiązaną wartość na ciąg znaków, który znajduje się w oknie dialogowym, używanym przez system do proszenia użytkownika o dostęp.

Kliknij prawym przyciskiem myszy wpis Info.plist w drzewie projektu, a następnie wybierz pozycję Otwórz jako>Kod źródłowy. Dodaj następujące wiersze w sekcji najwyższego poziomu <dict> , a następnie zapisz plik.

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

Konfigurowanie struktury aplikacji

Otwórz plik projektu ContentView.swift . Dodaj deklarację import na początku pliku, aby zaimportować bibliotekę AzureCommunicationCalling . Ponadto zaimportuj plik AVFoundation. Potrzebujesz tego do żądań uprawnień do dźwięku w kodzie.

import AzureCommunicationCalling
import AVFoundation

Inicjuj CallAgent

Aby utworzyć CallAgent wystąpienie z klasy CallClient, należy skorzystać z metody callClient.createCallAgent, która asynchronicznie zwraca CallAgent obiekt po zainicjowaniu.

Aby utworzyć klienta wywołań, przekaż obiekt 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)
}

CommunicationTokenCredential Przekaż utworzony obiekt do CallClient, a następnie ustaw nazwę wyświetlaną:

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")
        }
})

Po zainstalowaniu zestawu SDK systemu iOS możesz subskrybować większość właściwości i kolekcji, aby otrzymywać powiadomienia po zmianie wartości.

Właściwości

Aby zasubskrybować property changed zdarzenia, użyj następującego kodu.

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

Kolekcje

Aby zasubskrybować collection updated zdarzenia, użyj następującego kodu.

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

Następne kroki