Bagikan melalui


Berlangganan kejadian SDK

Azure Communication Services SDK bersifat dinamis dan mengandung banyak properti. Ketika ini berubah, sebagai pengembang Anda mungkin ingin tahu kapan dan yang lebih penting apa yang berubah. Berikut caranya!

Peristiwa di Azure Communication Calling SDK

Panduan ini menjelaskan berbagai peristiwa atau properti yang dapat dilanggani aplikasi Anda. Berlangganan peristiwa tersebut memungkinkan aplikasi Anda untuk diberi tahu tentang perubahan status dalam SDK panggilan dan bereaksi yang sesuai.

Peristiwa pelacakan sangat penting karena memungkinkan status aplikasi Anda untuk tetap disinkronkan dengan status kerangka kerja ACSCalling, semuanya tanpa mengharuskan Anda menerapkan mekanisme penarikan pada objek SDK.

Panduan ini mengasumsikan Anda melalui Mulai Cepat atau bahwa Anda menerapkan aplikasi yang dapat melakukan dan menerima panggilan. Jika Anda tidak menyelesaikan panduan memulai, lihat Mulai Cepat kami.

Setiap objek dalam JavaScript memanggil SDK memiliki properties dan collections. Nilai-nilai mereka berubah sepanjang masa pakai objek. Gunakan metode on() untuk berlangganan ke acara obyek', dan gunakan metode off() untuk berhenti langganan dari acara objek'.

Properti

Anda dapat berlangganan '<property>Changed' acara untuk mendengarkan perubahan nilai pada properti.

Contoh langganan pada properti

Dalam contoh ini, kami berlangganan perubahan nilai isLocalVideoStarted properti.

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

Koleksi

Anda dapat berlangganan peristiwa '<koleksi>Diperbarui' untuk menerima pemberitahuan tentang perubahan dalam koleksi objek. Peristiwa '<koleksi>Diperbarui' dipicu setiap kali elemen ditambahkan atau dihapus dari koleksi yang Anda pantau.

  • Payload acara '<collection>Updated', memiliki larik added yang berisi nilai yang ditambahkan ke koleksi.
  • Payload acara '<collection>Updated' juga memiliki larik removed yang berisi nilai yang dihapus dari koleksi.

Contoh langganan pada koleksi

Dalam contoh ini, kami berlangganan perubahan nilai objek LocalVideoStreamPanggilan .

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

Peristiwa pada CallAgent objek

Nama Peristiwa: incomingCall

Peristiwa ini incomingCall diaktifkan ketika klien menerima panggilan masuk.

Bagaimana aplikasi Anda harus bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus memberi tahu pengguna tentang panggilan masuk. Prompt pemberitahuan harus mengusulkan pengguna untuk menerima atau menolak panggilan.

Sampel kode:

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

Nama Peristiwa: callsUpdated

Peristiwa callsUpdated yang diperbarui diaktifkan saat panggilan dihapus atau ditambahkan ke agen panggilan. Kejadian ini terjadi ketika pengguna melakukan, menerima, atau mengakhiri panggilan.

Bagaimana aplikasi Anda harus bereaksi terhadap peristiwa tersebut? Aplikasi Anda harus memperbarui UI-nya berdasarkan jumlah panggilan aktif untuk instans CallAgent.

Nama Peristiwa: connectionStateChanged

Peristiwa diaktifkan connectionStateChanged ketika status sinyal diperbarui CallAgent .

Bagaimana aplikasi Anda harus bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus memperbarui UI-nya berdasarkan status baru. Nilai status koneksi yang mungkin adalah Connected dan Disconnected

Sampel kode:

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

Peristiwa pada Call objek

Nama Peristiwa: stateChanged

Peristiwa stateChanged diaktifkan saat status panggilan berubah. Misalnya, ketika panggilan beralih dari connected ke disconnected.

Bagaimana aplikasi Anda harus bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus memperbarui UI-nya dengan sesuai. Menonaktifkan atau mengaktifkan tombol yang sesuai dan elemen UI lainnya berdasarkan status panggilan baru.

Sampel Kode:

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

Peristiwa: idChanged

Peristiwa idChanged diaktifkan saat ID panggilan berubah. ID panggilan berubah saat panggilan berpindah dari connecting status ke connected. Setelah panggilan tersambung, ID panggilan tetap identik.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus menyimpan ID panggilan baru tetapi juga dapat diambil dari objek panggilan nanti ketika diperlukan.

Sampel Kode:

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

Peristiwa: isMutedChanged

Peristiwa isMutedChanged diaktifkan saat audio lokal dibisukan atau dimatikan suaranya.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus memperbarui tombol matikan/hidupkan suara ke status yang tepat.

Sampel Kode:

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

Peristiwa: isScreenSharingOnChanged

Peristiwa isScreenSharingOnChanged diaktifkan saat berbagi layar untuk pengguna lokal diaktifkan atau dinonaktifkan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus menampilkan pratinjau dan/atau peringatan kepada pengguna jika berbagi layar aktif. Jika berbagi layar berbunyi, maka aplikasi harus menghapus pratinjau dan peringatan.

