Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 LocalVideoStream
Call.
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.
Instalowanie pakietu i zależności przy użyciu narzędzia CocoaPods
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
Uruchom program
pod install
.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