ECV Video Görüşme iOS SDK
ECV Video Görüşme iOS SDK
Giriş
ECV Video Görüşme iOS SDK'sına hoş geldiniz! Bu SDK, gerçek zamanlı video görüşme işlevselliğini iOS uygulamalarınıza sorunsuz bir şekilde entegre etmenizi sağlar. Sinyal iletimi, WebRTC eş bağlantıları, medya akışları ve görüşme durumu yönetimi gibi karmaşık işlemleri halleder, böylece siz uygulamanızın kullanıcı arayüzü ve iş mantığına odaklanabilirsiniz.
Bu depo şunları içerir:
-
SDK: Önceden derlenmiş bir iOS Framework'ü (
.frameworkdosyası) olarak sağlanır. Bunu projenize bir bağımlılık olarak ekleyeceksiniz. -
Demo Uygulama: SDK özelliklerinin nasıl kullanılacağını gösteren bir gösterim uygulamasının (
ECV175_iOS_DEMO) tam kaynak kodu. Bu demo, üretim için hazır UI kodu değil, referans ve örnek olarak tasarlanmıştır.
Temel Özellikler
-
ECV backend servislerine bağlantı kurar (v1.75+)
-
WebRTC kurulumunu ve eşler arası bağlantıyı yönetir
-
Yerel ve uzak video/ses akışlarını yönetir
-
Ses ve video için sessize alma/sesi açma kontrollerini sağlar
-
Kamera değiştirmeyi destekler
-
Görüşme yaşam döngüsü olaylarını yönetir (arama, sırada bekleme, bağlandı, bekletme, sonlandırma)
-
Yapılandırılabilir ortamlar ve görüşme parametreleri
Başlangıç
Ön Koşullar
-
Xcode (En Son Kararlı Sürüm Önerilir)
-
iOS geliştirme temel bilgisi (Swift)
-
Minimum iOS Sürümü: 13.0
-
Hedef iOS Sürümü: 17.0
1. Gerekli Framework'leri Ekleyin
Uygulamanızın ECV SDK framework'ünü ve gerekli bağımlılıklarını içermesi gerekir: WebRTC. Bunları .framework dosyaları olarak alacaksınız.
-
Gerekli Framework Dosyaları:
-
ECV SDK: (örn.,
ECV175_iOS_SDK.framework) -
WebRTC:
WebRTC.xcframework
-
-
Framework'leri projenize ekleyin:
-
Framework dosyalarını Xcode projenize sürükleyip bırakın
-
"Copy items if needed" seçeneğinin işaretli olduğundan emin olun
-
Hedefinizin "Frameworks, Libraries, and Embedded Content" bölümüne ekleyin
-
Her framework için "Embed & Sign" ayarını yapın
-
-
Projenizin Build Ayarlarında:
-
"Enable Bitcode" ayarını Hayır olarak ayarlayın
-
Framework'leri "Framework Search Paths"e ekleyin
-
"Build Active Architecture Only" ayarının ihtiyaçlarınıza uygun şekilde ayarlandığından emin olun
-
2. Demo Uygulamayı İnceleyin
Dahil edilen demo uygulama (ECV175_iOS_DEMO), SDK entegrasyonunun pratik bir örneğini sunar.
-
Xcode'da
ECV175_iOS.xcworkspace'i açın -
Demo uygulamayı bir simülatör veya fiziksel cihazda derleyip çalıştırın
-
SDK bileşenlerinin nasıl başlatıldığını ve kullanıldığını anlamak için özellikle
UIdizinindeki dosyaları veAppState.swiftdosyasını inceleyin
3. Temel SDK Başlatma (Kavramsal)
// AppDelegate veya merkezi bir yönetim nesnesinde
import ECV175_iOS_SDK
// 1. SDK Yapılandırmasını Tanımlayın
let sdkConfig = ECVSdkConfiguration(
name: "Environment_Name" // Uygulamanızı veya backend'inizi ifade eden herhangi bir isim verin
serviceUrl: "YOUR_SERVICE_URL" // Gerçek servis URL'niz ile değiştirin
// İsteğe bağlı olarak webrtcUrl, signalingUrl vb. değerleri geçersiz kılın
)
// 2. SDK Örneğini Başlatın
// Merkezi olarak yönetilen tek bir örnek olması önerilir
let ecvSdk = ECVSdk(config: sdkConfig)
// Bu örneği uygulamanız genelinde erişim için saklayın (örn., AppDelegate, DI, Singleton)
// Örnek: MyApp.sdkInstance = ecvSdk
Temel Kavramlar
-
ECVSdk: SDK ile etkileşim için ana giriş noktası. Görüşmeler oluşturmak ve global ayarlar/modüllere erişmek için kullanılır. -
ECVSdkConfiguration: SDK için backend URL'lerini ve bağlantı parametrelerini tanımlar. -
VideoCall: Tek bir video görüşme oturumunu temsil eder. Görüşme durumunu, olayları ve bağlantı detaylarını yönetir. -
WebRtcConnection: Temel WebRTC eş bağlantısını, medya akışlarını ve renderer'ları yönetir.VideoCall.connect()üzerinden erişilir. -
Olaylar: SDK, uygulamanızı görüşme durumu değişiklikleri, hatalar ve medya olayları (
VideoCallEvent) hakkında bilgilendirmek için bir delegate sistemi kullanır. -
Renderer'lar (
RTCMTLVideoView): Yerel ve uzak videoyu görüntülemek için kullanılan standart WebRTC görünümleri. Yaşam döngülerini yönetmeniz veWebRtcConnectionkullanarak bunları eklemeniz/çıkarmanız gerekir.
Demo Uygulama Akışı
Demo uygulama şu temel akışı izler:
-
EnvironmentsScreen: Backend bağlantı yapılandırmalarını (Servis URL'si vb.) seçmeye veya tanımlamaya olanak tanır. Bu öncelikle gösterim amaçlıdır; uygulamanız muhtemelen sabit bir yapılandırmaya sahip olacak veya bunu dinamik olarak alacaktır. -
MainScreen: Gerekli görüşme bilgilerini toplar (örn., arayan adı, öznitelikler), izinleri ister (Kamera, Mikrofon) vesdk.createCall()kullanarak görüşmeyi başlatır. -
QueueScreen: Görüşme bir temsilciye bağlanırken bekleme durumunu gösterir.AgentConnectedveyaError/Hangupolaylarını dinler. -
CallScreen: Ana video görüşme arayüzü. Yerel ve uzak video içinRTCMTLVideoView'ları yönetir, görüşme kontrollerini gösterir (sessize alma, kamera değiştirme, görüşmeyi sonlandırma) ve UI'ı güncellemek için SDK olaylarına tepki verir.
SDK Kullanım Kılavuzu
Bu belge, ECV Video Görüşme iOS SDK'sını uygulamanızda kullanma hakkında detaylı bilgi sağlar.
SDK Başlatma
Temel Başlatma
import ECV175_iOS_SDK
// SDK yapılandırmasını oluştur
let config = ECVSdkConfiguration(
name: "Environment_Name" // Uygulamanızı veya backend'inizi ifade eden herhangi bir isim verin
serviceUrl: "YOUR_SERVICE_URL"
)
// SDK örneğini başlat
let sdk = ECVSdk(config: config)
Yapılandırma Seçenekleri
ECVSdkConfiguration sınıfı çeşitli yapılandırma seçeneklerini destekler:
let config = ECVSdkConfiguration(
name: "Environment_Name",
serviceUrl: "YOUR_SERVICE_URL",
webrtcUrl: "YOUR_WEBRTC_URL", // İsteğe bağlı, varsayılan: serviceUrl
signalingUrl: "YOUR_SIGNALING_URL" // İsteğe bağlı, varsayılan: serviceUrl
)
Ek Yapılandırmalar
Logger.setLevel(logLevel: .debug) // .debug SDK'daki her şeyin hata ayıklamasını etkinleştirmek için (.debug, .info, .warn, .error) // varsayılan: .info
Görüşme Oluşturma ve Yönetme
Görüşme Oluşturma
// Video görüşmesini oluştur ve başlat let call = await sdk.createVideoCall()
Eğer zaten bir rtcId'niz varsa, bunu createVideoCall fonksiyonuna sağlayabilirsiniz, aksi takdirde otomatik olarak backend'den oluşturulacaktır (varsayılan)
let call = await sdk.createVideoCall(rtcId: "your_rtcId")
VideoCall Olayları
Şimdi görüşmeyi başlatmadan önce görüşmeye olay dinleyicisi ekleyebiliriz
sdk.modules.onCallEvent.append { (videoCall: VideoCall, newEvent: VideoCallEvent, lastEvent: VideoCallEvent) in
if(videoCall.rtcId != call.rtcId){
return // Sadece mevcut görüşmeyle ilgili olayları yakaladığımızdan emin oluyoruz. // tüm görüşmelerin olaylarını yakalamak için bu kodu yorum satırına alın
}
if(newEvent.type == .AgentConnected) {
Logger.info("From sdk.modules.onCallEvent: \(newEvent.type)")
}
else if(newEvent.type == .Error){
Logger.error("From sdk.modules.onCallEvent: \(newEvent.detail ?? "")")
}
else {
Logger.info("From sdk.modules.onCallEvent: \(newEvent)")
}
}
VideoCall Parametreleri
Görüşmeyi başlatmak için DialCallParameters nesnesini hazırlamamız gerekir
let dialCallParameters = DialCallParameters(
callerName: "Caller_Name", // İsteğe bağlı ama sağlanmalı, aksi takdirde rastgele bir isim oluşturulacak
attributes: [String: String], // İsteğe bağlı, Görüşme için veri ekleyin
queue: String?, // İsteğe bağlı, Kuyruk adı, sağlanmazsa sistemin varsayılan kuyruğunu kullanacak
// Gelişmiş İsteğe Bağlı Parametreler
acdAttributes: [String: String],
customPayload: [String: String],
additionalHeaders: [String: String],
)
Örnek:
let dialCallParameters = DialCallParameters(
callerName: "John Doe",
attributes: [
"department": "support",
"priority": "high"
],
queue: "TechSupport",
)
VideoCall'u Başlatma
ECV 1.75'te bir VideoCall başlatmak istiyorsak, call.start kullanırız
_ = await call.start(dialCallParameters: dialCallParameters)
Not: Sonucu _'ye atadık çünkü call.start queueSocket bağlantısını [String: Any]? verisini döndürür. Şimdilik bunları işlememize gerek yok. (Çok Gelişmiş)
Bir Temsilcinin bağlanmasını beklemek (inQueue)
Bir temsilcinin bağlanmasını beklemek için iki basit yol vardır:
1- Yukarıda zaten uyguladığımız VideoCall olaylarını kullanarak if(newEvent.type == .AgentConnected)
2- Beklenen promise tabanlı görevi kullanarak:
let isAgentConnected = await call.agentConnected?.value
Logger.info("isAgentConnected: \(String(describing: isAgentConnected))")
if(isAgentConnected == true) {
// Görüşmeyi ayrı bir web tarayıcısında açmak belki? // Geliştirme için faydalı
if let urlString = call.getUrl(), let url = URL(string: urlString) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
else {
Logger.error("Failed to open URL: invalid URL string")
}
}
else {
Logger.warn("Agent not connected!")
}
VideoCall'u Bağlama
1- videoCall.connect() kullanarak
CallScreen.swift dosyanızda
func setup() {
Task {
guard let rtcId = self.rtcId else {
Logger.error("Setup failed: RtcId is nil")
return
}
// Ekranlar arasında gezinirken ve zaten bir video görüşmesi oluşturduysanız, video görüşmesini sdk içinde rtcId kullanarak bulabilirsiniz.
if let videoCall = appState.sdk?.getVideoCall(rtcId: rtcId){
self.videoCall = videoCall
}
else {
// Veya yeni bir videoCall nesnesi oluşturmak istiyorsanız ve rtcId'niz varsa, ve temsilcinin odada beklediğinden eminseniz // geliştirme için faydalı
self.videoCall = await appState.sdk?.createVideoCall(rtcId: rtcId)
}
guard let webRtcConnection = self.videoCall?.connect() else {
self.callError = "WebRtcConnection failed to connect"
Logger.error("Setup failed: WebRtcConnection is nil")
return
}
self.webRtcConnection = webRtcConnection
Logger.debug("Instantiating and assigning renderers...")
let local = Renderer()
let remote = Renderer()
webRtcConnection.localVideoRenderer = local
webRtcConnection.remoteVideoRenderer = remote
self.localRenderer = local
self.remoteRenderer = remote
Logger.info("Starting WebRTC room...")
await webRtcConnection.startRoom()
Logger.info("Call setup complete.")
}
}
2- Veya arayan web tarayıcısı kullanarak video görüşmesine katılabilir (önerilmez / geliştirme için faydalı)
if let urlString = call.getUrl(), let url = URL(string: urlString) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
else {
Logger.error("Failed to open URL: invalid URL string")
}
Video Görüşme Arayüzü
Video Görünümlerini Ayarlama
import Foundation
import SwiftUI
import Combine
import ECV175_iOS_SDK
import WebRTC
struct CallScreen: View {
let rtcId: String?
@EnvironmentObject var appState: AppState
@Binding var path: NavigationPath
@State private var videoCall: VideoCall?
@State private var webRtcConnection: WebRtcConnection?
@State private var localRenderer: Renderer?
@State private var remoteRenderer: Renderer?
let localStreamWidth: CGFloat = 80
let localStreamHeight: CGFloat = 120
let margin: CGFloat = 10
let pipBottomPadding: CGFloat = 70
var body: some View {
ZStack {
Color.black.ignoresSafeArea()
WebRtcVideoView(renderer: remoteRenderer).ignoresSafeArea()
WebRtcVideoView(renderer: localRenderer)
.frame(width: localStreamWidth, height: localStreamHeight)
.cornerRadius(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(Color.white.opacity(0.5), lineWidth: 1)
)
.padding(.trailing, margin)
.padding(.bottom, margin + pipBottomPadding)
// ... Görüşme Düğmeleri
}
.navigationBarHidden(true)
.statusBar(hidden: true)
.onAppear(perform: setup)
.onDisappear {
hangup(by: "onDisappear")
}
}
// MARK: - Video Renderer SwiftUI Sarmalayıcısı
struct WebRtcVideoView: UIViewRepresentable {
let renderer: (any RTCVideoRenderer)?
func makeUIView(context: Context) -> UIView {
if let renderer = renderer as? Renderer {
return renderer.view
} else if let renderer = renderer as? Renderer {
return renderer.view
} else {
return UIView()
}
}
func updateUIView(_ uiView: UIView, context: Context) {}
}
// MARK: - Özel Renderer Sınıfları
class Renderer: NSObject, RTCVideoRenderer {
let view: RTCMTLVideoView
override init() {
self.view = RTCMTLVideoView()
self.view.videoContentMode = .scaleAspectFill
super.init()
Logger.debug("Renderer created")
}
deinit { Logger.debug("Renderer deallocated") }
func setSize(_ size: CGSize) {
view.setSize(size)
}
func renderFrame(_ frame: RTCVideoFrame?) {
view.renderFrame(frame)
}
}
func hangup(by: String = "HangUpButton") {
Logger.debug("Hangup requested by: \(by)")
videoCall?.hangup()
videoCall = nil
webRtcConnection = nil
localRenderer = nil
remoteRenderer = nil
}
// func setup(){
// ... buraya yapıştırın
//}
}
Görüşme Kontrolleri
// Sesi Kapat/Aç webRtcConnection.setAudioEnabled(state: false) // Sesi kapat webRtcConnection.setAudioEnabled(state: true) // Sesi aç // Videoyu Devre Dışı Bırak/Etkinleştir webRtcConnection.setVideoEnabled(state: false) // Videoyu devre dışı bırak webRtcConnection.setVideoEnabled(state: true) // Videoyu etkinleştir // Kamerayı Değiştir try await webRtcConnection.switchCamera() // Flaşı Etkinleştir/Devre Dışı Bırak webRtcConnection.setFlashlightEnabled(state: true) webRtcConnection.setFlashlightEnabled(state: false) // Görüşmeyi Sonlandır videoCall.hangup()
Video Görüşme Olay İşleme
sdk.modules.onCallEvent'te bir olay tetiklendiğinde, newEvent VideoCallEvent ve newEvent.type VideoCallEventType'dır
sdk.modules.onCallEvent.append { (videoCall: VideoCall, newEvent: VideoCallEvent, lastEvent: VideoCallEvent) in
if(videoCall.rtcId != call.rtcId){
return // Sadece mevcut görüşmeyle ilgili olayları yakaladığımızdan emin oluyoruz. // tüm görüşmelerin olaylarını yakalamak için bu kodu yorum satırına alın
}
if(newEvent.type == .DialSuccess){
Logger.error("From sdk.modules.onCallEvent: \(newEvent.detail ?? "")")
}
else if(newEvent.type == .CallEnded){
// işle
}
//else if(){
//}
}
her tip kendini açıklayıcıdır:
public enum VideoCallEventType {
case None
case Init
case GotRtcId
case DialSuccess
case Error
case OnQueue
case AgentConnected
case CallEnded
case SignalingConnected
case GotLocalStream
case GotRemoteStream
case JoinedRoom
case SignalingRegistered
case RtcPeerConnectionCreated
case GotOffer
case SentOffer
case GotAnswer
case SentAnswer
case AudioMuted
case AudioUnmuted
case VideoMuted
case VideoUnmuted
case RemoteAudioMuted
case RemoteAudioUnmuted
case RemoteVideoMuted
case RemoteVideoUnmuted
case StartHold
case EndHold
case TakePhotoOn
case TakePhotoOff
case WebRtcOnDataChannel
case TextChannelConnected
case TextChannelMessage
case ConnectionTimeoutStart
case ConnectionTimeoutEnd
case WebRtcConnected
case WebRtcRenegotiationNeeded
case WebRtcDisconnected
case WebRtcFailed
case Hangup
case TransferPending
case TransferCanceled
case TransferredTo
}
Hata Yönetimi
Hataları daha kesin bir şekilde yönetmek için, .onCallEvent altında bir hata oluştuğunda videoCall.lastError'ı kontrol edebiliriz
Yapılandırma Kılavuzu
Bu belge, ECV Video Görüşme iOS SDK'sında mevcut yapılandırma seçeneklerini detaylandırır.
SDK Yapılandırması
Temel Yapılandırma
ECVSdkConfiguration sınıfı video görüşme örneğini yapılandırmak için kullanılır:
let config = ECVSdkConfiguration(
name: "Environment_Name"
serviceUrl: "YOUR_SERVICE_URL",
)
Gerekli Parametreler
|
Parametre |
Tip |
Açıklama |
|---|---|---|
|
|
String |
Uygulamanızı veya backend'inizi ifade eden herhangi bir isim verin |
|
|
String |
ECV backend servisinizin temel URL'si |
İsteğe Bağlı Parametreler
|
Parametre |
Tip |
Açıklama |
|---|---|---|
|
|
String |
Özel WebRTC sunucu URL'si, varsayılan: serviceUrl ile aynı |
|
|
String |
Özel sinyal sunucu URL'si, varsayılan: serviceUrl ile aynı |
Örnek Kullanımlar:
let configV175 = ECVSdkConfiguration(
name: "Some ECV 1.75 App"
serviceUrl: "https://prod-v175.ecv.example.com"
)
let configSeparateV175 = ECVSdkConfiguration(
name: "Some custom ECV 1.75 App",
serviceUrl: "https://api.example.com",
webrtcUrl: "https://webrtc-v15.example.com", // /join için ayrı endpoint
signalingUrl: "https://websocket-v15.example.com" // Ayrı WebSocket sunucusu
)
Görüşme Yapılandırması
Temel Görüşme Yapılandırması
DialCallParameters sınıfı bireysel görüşmeleri yapılandırmak için kullanılır:
let dialCallParameters = DialCallParameters() // Gerekli parametre yok
İsteğe Bağlı DialCallParameters Parametreleri
|
Parametre |
Tip |
Açıklama |
|---|---|---|
|
|
String |
Arayanın adı, İsteğe bağlı ama sağlanmalı, aksi takdirde rastgele bir isim oluşturulacak |
|
|
[String: String] |
Görüşme için veri ekleyin |
|
|
String |
Sağlanmazsa, sistemin varsayılan kuyruğunu kullanacak |
|
|
[String: String] |
Görüşme için ek özel acdAttributes (Gelişmiş Backend Ayarları) |
|
|
[String: String] |
Görüşme için ek özel payload (Gelişmiş Backend Ayarları) |
|
|
[String: String] |
dialRequest'e uygulanabilecek ek http başlıkları |
Örnek Kullanımlar:
let dialCallParameters = DialCallParameters(
callerName: "Jane Doe",
attributes: [
"accountNumber" to "ACC9876",
"lastInteraction" to "2023-10-26"
],
queue: "SupportQueue",
additionalHeaders: ["X-Auth-Token": "user_session_token"]
)
await call.start(dialCallParameters: dialCallParameters)
WebRTC Bağlantı Parametreleri
Bu parametreler videoCall.connect() çağrıldığında isteğe bağlı olarak sağlanır ve WebRTC eş bağlantı davranışını ince ayar yapar. Çoğu parametrenin makul varsayılanları vardır.
-
Bağlantı & Sinyalleşme:
-
connectionTimeout: Int = 10000: Genel WebRTC bağlantı denemesi için zaman aşımı (ms) (WebRtcConnection'da manuel bir zamanlayıcı tarafından kullanılır). -
joinHttpConnectTimeout: Int = 3000:/joinisteği için HTTP bağlantı zaman aşımı (ms). -
joinHttpReadTimeout: Int = 3000:/joinisteği için HTTP okuma zaman aşımı (ms). -
additionalHeaders: [String: String]:/joinisteğine ve WebSocket sinyalleşme bağlantı el sıkışmasına eklenen özel HTTP başlıkları. WebRTC/Sinyalleşme altyapısına ulaşması gereken kimlik doğrulama belirteçleri için faydalıdır.
-
-
Medya Kontrolü & Davranışı:
-
videoCallEnabled: Boolean = true: Video parçalarının kurulup kurulmayacağı. Sadece sesli görüşmeler içinfalseolarak ayarlayın. -
useSpeakerPhone: Boolean = true: Görüşmeyi hoparlör kullanarak başlat. -
autoHandleCameraSwitch: Boolean = true: SDK'nın belirli olaylar gerçekleştiğinde (örn., temsilci arka kamera ile fotoğraf istediğinde) otomatik olarak kameraları değiştirmesine izin verir. -
autoHandleHoldSideEffects: Boolean = true: Temsilci görüşmeyi bekletmeye aldığında veya devam ettirdiğinde yerel ses/videoyu otomatik olarak sessize alır/açar.
-
-
Video Yapılandırması:
-
videoWidth: Int = 480/videoHeight: Int = 640: İstenen video çözünürlüğü. -
videoFps: Int = 0(Varsayılan ~30): İstenen video kare hızı. -
videoMaxBitrate: Int = 0(WebRTC varsayılanı): Video kodlama için maksimum bit hızı (kbps). -
videoCodec: String = "VP8": Tercih edilen video codec'i ("VP8", "VP9", "H264"). -
videoCodecHwAcceleration: Boolean = true: Varsa donanım hızlandırmasını etkinleştir.
-
-
Ses Yapılandırması:
-
audioCodec: String = "OPUS": Tercih edilen ses codec'i ("OPUS", "ISAC"). -
audioStartBitrate: Int = 0(WebRTC varsayılanı): Başlangıç ses bit hızı (kbps). -
noAudioProcessing: Boolean = false: Platform ses işlemeyi devre dışı bırak (AEC, AGC, NS). -
disableBuiltInAEC: Boolean = false/disableBuiltInNS: Boolean = false: Varsa donanım AEC/NS'yi devre dışı bırak.
-
-
Hata Ayıklama:
-
tracing: Boolean = false: WebRTC dahili izlemeyi etkinleştir.
-
-
Veri Kanalı (
textChannelConfig):-
textChannelConfig: DataChannelConfig? = DataChannelConfig(...): FLASH_ON/OFF, HOLD/PICKUP vb. komutlar için kullanılan yerleşik metin veri kanalı yapılandırması. Genellikle varsayılan olarak bırakılır. Detaylar içinDataChannelConfigsınıfına bakın.
-
Örnek Kullanım:
let customConnectParams = ConnectParameters(
videoWidth: 1280,
videoHeight: 720,
videoCodec: "H264",
additionalHeaders: ["X-WebRTC-Auth": "webrtc_token"]
)
// Özel parametreleri kullanarak WebRtcConnection'ı al
let webRtcConnection = videoCall.connect(parameters: customConnectParams)
webRtcConnection.startRoom()
DataChannelConfig
DataChannelConfig, eşler arası iletişim ortamında bir veri kanalını başlatmak için kullanılan bir yapılandırma modelidir.
Özellikler
|
Özellik |
Tip |
Açıklama |
|---|---|---|
|
|
|
Veri kanalının etkin olup olmadığı. |
|
|
|
Veri kanalı için insan tarafından okunabilir etiket. |
|
|
|
Veri kanalı için ID (-1 ayarlanmamışsa). |
|
|
|
Kanalın önceden müzakere edilip edilmediği (manuel kurulum). |
|
|
|
Alt protokol adı (Swift anahtar kelime çakışmasını önlemek için yeniden adlandırıldı). |
|
|
|
Mesajların sırayla gelmesi gerekip gerekmediği. |
|
|
|
Maksimum yeniden iletim sayısı (-1 ayarlanmamışsa). |
|
|
|
Yeniden iletimler için maksimum süre (milisaniye cinsinden) (-1 ayarlanmamışsa). |
Başlatıcı
init(
enabled: Bool,
label: String,
id: Int = -1,
negotiated: Bool = false,
protocol: String = "",
ordered: Bool = true,
maxRetransmits: Int = -1,
maxRetransmitTimeMs: Int = -1
)
Demo Uygulama Kılavuzu
Genel Bakış
ECV175_iOS_DEMO uygulaması, ECV Video Görüşme SDK'sının bir iOS uygulamasına nasıl entegre edileceğini ve kullanılacağını gösteren pratik bir örnek olarak hizmet eder. Bu kılavuz, uygulamanın mimarisini, temel bileşenlerini ve nasıl etkili bir şekilde kullanılacağını adım adım açıklar.
Uygulama Mimarisi
Temel Bileşenler
-
Uygulama Yapısı
-
Modern iOS geliştirme uygulamalarıyla SwiftUI framework'ü kullanılarak oluşturulmuştur
-
MVVM (Model-View-ViewModel) mimari desenini takip eder
-
Ekran yönetimi için SwiftUI'nin navigasyon sistemini kullanır
-
NavigationRouteenum'u ile tip güvenli navigasyon uygular -
Bağımlılık enjeksiyonu için environment object'leri kullanır
-
-
Durum Yönetimi
-
AppState: Şunları yöneten merkezi durum yönetim sınıfı:-
UserDefaults kullanarak ortam yapılandırması kalıcılığı
-
SDK örneği yaşam döngüsü yönetimi
-
Ortam seçimi ve depolama
-
@Publishedözellikleri kullanarak reaktif UI güncellemeleri
-
-
ConfigurationManager: Ortam yapılandırmalarını yönetir-
Önceden tanımlanmış ve özel ortamları yönetir
-
Ortam yapılandırmaları için CRUD işlemleri sağlar
-
Ortam ayarlarını kalıcı hale getirir
-
-
-
Navigasyon Sistemi
-
Üç ana rota ile
NavigationRouteenum'u kullanarak tip güvenli navigasyon:-
mainScreen: Ortam seçiminden sonra giriş noktası -
queueScreen(rtcId:name:queue:): Kuyruk yönetim arayüzü -
callScreen(rtcId:): Video görüşme arayüzü
-
-
Uygun geri navigasyon ve derin bağlantı desteği uygular
-
Modern navigasyon için SwiftUI'nin
NavigationStack'ini kullanır
-
Temel Özellikler
-
Ortam Seçimi
-
Birden fazla ortam yapılandırmasını destekler:
-
Önceden tanımlanmış ortamlar
-
Yapılandırılabilir ayarlarla özel ortamlar
-
-
Ortam yapılandırması şunları içerir:
-
Servis URL'si
-
WebRTC URL'si (isteğe bağlı)
-
Sinyal URL'si (isteğe bağlı)
-
Kuyruk soketi yapılandırması
-
Oda aralığı ayarları
-
-
Seçilen ortamı UserDefaults kullanarak kalıcı hale getirir
-
Seçilen ortamla otomatik SDK başlatma
-
-
Video Görüşme Entegrasyonu
-
ECV Video Görüşme SDK'sı ile sorunsuz entegrasyon
-
Özellikler şunları içerir:
-
Gerçek zamanlı video akışı
-
Ses kontrolleri (sessize alma/sesi açma)
-
Video kontrolleri (etkinleştirme/devre dışı bırakma)
-
Kamera değiştirme
-
Flaş kontrolü
-
Picture-in-Picture desteği
-
-
Kuyruk yönetim sistemi:
-
Mevcut kuyruklara katılma
-
Yeni kuyruklar oluşturma
-
Kuyruk durumunu izleme
-
-
Görüşme olay işleme:
-
Görüşme durumu yönetimi
-
Hata işleme
-
Bağlantı durumu izleme
-
-
Başlangıç
Ön Koşullar
-
Xcode 14.0 veya üzeri
-
iOS 15.0 veya üzeri
-
ECV175_iOS_SDK framework'ü
-
Kamera ve mikrofon izinleri
-
İnternet bağlantısı
Kurulum Süreci
-
Proje Yapılandırması
-
ECV175_iOS.xcworkspace'i açın -
Demo uygulama ve SDK hedeflerinin doğru yapılandırıldığından emin olun
-
Tüm bağımlılıkların doğru bağlandığını kontrol edin
-
Info.plist'te gerekli izinleri yapılandırın:
-
Kamera kullanım açıklaması
-
Mikrofon kullanım açıklaması
-
-
-
Ortam Yapılandırması
-
Uygulamayı başlatın
-
Ortam seçim ekranından istediğiniz ortamı seçin
-
Ortam ayarlarını yapılandırın:
-
Servis URL'si (gerekli)
-
WebRTC URL'si (isteğe bağlı)
-
Sinyal URL'si (isteğe bağlı)
-
Kuyruk soketi ayarları
-
-
Uygulama, seçilen yapılandırma ile SDK'yı otomatik olarak başlatacaktır
-
Uygulama Akışı
-
İlk Başlatma
-
Uygulama önceden kaydedilmiş ortam yapılandırmasını kontrol eder
-
Bulunursa, otomatik olarak ana ekrana gider
-
Bulunmazsa, ortam seçim ekranını gösterir
-
Gerekli izinleri ister (kamera, mikrofon)
-
-
Ana Ekran
-
Video görüşmeleri için mevcut seçenekleri gösterir
-
Mevcut ortam yapılandırmasını gösterir
-
Şunlara erişim sağlar:
-
Kuyruk seçimi
-
Görüşme başlatma
-
Ortam ayarları
-
-
İzin yönetimini işler
-
Video görüşme örneğini başlatır
-
-
Kuyruk Yönetimi
-
Mevcut kuyruklara katılma
-
Yeni kuyruklar oluşturma
-
Kuyruk durumunu izleme
-
Kuyruk ayarlarını yapılandırma
-
Kuyruk olaylarını işleme
-
-
Video Görüşme Arayüzü
-
Gerçek zamanlı video akışı:
-
Yerel video önizleme
-
Uzak video görüntüleme
-
Picture-in-Picture desteği
-
-
Görüşme kontrolleri:
-
Ses sessize alma/sesi açma
-
Video etkinleştirme/devre dışı bırakma
-
Kamera değiştirme
-
Flaş kontrolü
-
-
Görüşme yönetimi:
-
Görüşmeyi sonlandırma işlevi
-
Hata işleme
-
Bağlantı durumu izleme
-
-
Kod Yapısı
Temel Dosyalar
-
ECV175_iOS_DEMOApp.swift
-
Uygulama giriş noktası
-
Ana navigasyon yapısını kurar
-
Temel durum nesnelerini başlatır:
-
AppState
-
ConfigurationManager
-
-
Environment object'leri yapılandırır
-
-
AppState.swift
-
Uygulama durumunu yönetir
-
Ortam kalıcılığını işler
-
SDK yaşam döngüsünü kontrol eder
-
Durum geri yüklemeyi uygular
-
SDK örneğini yönetir
-
-
Views Dizini
-
Screens/:-
EnvironmentsScreen.swift: Ortam seçimi ve yapılandırması -
MainScreen.swift: Ana arayüz ve görüşme başlatma -
CallScreen.swift: Video görüşme arayüzü -
QueueScreen.swift: Kuyruk yönetimi
-
-
Components/: Yeniden kullanılabilir UI bileşenleri -
Uygun durum yönetimi ile SwiftUI görünümlerini uygular
-
En İyi Uygulamalar
-
Durum Yönetimi
-
Bağımlılık enjeksiyonu için
@EnvironmentObjectkullanın -
Temiz endişe ayrımını koruyun
-
Uygun hata işlemeyi uygulayın
-
Reaktif güncellemeler için
@Publishedözelliklerini kullanın -
Durum kalıcılığını uygun şekilde işleyin
-
-
Navigasyon
-
Tip güvenli navigasyon rotalarını kullanın
-
Uygun geri navigasyonu uygulayın
-
Derin bağlantı senaryolarını işleyin
-
Navigasyon durumunu yönetin
-
Navigasyon hatalarını işleyin
-
-
SDK Entegrasyonu
-
SDK'yı sadece gerektiğinde başlatın
-
SDK yaşam döngüsünü düzgün şekilde işleyin
-
SDK işlemleri için hata işlemeyi uygulayın
-
Kaynakları verimli şekilde yönetin
-
SDK olaylarını düzgün şekilde işleyin
-
Sorun Giderme
-
Yaygın Sorunlar
-
SDK başlatma hataları:
-
Ortam yapılandırmasını kontrol edin
-
Ağ bağlantısını doğrulayın
-
Uygun izinlerin olduğundan emin olun
-
-
Navigasyon durumu tutarsızlıkları:
-
Navigasyon rotalarını doğrulayın
-
Durum yönetimini kontrol edin
-
Navigasyon hatalarını işleyin
-
-
Ortam yapılandırma sorunları:
-
Yapılandırma ayarlarını doğrulayın
-
URL formatlarını kontrol edin
-
Gerekli alanları doğrulayın
-
-
-
Hata Ayıklama İpuçları
-
Detaylı hata mesajları için konsol günlüklerini kontrol edin
-
Ortam yapılandırmasını doğrulayın
-
Uygun SDK başlatmayı sağlayın
-
Ağ bağlantısını izleyin
-
İzin durumunu kontrol edin
-
Xcode hata ayıklama araçlarını kullanın
-
SDK Entegrasyonu ve Teknik Detaylar
Temel Yapılandırma ve Derleme Sistemi
-
Build.swift
-
Farklı derleme çeşitlerini ve ortamları yönetir
-
Birden fazla bundle tanımlayıcısını destekler:
-
ccr.ECV175-iOS-DEMO.CORE: Core bundle
-
-
Her ortam yapılandırması şunları içerir:
-
Servis URL'si
-
Kuyruk yapılandırmaları
-
Önceden tanımlanmış ayarlar
-
-
-
AppState.swift
-
SDK entegrasyonu için merkezi durum yönetimi
-
Temel sorumluluklar:
-
SDK örneği yaşam döngüsü yönetimi
-
Ortam yapılandırması kalıcılığı
-
Durum geri yükleme
-
Olay işleme koordinasyonu
-
-
Reaktif güncellemeler için
@Publishedözelliklerini kullanır -
Ortam seçimi için UserDefaults kalıcılığını uygular
-
Ekran Bazlı SDK Entegrasyonu
-
EnvironmentsScreen
-
Ortam seçimi ve yapılandırması
-
SDK Entegrasyonu:
-
Ortam yapılandırmalarını yönetir
-
Önceden tanımlanmış ve özel ortamları işler
-
Ortam seçimini kalıcı hale getirir
-
Seçilen yapılandırma ile SDK'yı başlatır
-
-
-
MainScreen
-
Görüşme başlatma için birincil arayüz
-
SDK Entegrasyonu:
-
Video görüşme örneğini başlatır
-
İzinleri yönetir (kamera, mikrofon)
-
Kuyruk seçimini işler
-
Görüşme olay dinleyicilerini kurar
-
Temel özellikler:
// SDK başlatma let call = await appState.sdk?.createVideoCall() // Olay işleme ECVModules?.onCallEvent.append { (videoCall, newEvent, lastEvent) in // Görüşme olaylarını işle }
-
-
-
QueueScreen
-
Kuyruk yönetimi ve temsilci bağlantısı
-
SDK Entegrasyonu:
-
Kuyruk katılmayı işler
-
Temsilci bağlantısını yönetir
-
Temel özellikler:
// Kuyruğa katılma let dialCallParameters = DialCallParameters( callerName: name, queue: queue, attributes: [queueKey: queueValue] ) // Temsilci bağlantı işleme let isAgentConnected = await call.agentConnected?.value
-
-
-
CallScreen
-
Video görüşme arayüzü
-
SDK Entegrasyonu:
-
WebRTC bağlantısını yönetir
-
Video/ses akışlarını işler
-
Görüşme özelliklerini kontrol eder
-
Temel özellikler:
// WebRTC kurulumu let webRtcConnection = videoCall?.connect() // Akış yönetimi localRenderer = webRtcConnection?.localStream remoteRenderer = webRtcConnection?.remoteStream // Görüşme kontrolleri func toggleLocalAudio() func toggleLocalVideo() func toggleFlashlight() func switchCamera() func switchViewRenderers()
-
-
-
TestScreen
-
Geliştirme ve test arayüzü
-
SDK Entegrasyonu:
-
Temel SDK kullanımını gösterir
-
Farklı SDK sürümlerini test eder
-
Olay işlemeyi gösterir
-
Temel özellikler:
// SDK başlatma let sdk = ECVSdk(config: ECVSdkConfiguration( name: "Test", serviceUrl: "https://srv12.ccr.group:41743" )) // Görüşme oluşturma ve olay işleme let call = await sdk.createVideoCall() ECVModules.onCallEvent.append { /* olay işleme */ }
-
-
SDK Sürüm Uyumluluğu
-
ECV 1.75 Özellikleri
-
Kuyruk soketi desteği
-
Gelişmiş olay işleme
-
İyileştirilmiş temsilci bağlantı yönetimi
-
Daha iyi durum yönetimi
-
Olay İşleme Sistemi
-
Görüşme Olayları
-
Olay türleri:
-
AgentConnected -
CallEnded -
Error
-
-
Olay işleme:
ECVModules?.onCallEvent.append { (videoCall, newEvent, lastEvent) in switch newEvent.type { case .AgentConnected: // Temsilci bağlantısını işle case .CallEnded: // Görüşme sonunu işle case .Error: // Hataları işle } }
-
-
Durum Yönetimi
-
Görüşme durumu takibi
-
Bağlantı durumu izleme
-
Hata durumu işleme
-
Kuyruk durumu yönetimi
-
SDK Entegrasyonu için En İyi Uygulamalar
-
Başlatma
-
SDK'yı sadece gerektiğinde başlatın
-
Yapılandırmayı düzgün şekilde işleyin
-
SDK yaşam döngüsünü yönetin
-
Başlatma hatalarını işleyin
-
-
Olay İşleme
-
Uygun olay filtrelemeyi kullanın
-
Tüm olay türlerini işleyin
-
Hata işlemeyi uygulayın
-
Olay dinleyicilerini temizleyin
-
-
Kaynak Yönetimi
-
Kaynakları düzgün şekilde temizleyin
-
Uygulama sonlandırmasında temizliği işleyin
-
Belleği verimli şekilde yönetin
-
Arka plan/ön plan geçişlerini işleyin
-
-
Hata İşleme
-
Kapsamlı hata işlemeyi uygulayın
-
Kullanıcı geri bildirimi sağlayın
-
Ağ sorunlarını işleyin
-
SDK'ya özgü hataları yönetin
-
Sonuç
ECV175_iOS_DEMO uygulaması, ECV Video Görüşme SDK'sını kullanarak video görüşme işlevselliğini uygulamak için sağlam bir temel sağlar. Bu kılavuzu takip ederek ve uygulamanın mimarisini anlayarak, kendi iOS uygulamalarınıza video görüşme özelliklerini etkili bir şekilde entegre edebilirsiniz.
Belirli özellikler veya uygulama detayları hakkında daha ayrıntılı bilgi için lütfen SDK dokümantasyonuna ve API referansına bakın.
Olaylar ve Durum Yönetimi
Giriş
ECV iOS SDK asenkron olarak çalışır. Durum değişikliklerini, hataları ve diğer önemli olayları uygulamanıza iletmek için olay tabanlı bir mimari kullanır. Bu olayları anlamak, duyarlı ve sağlam bir kullanıcı arayüzü oluşturmak için çok önemlidir.
Bu kılavuz, SDK olaylarının yapısını detaylandırır, temel olay türlerini listeler ve ilgili durum özelliklerini belirtir.
Olaylara Abone Olma
Olayları sdk.modules.onCallEvent örneği üzerinde dinlersiniz:
sdk.modules.onCallEvent.append { (videoCall: VideoCall, newEvent: VideoCallEvent, lastEvent: VideoCallEvent) in
if(videoCall.rtcId != call?.rtcId){
return // Sadece mevcut görüşmeyle ilgili olayları yakaladığımızdan emin oluyoruz. // tüm görüşmelerin olaylarını yakalamak için bu kodu yorum satırı yapın
}
if(newEvent.type == .Error){
// Hata olayını işle
}
else if(newEvent.type == .AgentConnected) {
// AgentConnected olayını işle
}
else {
print("ECVModules?.onCallEvent'ten: \(newEvent)")
}
}
Her iki abonelik yöntemi için detaylı kod örnekleri için "Video Görüşme Olay İşleme" bölümüne bakın.
Olay Yapısı (VideoCallEvent)
Temel Alanlar:
-
type: VideoCallEventType: (Gerekli) Olayın türünü belirten bir enum değeri. Nasıl tepki vereceğinizi belirlemek için kontrol edeceğiniz birincil alan budur. -
detail: String?: (İsteğe bağlı) Olaya özel ek string bilgisi sağlar (örn.GotRtcIdiçinrtcId,DialSuccessiçin bir etkileşim ID'si,CallEndediçin bir neden). -
objData: Any?: (İsteğe bağlı)SignalingConnectedsırasındaWebRtcConnectionveya belirli hatalarda bir HTTP yanıt nesnesi gibi ilgili nesneleri içerebilir. Bu veriye erişirken tip kontrolü (isveyainstanceof) kullanın. -
data: [String: String]: (İsteğe bağlı, genellikle boş) Olayla ilişkili potansiyel anahtar-değer verileri için genel bir harita. -
createdAt: Date: Olayın SDK içinde oluşturulduğu tarih.
Olay Türü Referansı (VideoCallEventType)
İşte yaygın olay türlerinin, bir görüşmenin tipik aşamalarına göre gruplandırılmış bir dökümü:
Aşama 1: Başlatma ve Arama
-
GotRtcId-
Ne Zaman:
sdkInstance.createVideoCall()başarıyla backend'den benzersiz bir görüşme tanımlayıcısı aldıktan sonra tetiklenir. -
Veri:
event.detailrtcId'yi (String) içerir. -
Yanıt:
rtcId'yi saklayın. Daha sonraVideoCallörneğini almak ve aramayı başlatmak (call.start()) için buna ihtiyacınız olacak.
-
-
DialSuccess-
Ne Zaman:
call.start()başarıyla arama isteğini backend'e gönderdikten ve onay aldıktan sonra tetiklenir (genellikle bir Etkileşim ID'si içerir). -
Veri:
event.detailEtkileşim ID'sini içerebilir.event.objDataham JSON yanıtını tutabilir. -
Yanıt: Genellikle bekleme/kuyruk durumuna geçebileceğinizi gösterir.
-
-
Error(Başlatma/Arama Sırasında)-
Ne Zaman:
rtcIdalınamazsa,call.start()parametreleri geçersizse, backend arama isteğini reddederse veya ağ sorunları oluşursa meydana gelebilir. -
Veri:
event.errorECVError'ı içerir.event.detaildaha fazla bağlam içerebilir.event.objDatabir HTTP yanıtı tutabilir.CALL_NOT_INITIALIZED,DIAL_FAILEDgibi belirliErrorTypesiçinerror.error'ı kontrol edin. -
Yanıt: Kullanıcıya bir hata mesajı gösterin. Görüşmenin devam etmesini engelleyin. Kullanılamaz durumdaysa
VideoCallörneğini temizleyin.
-
Aşama 2: Kuyruk ve Temsilci Bağlantısı
-
OnQueue-
Ne Zaman: Başarılı bir aramadan sonra tetiklenir, arayanın artık bir temsilci beklediğini gösterir.
-
Veri: Genellikle özel veri gerekmez.
-
Yanıt: Bekleme arayüzünü gösterin (örn.
QueueScreen).
-
-
AgentConnected-
Ne Zaman: Bir temsilci görüşmeyi kabul ettiğinde tetiklenir. Bu, eşler arası medya bağlantısını kurmak için tetikleyicidir.
-
Veri: Özel veri yok.
-
Yanıt: WebRTC bağlantısını başlatın:
-
WebRtcConnection'ı almak içinvideoCall.connect()'i çağırın. -
WebRTC kurulumunu başlatmak için
webRtcConnection.startRoom()'u çağırın. -
Ana görüşme ekranına (
CallScreen) gidin.
-
-
-
Error(Kuyruk Sırasında)-
Ne Zaman: Kuyruk zaman aşımı, kuyruk mekanizmasıyla ilgili ağ sorunları (
QUEUE_SOCKET_ERROR) veya backend sorunları nedeniyle oluşabilir. -
Veri:
event.errorECVError'ı içerir. -
Yanıt: Kullanıcıya görüşmenin bağlanamadığını bildirin. Kuyruk ekranından geri dönün. SDK otomatik olarak
CallEnded'i tetiklemezse temizliği sağlamak içinvideoCall.hangup()'ı çağırın.
-
-
Hangup/CallEnded(Kuyruk Sırasında)-
Ne Zaman: Kullanıcı açıkça görüşmeyi sonlandırırsa (
videoCall.hangup()) veya görüşme bir temsilci bağlanmadan önce backend tarafından sonlandırılırsa. -
Veri:
event.detailbir neden içerebilir ("LOCAL_HANGUP" vb.). -
Yanıt: Kuyruk ekranından geri dönün. Arayüzün temizlendiğinden emin olun.
-
Aşama 3: WebRTC Bağlantı Kurulumu
Bu olaylar genellikle WebRtcConnection tarafından dahili olarak işlenir ancak hata ayıklama veya gelişmiş kullanım durumları için gözlemlenebilir. Başarıyı işaret eden temel olay WebRtcConnected'dır.
-
SignalingConnected: Sinyal sunucusuna WebSocket bağlantısı kuruldu. -
SignalingRegistered: İstemci, oda (rtcId) için sinyal sunucusuna başarıyla kaydedildi. -
JoinedRoom: HTTP/joinisteği başarılı, başlangıç parametreleri alındı (ICE sunucuları, başlatıcı durumu gibi).event.objDataJoinRoomResponse'u içerir. -
RtcPeerConnectionCreated: Temel WebRTCPeerConnectionnesnesi oluşturuldu.event.objDataPeerConnectionClient'ı tutar. -
GotOffer/SentOffer: Eşten alınan / eşe gönderilen SDP Teklifi.event.objDataJSON mesajını içerir. -
GotAnswer/SentAnswer: Eşten alınan / eşe gönderilen SDP Yanıtı.event.objDataJSON mesajını içerir. -
WebRtcConnected-
Ne Zaman: WebRTC PeerConnection (ICE ve DTLS) tamamen kuruldu ve medya akışı başlayabilir.
-
Veri: Özel veri yok.
-
Yanıt: Genellikle medya yolunun hazır olduğunu bilmek için bir tetikleyici olarak kullanılır.
CallScreen'deki başlangıç yükleme göstergelerini gizleyebilirsiniz.
-
-
TextChannelConnected: Metin komutları (bekletme, flaş vb.) için kullanılan özel veri kanalı açık.event.objDataDataChannel'ı tutar. -
WebRtcDisconnected/WebRtcFailed: WebRTC bağlantısı beklenmedik şekilde kesildi veya başarısız oldu. Genellikle kısa süre sonra birCallEndedolayına yol açar.
Aşama 4: Aktif Görüşme ve Medya
-
GotLocalStream: Yerel kamera yakalama başladı.event.objDataVideoCapturer'ı içerebilir. -
GotRemoteStream: Uzak medya akışı mevcut (genellikleWebRtcConnectedcivarında tetiklenir).-
Yanıt: Uzak
SurfaceViewRenderer'ın bağlı olduğundan emin olun.
-
-
AudioMuted/AudioUnmuted: Yerel ses gönderme durumu değişti (setAudioEnabledtarafından tetiklendi).-
Yanıt: Sessiz düğmesi arayüz durumunu güncelleyin.
-
-
VideoMuted/VideoUnmuted: Yerel video gönderme durumu değişti (setVideoEnabledtarafından tetiklendi).-
Yanıt: Video sessiz düğmesi arayüz durumunu güncelleyin. Potansiyel olarak yerel video önizleme katmanını gösterin/gizleyin.
-
-
RemoteAudioMuted/RemoteAudioUnmuted: Uzak katılımcı sesini sessize aldı/sesi açtı.-
Yanıt: İsteğe bağlı olarak uzak tarafın sessiz olduğunu gösteren bir gösterge gösterin.
-
-
RemoteVideoMuted/RemoteVideoUnmuted: Uzak katılımcı videosunu sessize aldı/sesi açtı.-
Yanıt: Uzak video renderer'ında bir katman veya gösterge gösterin/gizleyin.
-
-
StartHold/EndHold: Görüşme temsilci tarafından bekletildi veya bekletme kaldırıldı (genellikle metin veri kanalı üzerinden tetiklenir).-
Yanıt: "Görüşme Bekletildi" katmanını gösterin/gizleyin. SDK (
autoHandleHoldSideEffectstrue ise) yanıt olarak yerel medyayı otomatik olarak sessize alabilir/sesi açabilir.
-
-
TakePhotoOn/TakePhotoOff: Temsilci tarafından başlatılan fotoğraf yakalama özellikleriyle ilgili sinyaller.-
Yanıt: Gerekirse arayüzü ayarlayın (örn. potansiyel olarak yerel videoyu tam ekran yapın).
autoHandleCameraSwitchtrue ise SDK otomatik olarak kameraları değiştirebilir.
-
-
TextChannelMessage: Metin veri kanalı üzerinden alınan bir komut veya mesaj.-
Veri:
event.detailham mesaj dizesini içerir (örn. "FLASH_ON", "STATUS|VIDEO|MUTED|rtcId"). -
Yanıt: SDK birçok standart mesajı dahili olarak işler (HOLD, PICKUP, MUTE durumları, FLASH komutları gibi). Uygulamanıza özel özel mesajlara tepki verebilirsiniz.
-
Aşama 5: Görüşme Sonlandırma
-
Hangup-
Ne Zaman: Yerel olarak
videoCall.hangup()çağrıldığında hemen tetiklenir. -
Veri: Özel veri yok.
-
Yanıt: Backend görüşme sonunu onaylamadan önce arayüz temizliğini başlatmak için kullanılabilir.
CallEnded'in kesin son olay olduğunu unutmayın.
-
-
CallEnded-
Ne Zaman: Görüşme oturumunun tamamen sonlandığını gösteren son olay, yerel olarak (
hangup()tamamlandığında), uzaktan (temsilci/eş görüşmeyi sonlandırdığında) veya kurtarılamaz bir hata nedeniyle. -
Veri:
event.detailgenellikle bir neden içerir (örn. "LOCAL_HANGUP", "REMOTE_HANGUP", "PEER_DISCONNECTED", "CONNECTION_TIMEOUT", hata açıklaması). -
Yanıt: Bu, şunları yapmak için kesin sinyaldir:
-
Tüm görüşme ile ilgili arayüzü temizleyin (renderer'lar, kontroller).
-
Görüşme ekranından ayrılın.
-
Belirli
VideoCall'a bağlı tüm kaynakları serbest bırakın. SDK genellikle bu olaydan sonraVideoCallörneğine olan dahili referansını kaldırır.
-
-
Durum Özellikleri
Olaylar değişiklikleri sinyal ederken, bazı mevcut durum özelliklerini de kontrol edebilirsiniz:
-
VideoCallÜzerinde:-
rtcId: String: Benzersiz görüşme tanımlayıcısı (GotRtcId'den sonra mevcut). -
dialResponse: [String: Any]?:DialSuccessolayı gerçekleştiğinde, bu özellik ham arama yanıtını içerir. -
agentConnected: Boolean:AgentConnectedolayı gerçekleştiyse true. -
webRtcConnection: WebRtcConnection?: İlişkili WebRTC bağlantısı (connect()çağrıldıktan sonra mevcut).
-
Genellikle ara yüz durumunuzu güncellemek için olaylara tepki vermek, bu özellikleri sürekli kontrol etmekten daha iyi bir uygulamadır. Bu özellikleri başlangıç durumu kontrolleri veya gerektiğinde kararlar için kullanın (örn. connect()'i çağırmadan önce AgentConnected'ı kontrol etmek).
Özelleştirme Kılavuzu
Giriş
Sağlanan Demo Uygulama (ECV175_iOS_DEMO), ECV SDK'nın temel işlevlerini gösterir. Ancak, üretim uygulamanızın kesinlikle farklı UI/UX gereksinimleri, yapılandırma yöntemleri ve veri ihtiyaçları olacaktır. Bu kılavuz, SDK ve demo kavramlarını kendi uygulamanıza uyarlamak için tavsiyeler sağlar.
1. UI Uygulaması
Demo SwiftUI kullanır, ancak SDK'nın kendisi UI'dan bağımsızdır. Bunu şunlarla oluşturulmuş uygulamalara entegre edebilirsiniz:
-
SwiftUI
-
UIKit
-
Bunların herhangi bir kombinasyonu.
UI için Temel Hususlar:
-
Kendi UI'ınızı Oluşturun: Demo UI ekranlarını basitçe kopyalamayın. Uygulamanızın görünümüne, hissine ve kullanıcı akışına uygun ekranlar tasarlayın.
-
Temel SDK Etkileşimleri Aynı Kalır: UI araç setinizden bağımsız olarak, SDK ile temel etkileşimler devam eder:
-
İzinler: Bir görüşme başlatmadan önce Kamera, Mikrofon (ve S+ için Bluetooth Bağlantı) izinlerini istemeli ve işlemelisiniz.
-
Video Renderer'ları: Video göstermek için düzeninizde
RTCMTLVideoViewörnekleri sağlamanız gerekir. -
Renderer Yaşam Döngüsü: Bu kritik öneme sahiptir.
RTCVideoRenderer'ların yaşam döngüsünü doğru şekilde yönetmelisiniz:-
Bunları
UIViewkullanarak başlatın. -
Bunları
webRtcConnection.localVideoRenderer/remoteVideoRendererkullanarak yerel/uzak akışlara bağlayın.
-
-
Görüşme Durumu Gösterimi: UI'ınız, SDK olaylarına dayalı olarak mevcut görüşme durumunu yansıtmalıdır (örn. "Bağlanıyor...", "Temsilci bekleniyor...", "Bağlandı", "Bekletildi").
-
Görüşme Kontrolleri: Şunlar için UI öğeleri (Düğmeler, Simgeler) uygulayın:
-
Sesi Sessize Alma/Açma (
webRtcConnection.setAudioEnabled(...)) -
Videoyu Açma/Kapatma (
webRtcConnection.setVideoEnabled(...)) -
Kamerayı Değiştirme (
webRtcConnection.switchCamera(...)) -
Görüşmeyi Sonlandırma (
videoCall.hangup())
-
-
Olay İşleme: UI katmanınız, durumunu güncellemek, ekranlar arasında gezinmek ve hataları işlemek için SDK olaylarını dinlemelidir.
-
2. Yapılandırma (ECVSdkConfiguration)
Demo'nun EnvironmentsScreen.swift'i, farklı backend ortamlarını kolayca test etmek için tasarlanmıştır. Üretim uygulamanızda muhtemelen bu ekrana ihtiyacınız olmayacaktır.
Üretim Yapılandırma Stratejileri:
-
Sabit Yapılandırma: Uygulamanız yalnızca bir backend ortamına bağlanıyorsa (örn. üretim),
ECVSdk'yı başlatırkenECVSdkConfigurationdeğerlerini sabit kodlayabilirsiniz.// Örnek: Application.onCreate veya DI modülü içinde let prodConfig = ECVSdkConfiguration( name: "My App Prod" serviceUrl = "https://your-prod.ecv.example.com" // ... gerekirse diğer parametreler ... ) let sdkInstance = ECVSdk("MyAppProdInstance", prodConfig) -
Dinamik Yapılandırma:
ECVSdk'yı başlatmadan önce yapılandırma detaylarını (serviceUrl,webrtcUrlgibi) kendi uygulama backend'inizden alın. Bu, uygulama güncellemeleri gerektirmeden endpoint'leri merkezi olarak yönetmenizi sağlar.-
Uygulamanız yapılandırmayı sunucunuzdan alır.
-
Alınan URL'leri kullanarak
ECVSdkConfiguration'ı oluşturur. -
ECVSdk'yı başlatır.
-
3. Görüşme Verisi (DialCallParameters)
Demo, seçilen ortama göre görüşme verisi için açılır listeleri (kuyruk seçimi) dinamik olarak eklemek üzere Build.swift'te selectableQueues kullanır. Bu, demo'nun çoklu ortam kurulumuna özeldir.
Uygulamanızda, videoCall.start()'ı çağırmadan hemen önce DialCallParameters'ı ilgili bağlamsal verilerle doldurmalısınız.
Örnek:
// Kullanıcı profil verisi
val userId = "user123"
val accountType = "Premium"
val intent = "Fatura Sorgusu"
// Hedef kuyruk/beceri
val targetQueue = "BillingSupport"
// SDK örneğini al ve görüşme oluştur
val videoCall = sdkInstance.createVideoCall()
// ... GotRtcId için bekle ...
// Uygulamaya özel verilerle parametreleri oluştur
val dialParams = DialCallParameters(
callerName = "User $userId", // Veya gerçek kullanıcı adı
attributes = [
"userId": userId,
"accountType": accountType,
"callIntent": intent
],
acdAttributes = [
"skill": "Billing" // Örnek ACD özelliği
],
queue = targetQueue, // Hedef kuyruğu açıkça ayarla
additionalHeaders = ["Authorization": "Bearer \(getUserAuthToken())"] // Örnek kimlik doğrulama
)
// Görüşmeyi başlat
videoCall.start(dialParams)
// Kuyruk/Bekleme ekranına git
4. Olay İşleme Mantığı
Demo olaylara nasıl abone olunacağını gösterirken, yanıt olarak ne yaptığınız uygulamaya özeldir. Uygulamanızın şu temel olayları doğru şekilde işlediğinden emin olun:
5. Gelişmiş Özelleştirme (İsteğe Bağlı)
-
Özel Veri Kanalı Mesajları: Backend'iniz metin veri kanalı üzerinden özel komutlar gönderiyorsa (HOLD, FLASH vb. ötesinde),
TextChannelMessageolayını dinleyebilir ve özel uygulama davranışını uygulamak içinevent.detail'i ayrıştırabilirsiniz. -
ConnectParametersAyarı: Belirli ağ ortamları veya kalite gereksinimleri için,videoMaxBitrate, codec'ler veya ICE filtreleme modları gibiConnectParameters'daki parametreleri ayarlamayı deneyebilirsiniz. Bu gelişmiş seçenekler hakkında detaylar için WebRTC dokümantasyonuna bakın. -
Ses Yönetimi:
ConnectParameters'da varsayılanlar (useSpeakerPhonevb.) sağlanırken, daha karmaşık ses yönlendirmesi temel SDK kullanımının kapsamı ötesinde daha derin entegrasyon veya özelleştirme gerektirebilir.
6. İzinler
Her zaman iOS'un izin isteme en iyi uygulamalarını takip edin:
-
İzinleri yalnızca gerektiğinde isteyin (görüşmeyi başlatmadan hemen önce).
-
İzinlerin (Kamera, Mikrofon) neden gerekli olduğunu açıkça açıklayın.
-
Kullanıcının izinleri reddettiği durumları zarif bir şekilde işleyin (örn. arama işlevselliğini devre dışı bırakın, ayarlardan nasıl etkinleştirileceği konusunda talimatlar sağlayın).
Sorun Giderme Kılavuzu
Bu kılavuz, ECV iOS SDK'sını entegre ederken veya kullanırken karşılaşılan yaygın sorunlar için çözümler ve hata ayıklama adımları sağlar.
Yaygın Sorunlar ve Çözümleri
Derleme ve Bağımlılık Hataları
-
Hata: "Could not find module 'ECV175_iOS_SDK'"
-
Neden: Xcode gerekli framework dosyalarını bulamıyor.
-
Çözüm:
-
ECV SDK framework'ünün projenize düzgün şekilde gömüldüğünden emin olun.
-
Framework'ün hedefinizin "Frameworks, Libraries, and Embedded Content" bölümünde listelendiğini doğrulayın.
-
Proje ayarlarınızdaki framework arama yollarının doğru konumu içerdiğini kontrol edin.
-
Derleme klasörünü temizleyin (Cmd + Shift + K) ve projeyi yeniden derleyin.
-
-
-
Hata: "Undefined symbols for architecture"
-
Neden: Gerekli bağımlılıkların eksik olması veya mimari uyumsuzlukları.
-
Çözüm:
-
Tüm gerekli framework'lerin projenizde düzgün şekilde bağlandığından emin olun.
-
Dağıtım hedefinin ve mimarilerin uygulamanız ile SDK arasında eşleştiğini doğrulayın.
-
Uyumlu bağımlılık sürümlerini kullandığınızı kontrol edin.
-
Projeyi temizleyin ve yeniden derleyin.
-
-
-
Hata: "Code signing failed"
-
Neden: Kod imzalama veya sağlama profilleriyle ilgili sorunlar.
-
Çözüm:
-
Apple Developer hesabınızın aktif olduğunu doğrulayın.
-
Sağlama profilinizin gerekli yetkileri içerdiğini kontrol edin.
-
İmzalama sertifikanızın geçerli ve düzgün şekilde yüklendiğinden emin olun.
-
Gerekirse sağlama profillerinizi güncelleyin.
-
-
Çalışma Zamanı Çökmeleri
-
Çökme: "Thread 1: EXC_BAD_ACCESS"
-
Neden: Bellek erişim sorunları, genellikle WebRTC veya yerel kodla ilgili.
-
Çözüm:
-
SDK'nın kullanımdan önce düzgün şekilde başlatıldığından emin olun.
-
Uygulamanızda düzgün bellek yönetimini kontrol edin.
-
Tüm gerekli izinlerin verildiğini doğrulayın.
-
Çökmenin tam noktasını belirlemek için hata ayıklayıcıyı kullanın.
-
-
-
Çökme: "Fatal error: Unexpectedly found nil while unwrapping an Optional value"
-
Neden: SDK nesnesine başlatılmadan önce veya temizlendikten sonra erişmeye çalışma.
-
Çözüm:
-
SDK Başlatılmamış: Herhangi bir SDK işlevselliğine erişmeden önce
ECVSdk.shared.initialize(...)'ın çağrıldığından emin olun. -
VideoCall Nil:
rtcId'nin geçerli olduğunu ve görüşmenin sonlanmadığını doğrulayın. -
WebRTC Bağlantısı Nil:
AgentConnectedolayından sonravideoCall.connect()'in başarıyla çağrıldığından emin olun. -
View Controller'lar: Düzgün view controller yaşam döngüsü yönetimini sağlayın.
-
-
-
Çökme: WebRTC veya Medya İşleme ile İlgili
-
Neden: WebRTC bileşenlerinin yaşam döngüsünün düzgün yönetilmemesi.
-
Çözüm:
-
WebRTC kaynaklarının
deinitveyaviewWillDisappear'da düzgün şekilde temizlendiğinden emin olun. -
Kamera ve mikrofon izinlerinin verildiğini doğrulayın.
-
Arka plan/ön plan geçişlerinin düzgün işlenmesini kontrol edin.
-
WebRTC işlemleri için düzgün thread yönetimini sağlayın.
-
-
-
Çökme: "Permission Denial"
-
Neden: Uygun izinler olmadan kamera veya mikrofona erişmeye çalışma.
-
Çözüm:
-
AVCaptureDevice.requestAccesskullanarak düzgün izin isteme akışını uygulayın. -
Arama işlevselliğini etkinleştirmeden önce izin durumunu kontrol edin.
-
İzin reddini UI'da zarif bir şekilde işleyin.
-
Info.plist'in gerekli izin açıklamalarını içerdiğini doğrulayın.
-
-
Medya Kalitesi Sorunları
-
Düşük Video/Ses Kalitesi (Gecikme, Donma, Pikselleşme, Bozuk Ses)
-
Hata Ayıklama:
-
Ağ: Ağ bant genişliğini, gecikmeyi ve paket kaybını kontrol edin. Farklı ağlarda test edin (Wi-Fi vs Hücresel).
-
Cihaz Performansı: Eski cihazlar daha yüksek çözünürlüklerde kodlama/çözümleme konusunda zorlanabilir.
-
Yapılandırma: Video çözünürlüğü, kare hızı veya bit hızı ayarlarını ayarlamayı düşünün.
-
WebRTC İstatistikleri: Detaylı performans metrikleri için WebRTC istatistik toplamayı etkinleştirin.
-
-
Belirli Özellik Sorunları
-
Kamera Değiştirme Çalışmıyor
-
Hata Ayıklama:
-
webRTCConnection.switchCamera()'nın çağrıldığından emin olun. -
Değiştirme denemesi sırasındaki hatalar için günlükleri kontrol edin.
-
Cihazın birden fazla kamera kullanılabilir olduğunu doğrulayın.
-
Düzgün kamera başlatmayı sağlayın.
-
-
-
Bekletme/Devam Etme Otomatik Olarak Sessize Almıyor/Sesi Açmıyor
-
Hata Ayıklama:
-
Yapılandırmada
autoHandleHoldSideEffects'in etkin olduğunu doğrulayın. -
Bekletme/devam etme olaylarının doğru şekilde alınıp alınmadığını kontrol edin.
-
Metin kanalı bağlantı durumunu doğrulayın.
-
Olay işleme uygulamasını kontrol edin.
-
-
Genel Hata Ayıklama Adımları
-
Konsol Günlüklerini Kontrol Edin: SDK günlüklerini izlemek için Xcode'un konsolunu kullanın. İlgili etiketlere göre filtreleme yapın ve uyarıları ve hataları arayın.
-
Yapılandırmayı Doğrulayın:
ECVSdkConfiguration,DialCallParametersve herhangi bir özel parametreyi ortam gereksinimlerinize göre çift kontrol edin. -
Ağ Bağlantısını Kontrol Edin: Cihazın gerekli endpoint'lere ulaşabildiğini doğrulayın. Farklı ağlarda test edin ve herhangi bir güvenlik duvarı sorunu olup olmadığını kontrol edin.
-
Uygulamayı Basitleştirin: Temel yapılandırma ile başlayın ve sorunları izole etmek için kademeli olarak karmaşıklık ekleyin.
-
Aşamayı İzole Edin: Hatasının ne zaman oluştuğunu belirleyin: SDK başlatma, arama, kuyruk, WebRTC bağlantısı veya medya işleme.
-
Demo Uygulamasına Başvurun: Uygulamanızı, özellikle olay işleme ve view controller yaşam döngüsü yönetimi etrafında sağlanan demo kaynak koduyla karşılaştırın.
-
Tüm Olayları Günlüğe Kaydedin: Arama akışını izlemek ve eksik veya beklenmeyen olayları belirlemek için olay işlemenize günlük kaydı ekleyin.
Destek ile İletişim
Destek ile iletişime geçerken lütfen şunları sağlayın:
-
SDK Sürümü: (örn. ECV-175-iOS-SDK-v1.2.3)
-
Test Edilen Cihaz(lar): iPhone/iPad modeli, iOS sürümü
-
Backend Sürümü: ECV v1.75+
-
Yapılandırma:
ECVSdkConfiguration'ınız, ilgiliDialCallParametersve herhangi bir özel parametre -
Detaylı Sorun Açıklaması: Belirtiler, yeniden üretme adımları, beklenen vs gerçek davranış
-
İlgili Konsol Günlükleri: Sorun sırasında SDK ve uygulama günlükleri dahil günlükleri yakalayın
-
Ekran Görüntüleri/Videolar: Sorunu göstermek için yardımcı olacaksa