Sampel Kode:

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

Peristiwa: isLocalVideoStartedChanged

Peristiwa isLocalVideoStartedChanged ini diaktifkan ketika pengguna mengaktifkan video lokalnya yang dinonaktifkan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus menampilkan pratinjau video lokal dan mengaktifkan atau menonaktifkan tombol aktivasi kamera.

Sampel Kode:

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

Peristiwa: remoteParticipantsUpdated

Aplikasi Anda harus berlangganan peristiwa untuk setiap acara yang ditambahkan RemoteParticipants dan berhenti berlangganan acara untuk peserta yang telah meninggalkan panggilan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut? Aplikasi Anda harus menampilkan pratinjau video lokal dan mengaktifkan atau menonaktifkan tombol aktivasi kamera.

Sampel Kode:

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

Peristiwa: localVideoStreamsUpdated

Peristiwa localVideoStreamsUpdated diaktifkan saat daftar streaming video lokal berubah. Perubahan ini terjadi saat pengguna memulai atau menghapus aliran video.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus menampilkan pratinjau untuk masing-masing yang LocalVideoStream ditambahkan. Aplikasi Anda harus menghapus pratinjau dan menghentikan pemrosesan untuk setiap LocalVideoStream yang dihapus.

Sampel Kode:

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

Peristiwa: remoteAudioStreamsUpdated

Peristiwa remoteAudioStreamsUpdated diaktifkan ketika daftar aliran audio jarak jauh berubah. Perubahan ini terjadi ketika peserta jarak jauh menambahkan atau menghapus aliran audio ke panggilan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Jika aliran sedang diproses dan sekarang dihapus, pemrosesan harus dihentikan. Di sisi lain, jika aliran ditambahkan, maka penerimaan acara adalah tempat yang baik untuk memulai pemrosesan aliran audio baru.

Peristiwa: totalParticipantCountChanged

Diaktifkan totalParticipantCountChanged ketika jumlah totalParticipant berubah dalam panggilan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Jika aplikasi Anda menampilkan penghitung peserta, aplikasi Anda dapat memperbarui penghitung pesertanya saat acara diterima.

Sampel Kode:

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

Peristiwa: roleChanged

Peserta roleChanged diaktifkan saat peran localParticipant berubah dalam panggilan. Contohnya adalah ketika peserta lokal menjadi penyaji ACSCallParticipantRolePresenter dalam panggilan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut? Aplikasi Anda harus mengaktifkan atau menonaktifkan basis tombol pada peran baru pengguna.

Sampel Kode:

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

Peristiwa: mutedByOthers

Peristiwa terjadi mutedByOthers ketika peserta lain dalam panggilan dibisukan oleh peserta lokal.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut? Aplikasi Anda harus menampilkan pesan kepada pengguna yang memberi tahu bahwa pesan tersebut dibisukan.

Sampel Kode:

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

Peristiwa pada RemoteParticipant objek

Peristiwa: roleChanged

Peristiwa diaktifkan roleChanged saat RemotePartipant peran berubah dalam panggilan. Contohnya adalah ketika RemoteParticipant menjadi penyaji ACSCallParticipantRolePresenter dalam panggilan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut? Aplikasi Anda harus memperbarui UI-nya berdasarkan RemoteParticipant peran baru.

Sampel Kode:

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

Peristiwa: isMutedChanged

Peristiwa menyala isMutedChanged saat salah RemoteParticipant satu bisu atau menyalakan suara mikrofonnya.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda mungkin menampilkan ikon di dekat tampilan yang menampilkan peserta.

Sampel Kode:

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

Peristiwa: displayNameChanged

displayNameChanged Saat nama diperbaruiRemoteParticipant.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus memperbarui nama peserta jika ditampilkan di UI.

Sampel Kode:

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

Peristiwa: isSpeakingChanged

Saat isSpeakingChanged pembicara dominan dalam panggilan berubah.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Antarmuka pengguna aplikasi Anda harus memberikan prioritas untuk menampilkan RemotePartipant siapa yang menjadi pembicara dominan.

Sampel Kode:

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

Peristiwa: videoStreamsUpdated

videoStreamsUpdated Saat peserta jarak jauh menambahkan atau menghapus VideoStream ke/dari panggilan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Jika aplikasi Anda memproses aliran yang dihapus. Aplikasi Anda harus menghentikan pemrosesan. Saat aliran baru ditambahkan, aplikasi Anda mungkin ingin merender atau memprosesnya.

Sampel Kode:

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

Peristiwa pada AudioEffectsFeature objek

Peristiwa: effectsStarted

Kejadian ini terjadi ketika efek audio yang dipilih diterapkan ke aliran audio. Misalnya, ketika seseorang mengaktifkan Supresi Kebisingan, effectsStarted akan ditembakkan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda dapat menampilkan atau mengaktifkan tombol yang memungkinkan pengguna menonaktifkan efek audio.

Sampel Kode:

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

Peristiwa: effectsStopped

