CallKit简介

CallKit iOS,iOS应用程序中的音频呼叫支持,iOS应用程序中的视频呼叫支持

在此博客中,我仅关注CallKit框架,在下一个博客中,我将介绍Intent扩展和PushKit框架。 开始吧!

iOS上的生活并不总是适合VoIP应用程序开发人员。幸运的是,Apple在iOS 10中引入了CallKit来改变这一切!

VoIP应用程序今天如何工作?

通过CallKit,您可以将系统服务(蓝牙,Siri,Face time,电话应用程序)与VoIP服务集成在一起。 它提供了电话应用程序的呼叫接口,您的VoIP服务需要照顾到后端通信。
对于传入和传出呼叫,CallKit显示与“电话”应用程序相同的界面,从而使您的应用程序具有更原始的外观。
通过CallKit,您可以对系统级别的行为做出适当的响应,例如“请勿打扰”,“低网络连接”。

除了处理呼叫,您还可以提供“呼叫目录”应用程序扩展,以提供呼叫者ID信息以及与您的服务关联的阻止号码的列表。

既然您知道了CallKit的全部CallKit ,那么让我们仔细看一下理解和利用它所需要的一些基本概念。

  • CXProvider创建一个CXProvider实例并在整个VoIP应用程序中使用,它的对象负责报告系统发生的带外通知。使用提供的配置初始化一个新的提供程序实例。
  let provider: CXProvider = CXProvider (配置:type(of:self) 。providerConfiguration
  • CXProviderConfiguration应用程序的提供程序配置,代表其CallKit功能,您可以配置以下属性:
    –提供者的本地化名称,例如:应用程序名称
    ringtoneSound ,应用程序捆绑中的资源名称,用作来电的铃声,例如:“ MyRingtone.aif”
    MaximumCallGroups ,默认为2
    MaximumCallsPerCallGroup ,默认为5
    –在每次呼叫结束时,是否应将此提供商的呼叫包括在系统的“最近使用”列表中(includeCallsInRecents)。
    SupportsVideo ,无论VoIP服务是否支持视频,默认为否
    SupportedHandleTypes (CXHandleType),例如:supportedHandleTypes = [.phoneNumber]

静态var providerConfiguration: CXProviderConfiguration {让localizedName = NSLocalizedString(“ APPLICATION_NAME”,注释:“应用程序名称”)let providerConfiguration = CXProviderConfiguration(localizedName:localizedName)
providerConfiguration.supportsVideo = true
providerConfiguration.maximumCallsPerCallGroup = 1
providerConfiguration.supportedHandleTypes = [.phoneNumber]
如果让iconMaskImage = UIImage(named:“ myMask”){
providerConfiguration.iconTemplateImageData = UIImagePNGRepresentation(iconMaskImage)
}
providerConfiguration.ringtoneSound =“铃声.aif”
返回providerConfiguration
}
  • CXProviderDelegate协议定义了一组方法,当提供方开始或重置,请求事务,执行操作或音频会话更改其激活状态时,代表该提供方的对象将调用这些方法。 让我们仔细看看:
    处理提供者事件 ,在提供者开始或提供者重置时调用。
    确定事务的执行,在调用控制器执行事务时调用。
    处理呼叫动作 ,在提供商执行指定的开始/应答/结束/保持/静音/组/ DTMF(双音多频)呼叫动作时调用
    处理对音频会话激活状态的更改 ,在激活/禁用提供商的音频会话时调用。

当PushKit通知指示有来电时,您将生成适当的操作。 CallKit通过提供用于接听电话的系统界面来处理操作。

当系统允许传入呼叫并得到用户批准时,提供程序会将provider(_:perform:)发送给其委托人(如本博客中上文所述)。 提供者的委托调用fulfill()方法来指示该操作已成功执行。 要指示呼叫在当前时间以外的时间连接,您可以改为调用fulfill(withDateConnected:)

  // CXProvider类的reportNewIncomingCall函数将其报告给systemfunc的本地函数reportIncomingCall (uuid:UUID,handle:String,hasVideo:Bool = false,完成:(((Error?)-> Void)?= nil)// Signal到操作已成功执行的系统中。  完成 () 

在您本地的reportIncomingCall函数中,构造一个CXCallUpdate描述传入的呼叫,包括呼叫者。
系统使用CXCallUpdate对象将更改随时间传递给呼叫。

 让更新= CXCallUpdate () 
update.remoteHandle = CXHandle(类型:.phoneNumber,值:句柄)
update.hasVideo = hasVideo

向系统报告来电

 提供者。  reportNewIncomingCall (with:uuid,update:update){错误} 

仅在允许通话(即没有错误)的情况下,才将来电添加到应用程序的通话列表中,因为由于各种正当原因,通话可能会被“拒绝”。 有关更多详细信息,请参见CXErrorCodeIncomingCallError。

使用呼叫控制器启动去电,并处理与提供商委托者的后续交互。

CXCallController对象通过执行操作与调用进行交互。您可以使用request(_:completion:)方法request(_:completion:)在单个CXTransaction对象中执行一个或多个操作。

通话活动可能来自电话应用程序或任何其他系统服务。我们需要提供界面,以便我们的应用程序可以处理该事件。

为了向系统服务提供启动调用接口,需要重写这些功能。
当电话提供者收到传入呼叫或用户启动传出呼叫时,另一个呼叫者将由CXHandle对象标识。 对于通过电话号码标识的呼叫者,句柄类型为CXHandle.HandleType.phoneNumber ,值是数字序列。 对于通过电子邮件地址标识的呼叫者,句柄类型为CXHandle.HandleType.emailAddress ,值是电子邮件地址。 对于以任何其他方式标识的呼叫者,句柄类型为CXHandle.HandleType.generic ,并且值通常遵循某些特定于域的格式,例如用户名,数字ID或URL。

CXStartCallActionCXStartCallAction的具体子类。 当用户发起拨出呼叫时,提供程序会将provider(_:perform:)发送给其委托。 提供者的委托调用fulfill()方法来指示该操作已成功执行。

CXTransaction一个对象,其中包含零个或多个要由调用控制器执行的操作对象。 它的addAction如CXStartCallAction ,CXEndCallAction,CXSetHeldCallAction。

希望您喜欢这篇文章,请❤️将此文章推荐给其他人。 让我知道您的反馈。 🙂

参考文献:

  1. https://developer.apple.com/documentation/callkit