По сути, вам необходимо создать расширение Intents для вашей цели, чтобы обрабатывать аудиовызовы из собственной истории вызовов.
В Xcode:
Файл -> Новый -> Цель
Выберите Внутреннее расширение
Вот основной класс для расширения, как оно должно выглядеть
class IntentHandler: INExtension, INStartAudioCallIntentHandling {
func handle(intent: INStartAudioCallIntent, completion: @escaping (INStartAudioCallIntentResponse) -> Void) {
let response: INStartAudioCallIntentResponse
defer {
completion(response)
}
// Ensure there is a person handle
guard intent.contacts?.first?.personHandle != nil else {
response = INStartAudioCallIntentResponse(code: .failure, userActivity: nil)
return
}
let userActivity = NSUserActivity(activityType: String(describing: INStartAudioCallIntent.self))
response = INStartAudioCallIntentResponse(code: .continueInApp, userActivity: userActivity)
}
}
Затем вам нужно предоставить URLScheme для вашего приложения, чтобы начать вызов VoIP, когда делегат приложения получает openURL
Вот расширение NSUserActivity, которое поможет вам определить намерение начального вызова
import Intents
@available(iOS 10.0, *)
protocol SupportedStartCallIntent {
var contacts: [INPerson]? { get }
}
@available(iOS 10.0, *)
extension INStartAudioCallIntent: SupportedStartCallIntent {}
@available(iOS 10.0, *)
extension NSUserActivity {
var startCallHandle: String? {
guard let startCallIntent = interaction?.intent as? SupportedStartCallIntent else {
return nil
}
return startCallIntent.contacts?.first?.personHandle?.value
}
}
Вам также необходимо зарегистрировать свою схему URL в настройках цели:
Настройки цели Xcode, выбрать Информационную карточку, а в нижних Типах URL выберите +, чтобы добавить новый тип и дать емуимя, например voipCall
В AppDeledate переопределите следующую функцию
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
if userActivity.startCallHandle {
// START YOUR VOIP CALL HERE ----
}
return true
}