Aracılığıyla paylaş


CallKit ile tümleştirme

Bu belgede CallKit'i iOS uygulamanızla tümleştirme adımlarına geçeceğiz.

Ön koşullar

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 CallKitOptionsyapılandırılmış örneğiyle, işlemesi CallKitile 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()
  1. 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ın CXHandle . içinde displayNameForCallKit belirtilen bu değer, son arama günlüğünde tam olarak göründüğü şekildedir. öğesini seçin.
options.callKitRemoteInfo.displayNameForCallKit = "DISPLAY_NAME"
  1. 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 CallKitOptionsoluş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 CXProviderDelegatekadar 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ığı didActivateAudioSessiondurumlarda 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.

Sonraki adımlar