Kejadian ini terjadi ketika efek audio yang dipilih diterapkan ke aliran audio. Misalnya, ketika seseorang mematikan Penindasan Kebisingan effectsStopped , akan ditembakkan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda dapat menampilkan atau mengaktifkan tombol yang memungkinkan pengguna mengaktifkan efek audio.

Sampel Kode:

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

Peristiwa: effectsError

Kejadian ini terjadi ketika terjadi kesalahan saat efek audio dimulai atau diterapkan.

Bagaimana aplikasi Anda dapat bereaksi terhadap peristiwa tersebut?

Aplikasi Anda harus menampilkan pemberitahuan atau pesan kesalahan bahwa efek audio tidak berfungsi seperti yang diharapkan.

Sampel Kode:

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

Pasang SDK

Temukan file tingkat build.gradle proyek Anda dan tambahkan mavenCentral() ke daftar repositori di bawah buildscript dan allprojects:

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

Kemudian, dalam file tingkat build.gradle modul Anda, tambahkan baris berikut ke bagian dependencies :

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

Menginisialisasi objek yang diperlukan

Untuk membuat CallAgent instans, Anda harus memanggil createCallAgent metode pada CallClient instans. Panggilan ini secara asinkron mengembalikan objek instans CallAgent .

Metode ini createCallAgent mengambil CommunicationUserCredential sebagai argumen, yang merangkum token akses.

Untuk mengakses DeviceManager, Anda harus membuat instans terlebih callAgent dahulu. Kemudian Anda dapat menggunakan CallClient.getDeviceManager metode untuk mendapatkan 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();

Untuk mengatur nama tampilan penelepon, gunakan metode alternatif ini:

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

Anda dapat berlangganan sebagian besar properti dan koleksi untuk diberi tahu saat nilai berubah.

Properti

Untuk berlangganan peristiwa property changed:

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

Ketika Anda menggunakan pendengar acara yang didefinisikan dalam kelas yang sama, mengikat pendengar untuk variabel. Meneruskan variabel sebagai argumen untuk menambahkan dan menghapus metode pendengar.

Jika Anda mencoba untuk meneruskan pendengar secara langsung sebagai argumen, Anda akan kehilangan referensi ke pendengar itu. Java menciptakan instans baru dari pendengar ini dan tidak merujuk yang dibuat sebelumnya. Mereka masih akan berfungsi dengan baik tetapi tidak dapat dihapus karena Anda tidak akan memiliki referensi untuknya lagi.

Koleksi

Untuk berlangganan peristiwa collection updated:

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

Siapkan sistem Anda

Ikuti langkah-langkah ini untuk menyiapkan sistem Anda.

Buat proyek Xcode

Di Xcode, buat proyek iOS baru dan pilih templat Aplikasi Tampilan Tunggal. Artikel ini menggunakan kerangka kerja SwiftUI, jadi Anda harus mengatur Bahasa ke Swift dan mengatur Antarmuka ke SwiftUI.

Anda tidak akan membuat pengujian di artikel ini. Jangan ragu untuk menghapus kotak centang Sertakan Pengujian.

Cuplikan layar yang memperlihatkan jendela untuk membuat proyek dalam Xcode.

Pasang paket dan dependensi dengan menggunakan CocoaPods

  1. Buat Podfile untuk aplikasi Anda, seperti contoh ini:

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

  3. Buka .xcworkspace dengan menggunakan Xcode.

Minta akses ke mikrofon

Untuk mengakses mikrofon perangkat, Anda perlu memperbarui daftar properti informasi aplikasi dengan menggunakan NSMicrophoneUsageDescription. Atur nilai terkait ke string yang disertakan dalam dialog yang digunakan sistem untuk meminta akses dari pengguna.

Klik kanan entri Info.plist dari pohon proyek, lalu pilih Buka Sebagai>Kode Sumber. Tambahkan baris berikut ke bagian <dict> tingkat atas, lalu simpan file.

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

Menyiapkan kerangka kerja aplikasi

Buka file proyek ContentView.swift Anda. import Tambahkan deklarasi ke bagian atas file untuk mengimpor AzureCommunicationCalling pustaka. Selain itu, impor AVFoundation. Anda memerlukannya untuk permintaan izin audio dalam kode.

import AzureCommunicationCalling
import AVFoundation

Inisialisasi CallAgent

Untuk membuat CallAgent instans dari CallClient, Anda harus menggunakan callClient.createCallAgent metode yang secara asinkron mengembalikan CallAgent objek setelah diinisialisasi.

Untuk membuat klien panggilan, berikan CommunicationTokenCredential objek:

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

Teruskan CommunicationTokenCredential objek yang Anda buat ke CallClient, dan atur nama tampilan:

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

Dengan iOS SDK kami, Anda dapat berlangganan sebagian besar properti dan koleksi untuk diberi tahu saat nilai berubah.

Properti

Untuk berlangganan ke property changed peristiwa, gunakan kode berikut.

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

Koleksi

Untuk berlangganan ke collection updated peristiwa, gunakan kode berikut.

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

Langkah berikutnya