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。
CXStartCallAction
是CXStartCallAction
的具体子类。 当用户发起拨出呼叫时,提供程序会将provider(_:perform:)
发送给其委托。 提供者的委托调用fulfill()
方法来指示该操作已成功执行。
CXTransaction一个对象,其中包含零个或多个要由调用控制器执行的操作对象。 它的addAction如CXStartCallAction ,CXEndCallAction,CXSetHeldCallAction。
希望您喜欢这篇文章,请❤️将此文章推荐给其他人。 让我知道您的反馈。 🙂
参考文献:
- https://developer.apple.com/documentation/callkit