使用Swift5。在我的voip应用程序中,所有呼叫日志历史记录均会根据需要显示在本机最近记录中。从最近的应用程序中选择未接来电时,它会打开我的应用程序,但什么也不做。实际上,这在某种程度上是故意的,因为我不希望提供呼出电话。仅入站。
因此,出于这个原因,我的目标是使用本机iOS电话方法返回呼叫。 CallKit有可能吗?
这是我的提供程序配置:
required init?(coder aDecoder: NSCoder) {
let configuration = CXProviderConfiguration(localizedName: "My voip app")
configuration.maximumCallGroups = 2
configuration.maximumCallsPerCallGroup = 2
configuration.iconTemplateImageData = #imageLiteral(resourceName: "IconMask").pngData()
if let callKitIcon = UIImage(named: "iconMask80") {
configuration.iconTemplateImageData = callKitIcon.pngData()
}
configuration.supportedHandleTypes = [.phoneNumber]
callKitProvider = CXProvider(configuration: configuration)
callKitCallController = CXCallController()
通话结束时,我正在使用此电话:
let callUpdate = CXCallUpdate()
callUpdate.remoteHandle = CXHandle(type: .phoneNumber, value: remoteCallNumber!)
按照Speakerbox示例的模型,将其放置在AppDelegate中,但是似乎没有被调用。
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard let handle = userActivity.startCallHandle else {
print("Could not determine start call handle from user activity: \(userActivity)")
return false
}
guard let video = userActivity.video else {
print("Could not determine video from user activity: \(userActivity)")
return false
}
callManager.startCall(handle: handle, videoEnabled: video)
return true
}
选择“最近通话”时,加载我的应用程序屏幕不会产生任何错误。但是,声明的目标是让上面调用的useractivity函数并以本地方式而不是voip应用程序进行呼叫。
更新:我现在解决了这个问题。借用Speakerbox示例中的一些代码,这就是我所期望的,可以正常工作。
新的快捷文件:
import Foundation
import Intents
extension NSUserActivity: StartCallConvertible {
var startCallHandle: String? {
guard
let interaction = interaction,
let startCallIntent = interaction.intent as? SupportedStartCallIntent,
let contact = startCallIntent.contacts?.first
else {
return nil
}
return contact.personHandle?.value
}
var video: Bool? {
guard
let interaction = interaction,
let startCallIntent = interaction.intent as? SupportedStartCallIntent
else {
return nil
}
return startCallIntent is INStartVideoCallIntent
}
}
AppDelegate:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard let handle = userActivity.startCallHandle else {
print("Could not determine start call handle from user activity: \(userActivity)")
return false
}
guard let number = URL(string: "tel://" + handle) else { return false }
UIApplication.shared.open(number)
return true
}