声明一下,现在国区的App Store应中国特色社会主义的要求,禁止上架有callkit功能的APP,已有的也要整改,删除callkit功能。
因为篇幅太长,所以把这个分成了三部分,希望读者不要打我。。
上一篇文章讲了PushKit的集成和CallKit的所有主要功能。这篇文章将讲解如何从系统通话记录中直接拨打App的电话。
需要继续完善上一篇文章的代码哦。。
iOS CallKit与PushKit的集成(二)
创建工具类
在第一篇文章中,我们已经导入了Intents.framework,下面开始对他进行操作。
首先创建两个协议,目的是为了加几个属性:
protocol StartCallConvertible {
var startCallHandle: String? { get }
var video: Bool? { get }
}
extension StartCallConvertible {
var video: Bool? {
return nil
}
}
@available(iOS 10.0, *)
protocol SupportedStartCallIntent {
var contacts: [INPerson]? { get }
}
@available(iOS 10.0, *)
extension INStartAudioCallIntent: SupportedStartCallIntent {}
@available(iOS 10.0, *)
extension INStartVideoCallIntent: SupportedStartCallIntent {}
然后对NSUserActivity进行扩展,实现StartCallConvertible协议:
extension NSUserActivity: StartCallConvertible {
var startCallHandle: String? {
if #available(iOS 10.0, *) {
guard
let interaction = interaction,
let startCallIntent = interaction.intent as? SupportedStartCallIntent,
let contact = startCallIntent.contacts?.first
else {
return nil
}
return contact.personHandle?.value
}
return nil
}
var video: Bool? {
if #available(iOS 10.0, *) {
guard
let interaction = interaction,
let startCallIntent = interaction.intent as? SupportedStartCallIntent
else {
return nil
}
return startCallIntent is INStartVideoCallIntent
}
return nil
}
}
回到AppDelegate中,实现代理方法:
override func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
if #available(iOS 10.0, *) {
guard let handle = userActivity.startCallHandle else {
log.info("Callkit& Could not determine start call handle from user activity: \(userActivity)")
return false
}
guard let video = userActivity.video else {
log.info("Callkit& Could not determine video from user activity: \(userActivity)")
return false
}
//如果当前有电话,需要根据自己App的业务逻辑判断
//如果没有电话,就打电话,调用自己的打电话方法。
return true
}
return false
}
至此,从通话记录中调到自己App打电话的功能就实现啦。