CallKit ile tümleştirme
Bu belgede CallKit'i iOS uygulamanızla tümleştirme adımlarına geçeceğiz.
Ön koşullar
- Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
- Dağıtılan bir İletişim Hizmetleri kaynağı. İletişim Hizmetleri kaynağı oluşturun.
- Çağıran istemciyi etkinleştirmek için kullanıcı erişim belirteci. Daha fazla bilgi için bkz . Erişim belirteçleri oluşturma ve yönetme.
- İsteğe bağlı: Uygulamanıza sesli çağrı eklemek için hızlı başlangıcı tamamlayın
CallKit Tümleştirmesi (SDK içinde)
Azure İletişim Hizmetleri iOS SDK'sında CallKit Tümleştirmesi, CallKit ile etkileşimi bizim için işler. Sesi kapatma/açma, beklemede tutma/sürdürme gibi herhangi bir çağrı işlemi gerçekleştirmek için yalnızca Azure İletişim Hizmetleri SDK'da API'yi çağırmamız gerekir.
CallKitOptions ile çağrı aracısını başlatma
öğesinin CallKitOptions
yapılandırılmış örneğiyle, işlemesi CallKit
ile oluşturabilirizCallAgent
.
let options = CallAgentOptions()
let callKitOptions = CallKitOptions(with: createProviderConfig())
options.callKitOptions = callKitOptions
// Configure the properties of `CallKitOptions` instance here
self.callClient!.createCallAgent(userCredential: userCredential,
options: options,
completionHandler: { (callAgent, error) in
// Initialization
})
Giden aramalar için arama alıcısı bilgilerini belirtme
İlk olarak giden aramalar veya JoinCallOptions()
grup araması için bir örneği StartCallOptions()
oluşturmamız gerekir:
let options = StartCallOptions()
veya
let options = JoinCallOptions()
Ardından bir örneği oluşturun: CallKitRemoteInfo
options.callKitRemoteInfo = CallKitRemoteInfo()
- Arama alıcılarının görünen adını özelleştirmek ve değeri yapılandırmak için değerini
callKitRemoteInfo.displayNameForCallKit
atayınCXHandle
. içindedisplayNameForCallKit
belirtilen bu değer, son arama günlüğünde tam olarak göründüğü şekildedir. öğesini seçin.
options.callKitRemoteInfo.displayNameForCallKit = "DISPLAY_NAME"
- Kullanıcı söz konusu
cxHandle
kişiyi geri aradığında uygulamanın aldığı değeri atayın
options.callKitRemoteInfo.cxHandle = CXHandle(type: .generic, value: "VALUE_TO_CXHANDLE")
Gelen aramalar için arama alıcısı bilgilerini belirtme
İlk olarak örneğini CallKitOptions
oluşturmamız gerekir:
let callKitOptions = CallKitOptions(with: createProviderConfig())
Örneğin özelliklerini CallKitOptions
yapılandırın:
Değişkene provideRemoteInfo
geçirilen blok, gelen bir çağrı aldığımızda SDK tarafından çağrılır ve gelen arayan için CallKit'e geçirmemiz gereken bir görünen ad almalıyız.
callKitOptions.provideRemoteInfo = self.provideCallKitRemoteInfo
func provideCallKitRemoteInfo(callerInfo: CallerInfo) -> CallKitRemoteInfo
{
let callKitRemoteInfo = CallKitRemoteInfo()
callKitRemoteInfo.displayName = "CALL_TO_PHONENUMBER_BY_APP"
callKitRemoteInfo.cxHandle = CXHandle(type: .generic, value: "VALUE_TO_CXHANDLE")
return callKitRemoteInfo
}
Ses oturumlarını yapılandırma
Sesli oturumu yapılandırma, gelen aramayı yerleştirmeden veya kabul etmeden önce ve beklemeye alındıktan sonra aramayı sürdürmeden önce çağrılır.
callKitOptions.configureAudioSession = self.configureAudioSession
public func configureAudioSession() -> Error? {
let audioSession: AVAudioSession = AVAudioSession.sharedInstance()
var configError: Error?
do {
try audioSession.setCategory(.playAndRecord)
} catch {
configError = error
}
return configError
}
NOT: Contoso'nun ses oturumlarını zaten yapılandırdığı durumlarda BLOKTA HATA VERMEYİP hata döndürdüğü nil
nil
durumlarda
callKitOptions.configureAudioSession = self.configureAudioSession
public func configureAudioSession() -> Error? {
return nil
}
için sağlanırsa nil
configureAudioSession
SDK, SDK'daki varsayılan uygulamayı çağırır.
Gelen anında iletme bildirimi yükünü işleme
Uygulama gelen anında iletme bildirimi yükünü aldığında, bunu işlemek için aramamız handlePush
gerekir. Azure İletişim Hizmetleri Çağırma SDK'sı IncomingCall
olayı tetikler.
public func handlePushNotification(_ pushPayload: PKPushPayload)
{
let callNotification = PushNotificationInfo.fromDictionary(pushPayload.dictionaryPayload)
if let agent = self.callAgent {
agent.handlePush(notification: callNotification) { (error) in }
}
}
// Event raised by the SDK
public func callAgent(_ callAgent: CallAgent, didRecieveIncomingCall incomingcall: IncomingCall) {
}
Uygulama kapatıldığında veya başka bir şekilde anında iletme bildirimlerini işlemek için kullanabiliriz reportIncomingCall
.
if let agent = self.callAgent {
/* App is not in a killed state */
agent.handlePush(notification: callNotification) { (error) in }
} else {
/* App is in a killed state */
CallClient.reportIncomingCall(with: callNotification, callKitOptions: callKitOptions) { (error) in
if (error == nil) {
DispatchQueue.global().async {
self.callClient = CallClient()
let options = CallAgentOptions()
let callKitOptions = CallKitOptions(with: createProviderConfig())
callKitOptions.provideRemoteInfo = self.provideCallKitRemoteInfo
callKitOptions.configureAudioSession = self.configureAudioSession
options.callKitOptions = callKitOptions
self.callClient!.createCallAgent(userCredential: userCredential,
options: options,
completionHandler: { (callAgent, error) in
if (error == nil) {
self.callAgent = callAgent
self.callAgent!.handlePush(notification: callNotification) { (error) in }
}
})
}
} else {
os_log("SDK couldn't handle push notification", log:self.log)
}
}
}
CallKit Tümleştirmesi (Uygulama içinde)
CallKit'i uygulama içinde tümleştirmek ve SDK'da CallKit uygulamasını kullanmak istemiyorsanız buradaki hızlı başlangıç örneğine bakın. Ancak dikkat edilmesi gereken önemli şeylerden biri, sesi doğru zamanda başlatmaktır. Aşağıdaki gibi
let outgoingAudioOptions = OutgoingAudioOptions()
outgoingAudioOptions.muted = true
let incomingAudioOptions = IncomingAudioOptions()
incomingAudioOptions.muted = true
var copyAcceptCallOptions = AcceptCallOptions()
copyStartCallOptions.outgoingAudioOptions = outgoingAudioOptions
copyStartCallOptions.incomingAudioOptions = incomingAudioOptions
callAgent.startCall(participants: participants,
options: copyStartCallOptions,
completionHandler: completionBlock)
Hoparlörü ve mikrofonu sessize alma, CallKit didActivateAudioSession
çağrısına CXProviderDelegate
kadar fiziksel ses cihazlarının kullanılmadığından emin olun. Aksi takdirde arama bırakılabilir veya ses çalışmaz.
didActivateAudioSession
Ses akışlarının ne zaman başlatılması gerektiği.
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
Task {
guard let activeCall = await self.callKitHelper.getActiveCall() else {
print("No active calls found when activating audio session !!")
return
}
try await startAudio(call: activeCall)
}
}
func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
Task {
guard let activeCall = await self.callKitHelper.getActiveCall() else {
print("No active calls found when deactivating audio session !!")
return
}
try await stopAudio(call: activeCall)
}
}
private func stopAudio(call: Call) async throws {
try await self.callKitHelper.muteCall(callId: call.id, isMuted: true)
try await call.stopAudio(stream: call.activeOutgoingAudioStream)
try await call.stopAudio(stream: call.activeIncomingAudioStream)
try await call.muteIncomingAudio()
}
private func startAudio(call: Call) async throws {
try await call.startAudio(stream: LocalOutgoingAudioStream())
try await self.callKitHelper.muteCall(callId: call.id, isMuted: false)
try await call.startAudio(stream: RemoteIncomingAudioStream())
try await call.unmuteIncomingAudio()
}
CallKit'in çağırmadığı didActivateAudioSession
durumlarda sesi durdurmadan önce giden sesi kapatmak da önemlidir. Kullanıcı daha sonra mikrofonu el ile açabilir.
Dekont
Bazı durumlarda, uygulama yükseltilmiş ses izinlerine sahip olsa bile CallKit arama didActivateAudioSession
yapmaz, bu durumda geri arama alınana kadar ses kapalı kalır. Ayrıca kullanıcı arabiriminin hoparlör ve mikrofonun durumunu yansıtması gerekir. Aramadaki uzak katılımcı/sn, kullanıcının sesi de kapattığını görür. Bu durumlarda kullanıcının el ile açması gerekir.