Panduan ini menjelaskan cara mengintegrasikan kit pengembangan perangkat lunak (SDK) Alibaba Real-Time Communication (ARTC) ke dalam proyek iOS Anda untuk membangun aplikasi audio dan video real-time, yang cocok untuk kasus penggunaan seperti streaming langsung interaktif dan panggilan video.
Deskripsi fitur
Sebelum memulai, pahami konsep-konsep utama berikut:
ARTC SDK: Kit pengembangan perangkat lunak (SDK) dari Alibaba Cloud yang membantu developer mengimplementasikan fitur audio dan video real-time.
GRTN: Global Real-time Transport Network dari Alibaba Cloud yang menyediakan layanan komunikasi audio dan video dengan latensi ultra-rendah, kualitas tinggi, dan aman.
Channel: Ruang virtual tempat pengguna bergabung untuk berkomunikasi. Semua pengguna dalam channel yang sama dapat berinteraksi secara real-time.
Host: Pengguna yang dapat menerbitkan aliran audio dan video di dalam channel serta berlangganan aliran yang diterbitkan oleh host lain.
Viewer: Pengguna yang dapat berlangganan aliran audio dan video di dalam channel tetapi tidak dapat menerbitkan aliran.
Proses dasar untuk mengimplementasikan interaksi audio dan video real-time adalah sebagai berikut:
Untuk bergabung ke channel, panggil setChannelProfile guna mengatur profil channel, lalu panggil
joinChannel.Skenario panggilan video: Semua pengguna adalah host dan dapat menerbitkan serta berlangganan aliran.
Skenario streaming langsung interaktif: Panggil
setClientRoleuntuk mengatur peran pengguna. Atur peran menjadi host bagi pengguna yang perlu menerbitkan aliran, dan viewer bagi pengguna yang hanya perlu berlangganan aliran.
Setelah bergabung ke channel, perilaku penerbitan dan langganan pengguna ditentukan oleh perannya:
Semua pengguna di dalam channel dapat menerima aliran audio dan video.
Host dapat menerbitkan aliran audio dan video di dalam channel.
Jika viewer perlu menerbitkan aliran, panggil metode
setClientRoleuntuk mengubah perannya menjadi host.
Proyek contoh
ARTC SDK menyediakan proyek contoh open-source untuk aplikasi audio dan video real-time.
Persyaratan lingkungan
Sebelum menjalankan proyek demo, pastikan lingkungan pengembangan Anda memenuhi persyaratan berikut:
Tool pengembangan: Xcode 14.0 atau versi lebih baru. Disarankan menggunakan versi resmi terbaru.
Konfigurasi yang direkomendasikan: CocoaPods 1.9.3 atau versi lebih baru.
Perangkat uji: Perangkat yang menjalankan iOS 9.0 atau versi lebih baru.
Kami merekomendasikan penggunaan perangkat fisik untuk pengujian karena emulator mungkin tidak mendukung semua fitur.
Jaringan: Koneksi Internet yang stabil.
Pengaturan aplikasi: Dapatkan AppID dan AppKey dari aplikasi ARTC.
Buat proyek (opsional)
Bagian ini menjelaskan cara membuat proyek baru dan menambahkan izin yang diperlukan untuk interaksi audio dan video. Anda dapat melewati bagian ini jika sudah memiliki proyek.
Buka Xcode, pilih File > New > Project, lalu pilih templat App. Pada layar berikutnya, atur Interface ke Storyboard dan Language ke Swift.

