← Cloudflare Realtime / realtime / realtimekit / core
Управление участниками сессии
Используйте элементы управления организатора RealtimeKit, чтобы управлять другими участниками в живой сессии. Вы можете отключать звук или видео, закреплять участника или удалять участников из сессии. Для этих действий требуются особые разрешения на управление хостом, включённые в пресете локального участника Preset. Прежде чем показывать элементы управления интерфейсом или вызывать эти методы, убедитесь, что у локального участника есть необходимые разрешения. В этом руководстве локальный участник обозначает пользователя, выполняющего действия.
Выберите удалённого участника
Чтобы выполнить действия с конкретным участником, сначала нужно получить его объект участника.
Удалённые участники (остальные участники) доступны в meeting.participants. Локальный участник доступен в meeting.self.
См. Разбор объекта встречи для получения подробностей.
const joinedParticipants = meeting.participants.joined.toArray();
const participant = joinedParticipants[0];
if (!participant) {
// No remote participants are currently joined.
}Чтобы выполнить действия с конкретным участником, сначала нужно получить его объект участника.
Удалённые участники (остальные участники) доступны в meeting.participants. Локальный участник доступен в meeting.self.
См. Разбор объекта встречи для получения подробностей.
const joinedParticipants = meeting.participants.joined.toArray();
const participant = joinedParticipants[0];
if (!participant) {
// No remote participants are currently joined.
}Чтобы выполнить действия с конкретным участником, сначала нужно получить его объект участника.
Удалённые участники (остальные участники) доступны в meeting.participants. Локальный участник доступен в meeting.self.
См. Разбор объекта встречи для получения подробностей.
const joinedParticipants = meeting.participants.joined.toArray();
const participant = joinedParticipants[0];
if (!participant) {
// No remote participants are currently joined.
}Чтобы выполнить действия с конкретным участником, получите его объект участника из participants свойство.
Удаленные участники доступны в meeting.participants.joined. Локальный участник доступен в meeting.localUser.
val joinedParticipants = meeting.participants.joined
val participant = joinedParticipants.firstOrNull()
if (participant == null) {
// No remote participants are currently joined.
}Чтобы выполнить действия с конкретным участником, получите его объект участника из participants свойство.
Удаленные участники доступны в meeting.participants.joined. Локальный участник доступен в meeting.localUser.
let joinedParticipants = meeting.participants.joined
guard let participant = joinedParticipants.first else {
// No remote participants are currently joined.
return
}Чтобы выполнить действия с конкретным участником, получите его объект участника из participants свойство.
Удаленные участники доступны в meeting.participants.joined. Локальный участник доступен в meeting.self.
const joinedParticipants = meeting.participants.joined;
const participant = joinedParticipants.toArray()[0];
if (!participant) {
// No remote participants are currently joined.
}Или используйте useRealtimeKitSelector хук:
import { useRealtimeKitSelector } from '@cloudflare/realtimekit-react-native';
const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);Отключить звук
Отключайте звук участников, если нужно справиться с фоновым шумом, промодерировать занятие или вебинар либо предотвратить помехи во время сессии.
Для этого действия требуется Отключить звук (disable_participant_audio) с включённым в пресете локального участника разрешением на управление хостом.
Отключить звук участника
Чтобы отключить звук конкретного участника:
-
Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canMuteAudio = meeting.self.permissions.canDisableParticipantAudio === true; if (!canMuteAudio) { // Disable the control in your UI. } -
Вызовите
disableAudio()для целевого участника.Если у локального участника нет необходимого разрешения,
disableAudio()выбрасываетClientErrorс кодом1201.try { await participant.disableAudio(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to mute other participants’ audio. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у целевого участника
audioEnabledстановитсяfalse, и SDK создаёт событиеaudioUpdateсобытие.Вариант A: Слушайте события на объекте participant
participant.on("audioUpdate", ({ audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the participant });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on( "audioUpdate", (participant, { audioEnabled, audioTrack }) => { if (participant.id === targetParticipantId) { // audioEnabled is false // Update UI for the participant } }, );
-
Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canMuteAudio = meeting.self.permissions.canDisableParticipantAudio === true; if (!canMuteAudio) { // Disable the control in your UI. } -
Вызовите
disableAudio()для целевого участника.Если у локального участника нет необходимого разрешения,
disableAudio()выбрасываетClientErrorс кодом1201.try { await participant.disableAudio(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to mute other participants’ audio. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у целевого участника
audioEnabledстановитсяfalse, и SDK создаёт событиеaudioUpdateсобытие.Вариант A: Слушайте события на объекте participant
participant.on("audioUpdate", ({ audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the participant });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on( "audioUpdate", (participant, { audioEnabled, audioTrack }) => { if (participant.id === targetParticipantId) { // audioEnabled is false // Update UI for the participant } }, );
-
Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canMuteAudio = meeting.self.permissions.canDisableParticipantAudio === true; if (!canMuteAudio) { // Disable the control in your UI. } -
Вызовите
disableAudio()для целевого участника.Если у локального участника нет необходимого разрешения,
disableAudio()выбрасываетClientErrorс кодом1201.try { await participant.disableAudio(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to mute other participants’ audio. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у целевого участника
audioEnabledстановитсяfalse, и SDK создаёт событиеaudioUpdateсобытие.Вариант A: Слушайте события на объекте participant
participant.on("audioUpdate", ({ audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the participant });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on( "audioUpdate", (participant, { audioEnabled, audioTrack }) => { if (participant.id === targetParticipantId) { // audioEnabled is false // Update UI for the participant } }, );
- Проверьте, что у локального участника есть разрешение отключать звук у других участников.
val canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if (!canMuteAudio) {
// Disable the control in your UI.
}- Вызовите
disableAudio()для целевого участника. Если у локального участника нет необходимого разрешения,disableAudio()возвращаетHostError.
val error = participant.disableAudio()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
audioEnabledстановитсяfalse.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
// audioEnabled is false
// Update UI for the participant
}
})- Проверьте, что у локального участника есть разрешение отключать звук у других участников.
let canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if !canMuteAudio {
// Disable the control in your UI.
}- Вызовите
disableAudio()для целевого участника. Если у локального участника нет необходимого разрешения,disableAudio()возвращаетHostError.
if let error = participant.disableAudio() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
audioEnabledстановитсяfalse.
extension MeetingViewModel: RtkParticipantsEventListener {
func onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
// audioEnabled is false
// Update UI for the participant
}
}
// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)- Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canDisableParticipantAudio = meeting.self.permissions.canDisableParticipantAudio;
if (!canDisableParticipantAudio) {
// Disable the control in your UI.
}- Вызовите
disableAudio()для целевого участника.
participant
.disableAudio()
.catch((err) => {
// Handle error - permission denied or other issue.
console.log(err);
});- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
audioEnabledстановитсяfalse.
meeting.participants.joined.on('audioUpdate', (participant) => {
// participant.audioEnabled is false
// Update UI for the participant
});Отключить звук всех участников
Это затрагивает всех участников, включая локального участника. Чтобы отключить звук для всех участников сессии:
-
Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canMuteAudio = meeting.self.permissions.canDisableParticipantAudio === true; if (!canMuteAudio) { // Disable the control in your UI. } -
Вызовите
disableAllAudio().Если у локального участника нет необходимого разрешения,
disableAllAudio()выбрасываетClientErrorс кодом1201.try { await meeting.participants.disableAllAudio(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to mute other participants’ audio. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у каждого участника
audioEnabledстановитсяfalse, и SDK создаёт событиеaudioUpdateсобытие. Локальный участник также получаетaudioUpdateнаmeeting.self.Прослушивайте обновления удалённого участника на
joinedmap:meeting.participants.joined.on( "audioUpdate", (participant, { audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the participant }, );Прослушивайте обновление локального участника на
meeting.self:meeting.self.on("audioUpdate", ({ audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the local participant });
-
Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canMuteAudio = meeting.self.permissions.canDisableParticipantAudio === true; if (!canMuteAudio) { // Disable the control in your UI. } -
Вызовите
disableAllAudio().Если у локального участника нет необходимого разрешения,
disableAllAudio()выбрасываетClientErrorс кодом1201.try { await meeting.participants.disableAllAudio(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to mute other participants’ audio. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у каждого участника
audioEnabledстановитсяfalse, и SDK создаёт событиеaudioUpdateсобытие. Локальный участник также получаетaudioUpdateнаmeeting.self.Прослушивайте обновления удалённого участника на
joinedmap:meeting.participants.joined.on( "audioUpdate", (participant, { audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the participant }, );Прослушивайте обновление локального участника на
meeting.self:meeting.self.on("audioUpdate", ({ audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the local participant });
-
Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canMuteAudio = meeting.self.permissions.canDisableParticipantAudio === true; if (!canMuteAudio) { // Disable the control in your UI. } -
Вызовите
disableAllAudio().Если у локального участника нет необходимого разрешения,
disableAllAudio()выбрасываетClientErrorс кодом1201.try { await meeting.participants.disableAllAudio(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to mute other participants’ audio. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у каждого участника
audioEnabledстановитсяfalse, и SDK создаёт событиеaudioUpdateсобытие. Локальный участник также получаетaudioUpdateнаmeeting.self.Прослушивайте обновления удалённого участника на
joinedmap:meeting.participants.joined.on( "audioUpdate", (participant, { audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the participant }, );Прослушивайте обновление локального участника на
meeting.self:meeting.self.on("audioUpdate", ({ audioEnabled, audioTrack }) => { // audioEnabled is false // Update UI for the local participant });
- Проверьте, что у локального участника есть разрешение отключать звук у других участников.
val canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if (!canMuteAudio) {
// Disable the control in your UI.
}- Вызовите
disableAllAudio()для объекта participants. Если у локального участника нет необходимого разрешения,disableAllAudio()возвращаетHostError.
val error = meeting.participants.disableAllAudio()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника
audioEnabledстановитсяfalse.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
// audioEnabled is false
// Update UI for the participant
}
})- Проверьте, что у локального участника есть разрешение отключать звук у других участников.
let canMuteAudio = meeting.localUser.permissions.host.canMuteAudio
if !canMuteAudio {
// Disable the control in your UI.
}- Вызовите
disableAllAudio()для объекта participants. Если у локального участника нет необходимого разрешения,disableAllAudio()возвращаетHostError.
if let error = meeting.participants.disableAllAudio() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника
audioEnabledстановитсяfalse.
extension MeetingViewModel: RtkParticipantsEventListener {
func onAudioUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
// audioEnabled is false
// Update UI for the participant
}
}
// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)- Проверьте, что у локального участника есть разрешение отключать звук у других участников.
const canDisableParticipantAudio = meeting.self.permissions.canDisableParticipantAudio;
if (!canDisableParticipantAudio) {
// Disable the control in your UI.
}- Вызовите
disableAllAudio()для объекта participants.
meeting.participants
.disableAllAudio(true)
.catch((err) => {
// Handle error - permission denied or other issue.
console.log(err);
});- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника
audioEnabledстановитсяfalse.
meeting.participants.joined.on('audioUpdate', (participant) => {
// participant.audioEnabled is false
// Update UI for the participant
});Отключение видео
Отключайте видео участников, когда нужно модерировать сессию, обеспечить конфиденциальность или предотвратить нежелательное видео во время урока или вебинара.
Для этого действия требуется Отключить видео (disable_participant_video) с включённым в пресете локального участника разрешением на управление хостом.
Отключение видео участника
Чтобы отключить видео конкретного участника:
-
Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableVideo = meeting.self.permissions.canDisableParticipantVideo === true; if (!canDisableVideo) { // Disable the control in your UI. } -
Вызовите
disableVideo()для целевого участника.Если у локального участника нет необходимого разрешения,
disableVideo()выбрасываетClientErrorс кодом1201.try { await participant.disableVideo(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to disable other participants’ video. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у целевого участника
videoEnabledстановитсяfalse, и SDK создаёт событиеvideoUpdateсобытие.Вариант A: Слушайте события на объекте participant
participant.on("videoUpdate", ({ videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on( "videoUpdate", (participant, { videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant }, );
-
Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableVideo = meeting.self.permissions.canDisableParticipantVideo === true; if (!canDisableVideo) { // Disable the control in your UI. } -
Вызовите
disableVideo()для целевого участника.Если у локального участника нет необходимого разрешения,
disableVideo()выбрасываетClientErrorс кодом1201.try { await participant.disableVideo(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to disable other participants’ video. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у целевого участника
videoEnabledстановитсяfalse, и SDK создаёт событиеvideoUpdateсобытие.Вариант A: Слушайте события на объекте participant
participant.on("videoUpdate", ({ videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on( "videoUpdate", (participant, { videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant }, );
-
Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableVideo = meeting.self.permissions.canDisableParticipantVideo === true; if (!canDisableVideo) { // Disable the control in your UI. } -
Вызовите
disableVideo()для целевого участника.Если у локального участника нет необходимого разрешения,
disableVideo()выбрасываетClientErrorс кодом1201.try { await participant.disableVideo(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to disable other participants’ video. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у целевого участника
videoEnabledстановитсяfalse, и SDK создаёт событиеvideoUpdateсобытие.Вариант A: Слушайте события на объекте participant
participant.on("videoUpdate", ({ videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on( "videoUpdate", (participant, { videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant }, );
- Проверьте, что у локального участника есть разрешение отключать видео у других участников.
val canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if (!canMuteVideo) {
// Disable the control in your UI.
}- Вызовите
disableVideo()для целевого участника. Если у локального участника нет необходимого разрешения,disableVideo()возвращаетHostError.
val error = participant.disableVideo()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
videoEnabledстановитсяfalse.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
// videoEnabled is false
// Update UI for the participant
}
})- Проверьте, что у локального участника есть разрешение отключать видео у других участников.
let canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if !canMuteVideo {
// Disable the control in your UI.
}- Вызовите
disableVideo()для целевого участника. Если у локального участника нет необходимого разрешения,disableVideo()возвращаетHostError.
if let error = participant.disableVideo() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
videoEnabledстановитсяfalse.
extension MeetingViewModel: RtkParticipantsEventListener {
func onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
// videoEnabled is false
// Update UI for the participant
}
}
// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)- Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableParticipantVideo = meeting.self.permissions.canDisableParticipantVideo;
if (!canDisableParticipantVideo) {
// Disable the control in your UI.
}- Вызовите
disableVideo()для целевого участника.
participant
.disableVideo()
.catch((err) => {
// Handle error - permission denied or other issue.
console.log(err);
});- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
videoEnabledстановитсяfalse.
meeting.participants.joined.on('videoUpdate', (participant) => {
// participant.videoEnabled is false
// Update UI for the participant
});Отключение видео всех участников
Это затрагивает всех участников, включая локального участника. Чтобы отключить видео для всех участников сессии:
-
Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableVideo = meeting.self.permissions.canDisableParticipantVideo === true; if (!canDisableVideo) { // Disable the control in your UI. } -
Вызовите
disableAllVideo().Если у локального участника нет необходимого разрешения,
disableAllVideo()выбрасываетClientErrorс кодом1201.try { await meeting.participants.disableAllVideo(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to disable other participants’ video. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у каждого участника
videoEnabledстановитсяfalse, и SDK создаёт событиеvideoUpdateсобытие. Локальный участник также получаетvideoUpdateнаmeeting.self.Прослушивайте обновления удалённого участника на
joinedmap:meeting.participants.joined.on( "videoUpdate", (participant, { videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant }, );Прослушивайте обновление локального участника на
meeting.self:meeting.self.on("videoUpdate", ({ videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the local participant });
-
Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableVideo = meeting.self.permissions.canDisableParticipantVideo === true; if (!canDisableVideo) { // Disable the control in your UI. } -
Вызовите
disableAllVideo().Если у локального участника нет необходимого разрешения,
disableAllVideo()выбрасываетClientErrorс кодом1201.try { await meeting.participants.disableAllVideo(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to disable other participants’ video. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у каждого участника
videoEnabledстановитсяfalse, и SDK создаёт событиеvideoUpdateсобытие. Локальный участник также получаетvideoUpdateнаmeeting.self.Прослушивайте обновления удалённого участника на
joinedmap:meeting.participants.joined.on( "videoUpdate", (participant, { videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant }, );Прослушивайте обновление локального участника на
meeting.self:meeting.self.on("videoUpdate", ({ videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the local participant });
-
Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableVideo = meeting.self.permissions.canDisableParticipantVideo === true; if (!canDisableVideo) { // Disable the control in your UI. } -
Вызовите
disableAllVideo().Если у локального участника нет необходимого разрешения,
disableAllVideo()выбрасываетClientErrorс кодом1201.try { await meeting.participants.disableAllVideo(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to disable other participants’ video. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова у каждого участника
videoEnabledстановитсяfalse, и SDK создаёт событиеvideoUpdateсобытие. Локальный участник также получаетvideoUpdateнаmeeting.self.Прослушивайте обновления удалённого участника на
joinedmap:meeting.participants.joined.on( "videoUpdate", (participant, { videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the participant }, );Прослушивайте обновление локального участника на
meeting.self:meeting.self.on("videoUpdate", ({ videoEnabled, videoTrack }) => { // videoEnabled is false // Update UI for the local participant });
- Проверьте, что у локального участника есть разрешение отключать видео у других участников.
val canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if (!canMuteVideo) {
// Disable the control in your UI.
}- Вызовите
disableAllVideo()для объекта participants. Если у локального участника нет необходимого разрешения,disableAllVideo()возвращаетHostError.
val error = meeting.participants.disableAllVideo()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника
videoEnabledстановитсяfalse.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
// videoEnabled is false
// Update UI for the participant
}
})- Проверьте, что у локального участника есть разрешение отключать видео у других участников.
let canMuteVideo = meeting.localUser.permissions.host.canMuteVideo
if !canMuteVideo {
// Disable the control in your UI.
}- Вызовите
disableAllVideo()для объекта participants. Если у локального участника нет необходимого разрешения,disableAllVideo()возвращаетHostError.
if let error = meeting.participants.disableAllVideo() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника
videoEnabledстановитсяfalse.
extension MeetingViewModel: RtkParticipantsEventListener {
func onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
// videoEnabled is false
// Update UI for the participant
}
}
// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)- Проверьте, что у локального участника есть разрешение отключать видео у других участников.
const canDisableParticipantVideo = meeting.self.permissions.canDisableParticipantVideo;
if (!canDisableParticipantVideo) {
// Disable the control in your UI.
}- Вызовите
disableAllVideo()для объекта participants.
meeting.participants
.disableAllVideo(true)
.catch((err) => {
// Handle error - permission denied or other issue.
console.log(err);
});- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у каждого участника
videoEnabledстановитсяfalse.
meeting.participants.joined.on('videoUpdate', (participant) => {
// participant.videoEnabled is false
// Update UI for the participant
});Закрепление участников
Закрепите участника, чтобы выделить его, например ведущего вебинара или преподавателя. Это действие распространяется на всю сессию: закреплённого участника увидят в фокусе все участники.
Для этого действия требуется Закрепить участника (pin_participant) с включённым в пресете локального участника разрешением на управление хостом.
Закрепление участника
Чтобы закрепить участника в сессии:
-
Проверьте, что у локального участника есть разрешение закреплять участников.
const canPinParticipant = meeting.self.permissions.pinParticipant === true; if (!canPinParticipant) { // Disable the control in your UI. } -
Вызовите
pin()для целевого участника.Если у локального участника нет необходимого разрешения,
pin()выбрасываетClientErrorс кодом1201.try { await participant.pin(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to pin participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Целевого участника
isPinnedстановится true. - Участник добавляется в
meeting.participants.pinned. - SDK генерирует
pinnedсобытие.
Вариант A: Слушайте события на объекте participant
participant.on("pinned", (updatedParticipant) => { // updatedParticipant.isPinned is true // Update your UI. });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on("pinned", (updatedParticipant) => { // updatedParticipant.isPinned is true // Update your UI. });Если ранее уже был закреплённый участник, SDK генерирует
unpinnedсобытие для этого участника. - Целевого участника
-
На стороне закреплённого участника,
meeting.self.isPinnedстановитсяtrueиmeeting.selfгенерируетpinned:meeting.self.on("pinned", (selfParticipant) => { // Update the local UI to indicate the participant is pinned. });
-
Проверьте, что у локального участника есть разрешение закреплять участников.
const canPinParticipant = meeting.self.permissions.pinParticipant === true; if (!canPinParticipant) { // Disable the control in your UI. } -
Вызовите
pin()для целевого участника.Если у локального участника нет необходимого разрешения,
pin()выбрасываетClientErrorс кодом1201.try { await participant.pin(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to pin participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Целевого участника
isPinnedстановится true. - Участник добавляется в
meeting.participants.pinned. - SDK генерирует
pinnedсобытие.
Вариант A: Слушайте события на объекте participant
participant.on("pinned", (updatedParticipant) => { // updatedParticipant.isPinned is true // Update your UI. });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on("pinned", (updatedParticipant) => { // updatedParticipant.isPinned is true // Update your UI. });Если ранее уже был закреплённый участник, SDK генерирует
unpinnedсобытие для этого участника. - Целевого участника
-
На стороне закреплённого участника,
meeting.self.isPinnedстановитсяtrueиmeeting.selfгенерируетpinned:meeting.self.on("pinned", (selfParticipant) => { // Update the local UI to indicate the participant is pinned. });
-
Проверьте, что у локального участника есть разрешение закреплять участников.
const canPinParticipant = meeting.self.permissions.pinParticipant === true; if (!canPinParticipant) { // Disable the control in your UI. } -
Вызовите
pin()для целевого участника.Если у локального участника нет необходимого разрешения,
pin()выбрасываетClientErrorс кодом1201.try { await participant.pin(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to pin participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Целевого участника
isPinnedстановится true. - Участник добавляется в
meeting.participants.pinned. - SDK генерирует
pinnedсобытие.
Вариант A: Слушайте события на объекте participant
participant.on("pinned", (updatedParticipant) => { // updatedParticipant.isPinned is true // Update your UI. });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on("pinned", (updatedParticipant) => { // updatedParticipant.isPinned is true // Update your UI. });Если ранее уже был закреплённый участник, SDK генерирует
unpinnedсобытие для этого участника. - Целевого участника
-
На стороне закреплённого участника,
meeting.self.isPinnedстановитсяtrueиmeeting.selfгенерируетpinned:meeting.self.on("pinned", (selfParticipant) => { // Update the local UI to indicate the participant is pinned. });
- Проверьте, что у локального участника есть разрешение закреплять участников.
val canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if (!canPinParticipant) {
// Disable the control in your UI.
}- Вызовите
pin()для целевого участника. Если у локального участника нет необходимого разрешения,pin()возвращаетHostError.
val error = participant.pin()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
isPinnedстановитсяtrueа участник доступен вmeeting.participants.pinned.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantPinned(participant: RtkRemoteParticipant) {
// participant.isPinned is true
// Update your UI.
}
})- Проверьте, что у локального участника есть разрешение закреплять участников.
let canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if !canPinParticipant {
// Disable the control in your UI.
}- Вызовите
pin()для целевого участника. Если у локального участника нет необходимого разрешения,pin()возвращаетHostError.
if let error = participant.pin() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
isPinnedстановитсяtrueа участник доступен вmeeting.participants.pinned.
extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantPinned(participant: RtkRemoteParticipant) {
// participant.isPinned is true
// Update your UI.
}
}
// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)- Проверьте, что у локального участника есть разрешение закреплять участников.
const canPinParticipant = meeting.self.permissions.pinParticipant;
if (!canPinParticipant) {
// Disable the control in your UI.
}- Вызовите
pin()для целевого участника.
participant.pin();- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
isPinnedстановитсяtrueа участник доступен вmeeting.participants.pinned.
meeting.participants.pinned.on('participantPinned', (participant) => {
// participant.isPinned is true
// Update your UI.
});Открепление участника
Открепите участника, если нужно отменить выделение и вернуть сессию к обычной сетке или представлению активного спикера. Чтобы открепить закреплённого участника в сессии:
-
Проверьте, что у локального участника есть разрешение откреплять участников.
const canUnpinParticipant = meeting.self.permissions.pinParticipant === true; if (!canUnpinParticipant) { // Disable the control in your UI. } -
Вызовите
unpin()для целевого участника.Если у локального участника нет необходимого разрешения,
unpin()выбрасываетClientErrorс кодом1201.try { await participant.unpin(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to unpin participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Целевого участника
isPinnedстановитсяfalse. - Участник удаляется из
meeting.participants.pinned. - SDK генерирует
unpinnedсобытие.
Вариант A: Слушайте события на объекте participant
participant.on("unpinned", (updatedParticipant) => { // updatedParticipant.isPinned is false // Update your UI. });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on("unpinned", (updatedParticipant) => { // updatedParticipant.isPinned is false // Update your UI. }); - Целевого участника
-
На стороне откреплённого участника,
meeting.self.isPinnedстановитсяfalseиmeeting.selfгенерируетunpinned:meeting.self.on("unpinned", (selfParticipant) => { // Update the local UI to indicate the participant is no longer pinned. });
-
Проверьте, что у локального участника есть разрешение откреплять участников.
const canUnpinParticipant = meeting.self.permissions.pinParticipant === true; if (!canUnpinParticipant) { // Disable the control in your UI. } -
Вызовите
unpin()для целевого участника.Если у локального участника нет необходимого разрешения,
unpin()выбрасываетClientErrorс кодом1201.try { await participant.unpin(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to unpin participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Целевого участника
isPinnedстановитсяfalse. - Участник удаляется из
meeting.participants.pinned. - SDK генерирует
unpinnedсобытие.
Вариант A: Слушайте события на объекте participant
participant.on("unpinned", (updatedParticipant) => { // updatedParticipant.isPinned is false // Update your UI. });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on("unpinned", (updatedParticipant) => { // updatedParticipant.isPinned is false // Update your UI. }); - Целевого участника
-
На стороне откреплённого участника,
meeting.self.isPinnedстановитсяfalseиmeeting.selfгенерируетunpinned:meeting.self.on("unpinned", (selfParticipant) => { // Update the local UI to indicate the participant is no longer pinned. });
-
Проверьте, что у локального участника есть разрешение откреплять участников.
const canUnpinParticipant = meeting.self.permissions.pinParticipant === true; if (!canUnpinParticipant) { // Disable the control in your UI. } -
Вызовите
unpin()для целевого участника.Если у локального участника нет необходимого разрешения,
unpin()выбрасываетClientErrorс кодом1201.try { await participant.unpin(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to unpin participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Целевого участника
isPinnedстановитсяfalse. - Участник удаляется из
meeting.participants.pinned. - SDK генерирует
unpinnedсобытие.
Вариант A: Слушайте события на объекте participant
participant.on("unpinned", (updatedParticipant) => { // updatedParticipant.isPinned is false // Update your UI. });Вариант B: Слушайте события на
joinedmapmeeting.participants.joined.on("unpinned", (updatedParticipant) => { // updatedParticipant.isPinned is false // Update your UI. }); - Целевого участника
-
На стороне откреплённого участника,
meeting.self.isPinnedстановитсяfalseиmeeting.selfгенерируетunpinned:meeting.self.on("unpinned", (selfParticipant) => { // Update the local UI to indicate the participant is no longer pinned. });
- Проверьте, что у локального участника есть разрешение откреплять участников.
val canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if (!canPinParticipant) {
// Disable the control in your UI.
}- Вызовите
unpin()для целевого участника. Если у локального участника нет необходимого разрешения,unpin()возвращаетHostError.
val error = participant.unpin()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
isPinnedстановитсяfalse.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantUnpinned(participant: RtkRemoteParticipant) {
// participant.isPinned is false
// Update your UI.
}
})- Проверьте, что у локального участника есть разрешение откреплять участников.
let canPinParticipant = meeting.localUser.permissions.host.canPinParticipant
if !canPinParticipant {
// Disable the control in your UI.
}- Вызовите
unpin()для целевого участника. Если у локального участника нет необходимого разрешения,unpin()возвращаетHostError.
if let error = participant.unpin() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
isPinnedстановитсяfalse.
extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantUnpinned(participant: RtkRemoteParticipant) {
// participant.isPinned is false
// Update your UI.
}
}
// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)- Проверьте, что у локального участника есть разрешение откреплять участников.
const canPinParticipant = meeting.self.permissions.pinParticipant;
if (!canPinParticipant) {
// Disable the control in your UI.
}- Вызовите
unpin()для целевого участника.
participant.unpin();- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова у целевого участника
isPinnedстановитсяfalse.
meeting.participants.pinned.on('unpinned', (participant) => {
// participant.isPinned is false
// Update your UI.
});Удалите участников
Удаляйте участников из сессии, когда нужно пресекать деструктивное поведение или обеспечивать соблюдение правил сессии.
Для этого действия в пресете локального участника должно быть включено право хоста Удаление участников (kick_participant) с включённым в пресете локального участника разрешением на управление хостом.
Удалите участника
Чтобы удалить конкретного участника из сессии:
-
Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant === true; if (!canKickParticipant) { // Disable the control in your UI. } -
Вызовите
kick()для целевого участника.Если у локального участника нет необходимого разрешения,
kick()выбрасываетClientErrorс кодом1201.try { await participant.kick(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to remove participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Исключённый участник удаляется из
meeting.participants.joined. - Участник удаляется из других map участников, в которых он находился (например,
meeting.participants.pinned). - SDK генерирует
participantLeftнаmeeting.participants.joined.
meeting.participants.joined.on("participantLeft", (participant) => { // Remove the participant tile from the UI. });Об уходе участника узнают и другие участники сессии благодаря
participantLeft. - Исключённый участник удаляется из
-
На стороне удалённого участника сессия отключается, и
meeting.selfгенерируетroomLeftсобытие с состоянием, равнымkicked.meeting.self.on("roomLeft", ({ state }) => { if (state === "kicked") { // Show a message and navigate the user out of the meeting UI. } });
-
Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant === true; if (!canKickParticipant) { // Disable the control in your UI. } -
Вызовите
kick()для целевого участника.Если у локального участника нет необходимого разрешения,
kick()выбрасываетClientErrorс кодом1201.try { await participant.kick(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to remove participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Исключённый участник удаляется из
meeting.participants.joined. - Участник удаляется из других map участников, в которых он находился (например,
meeting.participants.pinned). - SDK генерирует
participantLeftнаmeeting.participants.joined.
meeting.participants.joined.on("participantLeft", (participant) => { // Remove the participant tile from the UI. });Об уходе участника узнают и другие участники сессии благодаря
participantLeft. - Исключённый участник удаляется из
-
На стороне удалённого участника сессия отключается, и
meeting.selfгенерируетroomLeftсобытие с состоянием, равнымkicked.meeting.self.on("roomLeft", ({ state }) => { if (state === "kicked") { // Show a message and navigate the user out of the meeting UI. } });
-
Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant === true; if (!canKickParticipant) { // Disable the control in your UI. } -
Вызовите
kick()для целевого участника.Если у локального участника нет необходимого разрешения,
kick()выбрасываетClientErrorс кодом1201.try { await participant.kick(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to remove participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова:
- Исключённый участник удаляется из
meeting.participants.joined. - Участник удаляется из других map участников, в которых он находился (например,
meeting.participants.pinned). - SDK генерирует
participantLeftнаmeeting.participants.joined.
meeting.participants.joined.on("participantLeft", (participant) => { // Remove the participant tile from the UI. });Об уходе участника узнают и другие участники сессии благодаря
participantLeft. - Исключённый участник удаляется из
-
На стороне удалённого участника сессия отключается, и
meeting.selfгенерируетroomLeftсобытие с состоянием, равнымkicked.meeting.self.on("roomLeft", ({ state }) => { if (state === "kicked") { // Show a message and navigate the user out of the meeting UI. } });
- Проверьте, что у локального участника есть разрешение удалять участников.
val canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if (!canKickParticipant) {
// Disable the control in your UI.
}- Вызовите
kick()для целевого участника. Если у локального участника нет необходимого разрешения,kick()возвращаетHostError.
val error = participant.kick()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова исключенный участник удаляется из
meeting.participants.joined.
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantLeave(participant: RtkRemoteParticipant) {
// Remove the participant tile from the UI.
}
})- Проверьте, что у локального участника есть разрешение удалять участников.
let canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if !canKickParticipant {
// Disable the control in your UI.
}- Вызовите
kick()для целевого участника. Если у локального участника нет необходимого разрешения,kick()возвращаетHostError.
if let error = participant.kick() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова исключенный участник удаляется из
meeting.participants.joined.
extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantLeave(participant: RtkRemoteParticipant) {
// Remove the participant tile from the UI.
}
}
// Register the listener
meeting.addParticipantsEventListener(participantsEventListener: self)- Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant;
if (!canKickParticipant) {
// Disable the control in your UI.
}- Вызовите
kick()для целевого участника.
participant
.kick()
.catch((err) => {
// Handle error - permission denied or other issue.
console.log(err);
});- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова исключенный участник удаляется из
meeting.participants.joined.
meeting.participants.joined.on('participantLeft', (participant) => {
// Remove the participant tile from the UI.
});Удалите всех участников
Это удаляет всех из сессии, включая локального участника. Это завершает сессию для всех.
Полное описание процесса завершения сессии см. в Завершение сессии.
Чтобы удалить всех участников из сессии:
-
Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant === true; if (!canKickParticipant) { // Disable the control in your UI. } -
Вызовите
kickAll().Если у локального участника нет необходимого разрешения,
kickAll()выбрасываетClientErrorс кодом1201.try { await meeting.participants.kickAll(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to remove participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова все участники выходят из сессии. На каждом клиенте
meeting.selfгенерируетroomLeftс состоянием, установленным вended.meeting.self.on("roomLeft", ({ state }) => { if (state === "ended") { // Show a message and navigate the user out of the meeting UI. } });
-
Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant === true; if (!canKickParticipant) { // Disable the control in your UI. } -
Вызовите
kickAll().Если у локального участника нет необходимого разрешения,
kickAll()выбрасываетClientErrorс кодом1201.try { await meeting.participants.kickAll(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to remove participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова все участники выходят из сессии. На каждом клиенте
meeting.selfгенерируетroomLeftс состоянием, установленным вended.meeting.self.on("roomLeft", ({ state }) => { if (state === "ended") { // Show a message and navigate the user out of the meeting UI. } });
-
Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant === true; if (!canKickParticipant) { // Disable the control in your UI. } -
Вызовите
kickAll().Если у локального участника нет необходимого разрешения,
kickAll()выбрасываетClientErrorс кодом1201.try { await meeting.participants.kickAll(); } catch (err: any) { if (err?.code === 1201) { // The local participant does not have permission to remove participants. return; } throw err; } -
Обработайте результат, подписавшись на обновления.
После успешного завершения вызова все участники выходят из сессии. На каждом клиенте
meeting.selfгенерируетroomLeftс состоянием, установленным вended.meeting.self.on("roomLeft", ({ state }) => { if (state === "ended") { // Show a message and navigate the user out of the meeting UI. } });
- Проверьте, что у локального участника есть разрешение удалять участников.
val canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if (!canKickParticipant) {
// Disable the control in your UI.
}- Вызовите
kickAll()для объекта participants. Если у локального участника нет необходимого разрешения,kickAll()возвращаетHostError.
val error = meeting.participants.kickAll()
if (error != null) {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова все участники покидают сессию.
meeting.addMeetingRoomEventListener(object : RtkMeetingRoomEventListener {
override fun onMeetingEnded() {
// Show a message and navigate the user out of the meeting UI.
}
})- Проверьте, что у локального участника есть разрешение удалять участников.
let canKickParticipant = meeting.localUser.permissions.host.canKickParticipant
if !canKickParticipant {
// Disable the control in your UI.
}- Вызовите
kickAll()для объекта participants. Если у локального участника нет необходимого разрешения,kickAll()возвращаетHostError.
if let error = meeting.participants.kickAll() {
// Handle error - permission denied.
}- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова все участники покидают сессию.
extension MeetingViewModel: RtkMeetingRoomEventListener {
func onMeetingEnded() {
// Show a message and navigate the user out of the meeting UI.
}
}
// Register the listener
meeting.addMeetingRoomEventListener(meetingRoomEventListener: self)- Проверьте, что у локального участника есть разрешение удалять участников.
const canKickParticipant = meeting.self.permissions.kickParticipant;
if (!canKickParticipant) {
// Disable the control in your UI.
}- Вызовите
kickAll()для объекта participants.
meeting.participants
.kickAll()
.catch((err) => {
// Handle error - permission denied or other issue.
console.log(err);
});- Обработайте результат, подписавшись на обновления. После успешного выполнения вызова все участники покидают сессию.
meeting.self.on('roomLeft', ({ state }) => {
if (state === 'kicked') {
// Show a message and navigate the user out of the meeting UI.
}
});Следующие шаги
- Подробнее о том, как пресеты управляют разрешениями, см. в Preset.
- Подробнее об обработке ошибок см. в Коды ошибок.