Konfigurasikan pengaturan proyek sesuai kebutuhan, termasuk
Bundle Identifier,Signing, danMinimum Deployments.
Konfigurasi proyek Anda
Langkah 1: Impor SDK
Integrasi otomatis menggunakan CocoaPods (direkomendasikan)
Buka Terminal dan instal CocoaPods pada perangkat pengembangan Anda. Jika sudah terinstal, langkah ini dapat dilewati.
sudo gem install cocoapodsBuka Terminal, arahkan ke direktori root proyek Anda, lalu jalankan perintah berikut untuk membuat Podfile:
pod initBuka dan edit Podfile yang dihasilkan untuk menambahkan dependensi pada ARTC SDK. Versi terbaru adalah 7.9.1.
target 'MyApp' do
use_frameworks!
# Ganti ${latest version} dengan nomor versi spesifik.
pod 'AliVCSDK_ARTC', '~> ${latest version}'
endDi jendela Terminal, jalankan perintah berikut untuk memperbarui library dependensi CocoaPods dalam proyek Anda.
pod installSetelah perintah berhasil dijalankan, file proyek dengan ekstensi .xcworkspace akan dihasilkan di folder proyek. Klik ganda file ini untuk membuka proyek di Xcode. Workspace tersebut secara otomatis memuat dependensi CocoaPods yang telah diintegrasikan.

Integrasi manual dengan mengunduh SDK
Di bagian SDK downloads, unduh file ARTC SDK terbaru dan ekstrak.
Salin file framework dari paket SDK yang telah diekstrak ke direktori proyek Anda.
Buka proyek Anda di Xcode. Pilih
File -> Add Files to "xxx"untuk menambahkan file library SDK ke proyek Anda.
Pilih target dan atur file framework yang diimpor ke
"Embed & Sign".

Langkah 2: Atur izin
Tambahkan izin kamera dan mikrofon.
Pada file Info.plist, tambahkan entri Privacy - Camera Usage Description dan Privacy - Microphone Usage Description.

Aktifkan mode pengambilan audio latar belakang. (Opsional)
Pilih Audio, AirPlay, and Picture in Picture seperti yang ditunjukkan pada gambar berikut.

Langkah 3: Buat antarmuka pengguna
Buat antarmuka pengguna yang sesuai dengan skenario interaksi real-time Anda. Misalnya, dalam panggilan video multipihak, Anda dapat membuat ScrollView. Saat pengguna bergabung ke panggilan, tambahkan tampilan video ke kontainer ini. Saat pengguna keluar, hapus tampilan videonya dan perbarui tata letak.
Implementasi
Bagian ini menjelaskan cara menggunakan ARTC SDK untuk membangun aplikasi audio dan video real-time dasar. Anda dapat menyalin contoh kode lengkap ke dalam proyek Anda untuk menguji fungsionalitasnya. Langkah-langkah di bawah ini menjelaskan pemanggilan API inti.
Diagram berikut menunjukkan alur kerja dasar untuk mengimplementasikan panggilan video:
Berikut adalah kode referensi lengkap untuk panggilan video dasar:
Untuk kode contoh lengkap, lihat Jalankan demo ARTC untuk iOS.
1. Minta izin
Meskipun SDK memeriksa izin yang diperlukan saat Anda memulai panggilan, kami merekomendasikan memeriksa izin kamera dan mikrofon sebelum memulai panggilan untuk memastikan pengalaman pengguna yang lancar.
func checkMicrophonePermission(completion: @escaping (Bool) -> Void) {
let status = AVCaptureDevice.authorizationStatus(for: .audio)
switch status {
case .notDetermined:
AVCaptureDevice.requestAccess(for: .audio) { granted in
completion(granted)
}
case .authorized:
completion(true)
default:
completion(false)
}
}
func checkCameraPermission(completion: @escaping (Bool) -> Void) {
let status = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { granted in
completion(granted)
}
case .authorized:
completion(true)
default:
completion(false)
}
}
// Contoh penggunaan
checkMicrophonePermission { granted in
if granted {
print("Akses mikrofon diberikan.")
} else {
print("Akses mikrofon ditolak.")
}
}
checkCameraPermission { granted in
if granted {
print("Akses kamera diberikan.")
} else {
print("Akses kamera ditolak.")
}
}
2. Dapatkan token autentikasi
Bergabung ke channel ARTC memerlukan token autentikasi untuk memverifikasi identitas pengguna. Untuk informasi lebih lanjut tentang cara pembuatan token, lihat Autentikasi berbasis token. Token dapat dihasilkan menggunakan metode satu parameter atau multi-parameter. Metode yang Anda gunakan menentukan API joinChannel mana yang perlu Anda panggil.
Untuk lingkungan produksi:
Karena pembuatan token memerlukan AppKey Anda, hardcoding-nya di sisi client menimbulkan risiko keamanan. Di lingkungan produksi, kami sangat merekomendasikan menghasilkan token di server Anda dan mengirimkannya ke client.
Untuk pengembangan dan debugging:
Saat pengembangan, jika server bisnis Anda belum memiliki logika untuk menghasilkan token, Anda dapat sementara menggunakan logika pembuatan token dari APIExample untuk membuat token sementara. Kode referensinya sebagai berikut:
class ARTCTokenHelper: NSObject {
/**
* RTC AppId
*/
public static let AppId = "<RTC AppId>"
/**
* RTC AppKey
*/
public static let AppKey = "<RTC AppKey>"
/**
* Hasilkan token multi-parameter untuk bergabung ke channel berdasarkan channelId, userId, dan timestamp.
*/
public func generateAuthInfoToken(appId: String = ARTCTokenHelper.AppId, appKey: String = ARTCTokenHelper.AppKey, channelId: String, userId: String, timestamp: Int64) -> String {
let stringBuilder = appId + appKey + channelId + userId + "\(timestamp)"
let token = ARTCTokenHelper.GetSHA256(stringBuilder)
return token
}
/**
* Hasilkan token satu parameter untuk bergabung ke channel berdasarkan channelId, userId, dan nonce.
*/
public func generateJoinToken(appId: String = ARTCTokenHelper.AppId, appKey: String = ARTCTokenHelper.AppKey, channelId: String, userId: String, timestamp: Int64, nonce: String = "") -> String {
let token = self.generateAuthInfoToken(appId: appId, appKey: appKey, channelId: channelId, userId: userId, timestamp: timestamp)
let tokenJson: [String: Any] = [
"appid": appId,
"channelid": channelId,
"userid": userId,
"nonce": nonce,
"timestamp": timestamp,
"token": token
]
if let jsonData = try? JSONSerialization.data(withJSONObject: tokenJson, options: []),
let base64Token = jsonData.base64EncodedString() as String? {
return base64Token
}
return ""
}
/**
* Tanda tangani string menggunakan SHA256.
*/
private static func GetSHA256(_ input: String) -> String {
// Konversi string input ke data.
let data = Data(input.utf8)
// Buat buffer untuk menyimpan hasil hash.
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
// Hitung hash SHA-256.
data.withUnsafeBytes {
_ = CC_SHA256($0.baseAddress, CC_LONG(data.count), &hash)
}
// Konversi hash ke string heksadesimal.
return hash.map { String(format: "%02hhx", $0) }.joined()
}
}
3. Impor komponen ARTC SDK
// Impor modul ARTC.
import AliVCSDK_ARTC4. Buat dan inisialisasi engine
Buat engine RTC
Panggil metode
<a baseurl="t2974573_v2_2_1.xdita" data-node="4087266" data-root="16090" data-tag="xref" href="t2309850.xdita#2db21d4f16s77" id="ec8b2fb525ugj">sharedInstance</a>untuk membuat instansAliRTCEngine.private var rtcEngine: AliRtcEngine? = nil // Buat engine dan atur delegate. let engine = AliRtcEngine.sharedInstance(self, extras:nil) ... self.rtcEngine = engineInisialisasi engine
Panggil
setChannelProfileuntuk mengatur channel keAliRTCInteractiveLive(mode interaktif).Bergantung pada kebutuhan bisnis Anda, Anda dapat memilih mode interaktif, yang cocok untuk skenario hiburan interaktif, atau mode komunikasi, yang cocok untuk panggilan satu lawan satu atau satu lawan banyak. Memilih mode yang tepat memastikan pengalaman pengguna yang lancar dan penggunaan sumber daya jaringan yang efisien.
Mode
Penerbitan
Berlangganan
Deskripsi
Mode interaktif
Dibatasi berdasarkan peran. Hanya pengguna dengan peran streamer yang dapat menerbitkan aliran.
Partisipan dapat secara fleksibel mengubah peran sepanjang sesi.
Tidak ada batasan peran. Semua partisipan memiliki izin untuk berlangganan aliran.
Dalam mode interaktif, event seperti streamer bergabung atau meninggalkan channel, atau mulai menerbitkan aliran, diberitahukan kepada viewer secara real-time. Hal ini memastikan viewer mengetahui status streamer. Sebaliknya, aktivitas viewer tidak diberitahukan kepada streamer, sehingga memastikan aliran tidak terganggu.
Dalam mode ini, streamer bertanggung jawab atas interaksi, sedangkan viewer terutama mengonsumsi konten dan biasanya tidak berpartisipasi dalam interaksi. Jika kebutuhan bisnis Anda mungkin berubah, pertimbangkan untuk menggunakan mode interaktif secara default. Fleksibilitasnya memungkinkan Anda beradaptasi dengan berbagai kebutuhan interaksi dengan menyesuaikan peran pengguna.
Mode komunikasi
Tidak ada batasan peran. Semua partisipan memiliki izin untuk menerbitkan aliran.
Tidak ada batasan peran. Semua partisipan memiliki izin untuk berlangganan aliran.
Dalam mode komunikasi, partisipan saling mengetahui keberadaan satu sama lain.
Meskipun mode ini tidak membedakan peran pengguna, secara fungsional setara dengan peran streamer dalam mode interaktif. Tujuannya adalah menyederhanakan operasi, sehingga pengguna dapat mencapai fungsionalitas yang diinginkan dengan lebih sedikit pemanggilan API.
Panggil
setClientRoleuntuk mengatur peran pengguna menjadiAliRTCSdkInteractive(streamer) atauAliRTCSdkLive(viewer). Perhatikan bahwa peran streamer secara default menerbitkan dan berlangganan aliran, sedangkan peran viewer hanya berlangganan dengan pratinjau lokal dan penerbitan dinonaktifkan secara default.Catatan: Saat pengguna beralih dari streamer ke viewer, sistem menghentikan penerbitan aliran audio dan video lokal, tetapi langganan yang ada tidak terpengaruh. Saat pengguna beralih dari viewer ke streamer, sistem mulai menerbitkan aliran audio dan video lokal, dan langganan yang ada tidak terpengaruh.
// Atur profil channel ke mode interaktif. Gunakan AliRtcInteractivelive untuk semua skenario RTC. engine.setChannelProfile(AliRtcChannelProfile.interactivelive) // Atur peran client. Gunakan AliRtcClientRoleInteractive untuk pengguna yang perlu menerbitkan dan berlangganan. Gunakan AliRtcClientRolelive untuk pengguna yang hanya berlangganan. engine.setClientRole(AliRtcClientRole.roleInteractive)
Implementasikan callback umum
Jika SDK mengalami masalah selama operasi, SDK pertama-tama mencoba memulihkan secara otomatis menggunakan mekanisme retry internalnya. Untuk kesalahan yang tidak dapat diselesaikan, SDK memberi tahu aplikasi Anda melalui antarmuka callback yang telah ditentukan.
Berikut adalah callback utama untuk masalah yang tidak dapat ditangani SDK. Aplikasi Anda harus mendengarkan dan merespons callback ini:
Penyebab pengecualian
Callback dan parameter
Solusi
Deskripsi
Autentikasi gagal
result dalam onJoinChannelResult mengembalikan AliRtcErrJoinBadToken
Periksa apakah token benar.
Saat pengguna memanggil API, jika autentikasi gagal, callback API akan mengembalikan pesan kesalahan kegagalan autentikasi.
Token akan segera kedaluwarsa
onAuthInfoWillExpire
Ambil token baru dan panggil refreshAuthInfo untuk memperbarui informasi.
Kesalahan kedaluwarsa token dapat terjadi baik saat API dipanggil maupun selama runtime. Kesalahan dilaporkan melalui callback API atau callback kesalahan terpisah.
Token kedaluwarsa
onAuthInfoExpired
Bergabung kembali ke channel.
Kesalahan kedaluwarsa token dapat terjadi baik saat API dipanggil maupun selama runtime. Kesalahan dilaporkan melalui callback API atau callback kesalahan terpisah.
Masalah koneksi jaringan
Callback onConnectionStatusChange mengembalikan AliRtcConnectionStatusFailed.
Bergabung kembali ke channel.
SDK dapat secara otomatis memulihkan diri dari gangguan jaringan singkat. Jika waktu gangguan melebihi ambang batas, akan terjadi timeout. Aplikasi harus memeriksa status jaringan dan memandu pengguna untuk bergabung kembali.
Dikeluarkan dari channel
onBye
AliRtcOnByeUserReplaced: Periksa apakah pengguna lain telah bergabung dengan userId yang sama.
AliRtcOnByeBeKickedOut: Pengguna dikeluarkan dari channel dan perlu bergabung kembali.
AliRtcOnByeChannelTerminated: Channel dihentikan, dan pengguna perlu bergabung kembali.
Layanan RTC memungkinkan administrator menghapus partisipan.
Pengecualian perangkat lokal
onLocalDeviceException
Periksa izin aplikasi dan apakah perangkat keras berfungsi dengan baik.
Saat terjadi pengecualian perangkat lokal yang tidak dapat diselesaikan SDK, SDK memberi tahu aplikasi melalui callback. Aplikasi kemudian harus melakukan intervensi untuk memeriksa status perangkat.
extension VideoCallMainVC: AliRtcEngineDelegate { func onJoinChannelResult(_ result: Int32, channel: String, elapsed: Int32) { "onJoinChannelResult1 result: \(result)".printLog() } func onJoinChannelResult(_ result: Int32, channel: String, userId: String, elapsed: Int32) { "onJoinChannelResult2 result: \(result)".printLog() } func onRemoteUser(onLineNotify uid: String, elapsed: Int32) { // Pengguna remote online. "onRemoteUserOlineNotify uid: \(uid)".printLog() } func onRemoteUserOffLineNotify(_ uid: String, offlineReason reason: AliRtcUserOfflineReason) { // Pengguna remote offline. "onRemoteUserOffLineNotify uid: \(uid) reason: \(reason)".printLog() } func onRemoteTrackAvailableNotify(_ uid: String, audioTrack: AliRtcAudioTrack, videoTrack: AliRtcVideoTrack) { "onRemoteTrackAvailableNotify uid: \(uid) audioTrack: \(audioTrack) videoTrack: \(videoTrack)".printLog() } func onAuthInfoWillExpire() { "onAuthInfoWillExpire".printLog() /* TODO: Harus ditangani. Token akan segera kedaluwarsa. Aplikasi Anda perlu mendapatkan token baru untuk channel dan pengguna saat ini, lalu panggil refreshAuthInfo. */ } func onAuthInfoExpired() { "onAuthInfoExpired".printLog() /* TODO: Harus ditangani. Beri tahu pengguna bahwa token telah kedaluwarsa, lalu tinggalkan channel dan hapus engine. */ } func onBye(_ code: Int32) { "onBye code: \(code)".printLog() /* TODO: Harus ditangani. Callback ini dipicu jika perangkat lain masuk dengan UserID yang sama, sehingga mengeluarkan perangkat saat ini dari channel. */ } func onLocalDeviceException(_ deviceType: AliRtcLocalDeviceType, exceptionType: AliRtcLocalDeviceExceptionType, message msg: String?) { "onLocalDeviceException deviceType: \(deviceType) exceptionType: \(exceptionType)".printLog() /* TODO: Harus ditangani. Kami merekomendasikan memberi tahu pengguna tentang kesalahan perangkat. Callback ini dipicu ketika strategi pemulihan internal SDK gagal. */ } func onConnectionStatusChange(_ status: AliRtcConnectionStatus, reason: AliRtcConnectionStatusChangeReason) { "onConnectionStatusChange status: \(status) reason: \(reason)".printLog() if status == .failed { /* TODO: Harus ditangani. Kami merekomendasikan memberi tahu pengguna. Callback ini dipicu ketika strategi pemulihan internal SDK gagal. */ } else { /* TODO: Opsional. Anda dapat menambahkan logika bisnis di sini, biasanya untuk analitik atau pembaruan UI. */ } } }
5. Atur properti audio dan video
Atur properti audio
Panggil
setAudioProfileuntuk mengatur mode pengkodean audio dan skenario.// Atur profil audio. Nilai default adalah mode kualitas tinggi (AliRtcEngineHighQualityMode) dan skenario musik (AliRtcSceneMusicMode). engine.setAudioProfile(AliRtcAudioProfile.engineHighQualityMode, audio_scene: AliRtcAudioScenario.sceneMusicMode)Atur properti video Tetapkan properti untuk aliran video yang diterbitkan, seperti resolusi, bitrate, dan laju frame.
Anda dapat mengatur properti untuk aliran video yang diterbitkan, seperti resolusi, bitrate, dan laju frame.
// Atur parameter pengkodean video. let config = AliRtcVideoEncoderConfiguration() config.dimensions = CGSize(width: 720, height: 1280) config.frameRate = 20 config.bitrate = 1200 config.keyFrameInterval = 2000 config.orientationMode = AliRtcVideoEncoderOrientationMode.adaptive engine.setVideoEncoderConfiguration(config) engine.setCapturePipelineScaleMode(.post)
6. Atur properti penerbitan dan langganan
Konfigurasikan penerbitan aliran audio dan video serta atur perilaku default untuk berlangganan aliran semua pengguna:
Panggil
publishLocalAudioStreamuntuk menerbitkan aliran audio.Panggil
publishLocalVideoStreamuntuk menerbitkan aliran video. Untuk panggilan hanya audio, Anda dapat mengatur nilai ini ke false.
// Secara default, SDK menerbitkan aliran video. Memanggil publishLocalVideoStream(true) bersifat opsional.
engine.publishLocalVideoStream(true)
// Secara default, SDK menerbitkan aliran audio. Untuk panggilan video, memanggil publishLocalAudioStream(true) bersifat opsional.
// Untuk panggilan hanya audio, panggil publishLocalVideoStream(false) untuk menghentikan penerbitan video.
engine.publishLocalAudioStream(true)
// Atur default untuk berlangganan aliran audio dan video remote.
engine.setDefaultSubscribeAllRemoteAudioStreams(true)
engine.subscribeAllRemoteAudioStreams(true)
engine.setDefaultSubscribeAllRemoteVideoStreams(true)
engine.subscribeAllRemoteVideoStreams(true)Secara default, SDK secara otomatis menerbitkan aliran audio dan video lokal serta berlangganan aliran audio dan video semua pengguna lain di dalam channel. Anda dapat memanggil metode di atas untuk mengganti perilaku default ini.
7. Mulai pratinjau lokal
Panggil
setLocalViewConfiguntuk mengatur tampilan render lokal dan mengonfigurasi properti tampilan video lokal.Panggil metode
startPreviewuntuk memulai pratinjau video lokal.
let videoView = self.createVideoView(uid: self.userId)
let canvas = AliVideoCanvas()
canvas.view = videoView.canvasView
canvas.renderMode = .auto
canvas.mirrorMode = .onlyFrontCameraPreviewEnabled
canvas.rotationMode = ._0
self.rtcEngine?.setLocalViewConfig(canvas, for: AliRtcVideoTrack.camera)
self.rtcEngine?.startPreview()8. Bergabung ke channel
Panggil joinChannel untuk bergabung ke channel. Kami merekomendasikan menggunakan metode satu parameter, yang memerlukan pemanggilan operasi joinChannel[3/3]. Setelah Anda memanggil joinChannel, periksa baik nilai kembali maupun hasil dalam callback onJoinChannelResult. Jika nilai kembali adalah 0 dan hasil dalam callback juga 0, pengguna telah berhasil bergabung ke channel. Jika tidak, verifikasi bahwa token valid.
let ret = self.rtcEngine?.joinChannel(joinToken, channelId: nil, userId: nil, name: nil) { [weak self] errCode, channelId, userId, elapsed in
if errCode == 0 {
// berhasil
}
else {
// gagal
}
let resultMsg = "\(msg) \n CallbackErrorCode: \(errCode)"
resultMsg.printLog()
UIAlertController.showAlertWithMainThread(msg: resultMsg, vc: self!)
}
let resultMsg = "\(msg) \n ReturnErrorCode: \(ret ?? 0)"
resultMsg.printLog()
if ret != 0 {
UIAlertController.showAlertWithMainThread(msg: resultMsg, vc: self)
}Setelah pengguna bergabung ke channel, SDK menerbitkan dan berlangganan aliran sesuai dengan parameter yang diatur sebelum bergabung.
SDK secara otomatis menerbitkan dan berlangganan secara default untuk mengurangi jumlah pemanggilan API yang perlu dilakukan client.
9. Atur tampilan remote
Saat pengguna remote mulai atau berhenti menerbitkan aliran, callback onRemoteTrackAvailableNotify dipicu. Dalam callback ini, Anda dapat mengatur atau menghapus tampilan pengguna remote. Berikut adalah contoh kodenya:
func onRemoteTrackAvailableNotify(_ uid: String, audioTrack: AliRtcAudioTrack, videoTrack: AliRtcVideoTrack) {
"onRemoteTrackAvailableNotify uid: \(uid) audioTrack: \(audioTrack) videoTrack: \(videoTrack)".printLog()
// Status aliran pengguna remote.
if audioTrack != .no {
let videoView = self.videoViewList.first { $0.uidLabel.text == uid }
if videoView == nil {
_ = self.createVideoView(uid: uid)
}
}
if videoTrack != .no {
var videoView = self.videoViewList.first { $0.uidLabel.text == uid }
if videoView == nil {
videoView = self.createVideoView(uid: uid)
}
let canvas = AliVideoCanvas()
canvas.view = videoView!.canvasView
canvas.renderMode = .auto
canvas.mirrorMode = .onlyFrontCameraPreviewEnabled
canvas.rotationMode = ._0
self.rtcEngine?.setRemoteViewConfig(canvas, uid: uid, for: AliRtcVideoTrack.camera)
}
else {
self.rtcEngine?.setRemoteViewConfig(nil, uid: uid, for: AliRtcVideoTrack.camera)
}
if audioTrack == .no && videoTrack == .no {
self.removeVideoView(uid: uid)
self.rtcEngine?.setRemoteViewConfig(nil, uid: uid, for: AliRtcVideoTrack.camera)
}
}10. Tinggalkan channel dan hapus engine
Saat sesi berakhir, tinggalkan channel dan hapus engine untuk melepaskan sumber daya:
Panggil
stopPreviewuntuk menghentikan pratinjau video.Panggil
leaveChanneluntuk meninggalkan channel.Panggil
destroyuntuk menghapus engine dan melepaskan semua sumber daya terkait.
self.rtcEngine?.stopPreview()
self.rtcEngine?.leaveChannel()
AliRtcEngine.destroy()
self.rtcEngine = nil11. Demo

