Фактически создаю приложение в swiftUI и пытаюсь обработать намерение Siri начать звонок в моем приложении. Я сделал цель расширения в своем проекте, добавил возможности Siri и группы приложений в основных целях и целях расширения, мой обработчик намерений вообще правильно запускает запрос Siri, запуск Siri и запрос на вызов какого-либо контакта работает отлично, мои приложения запускаются и в этот момент предполагается получение активности от намерения, но ничего не происходит ...
Мой обработчик намерений выглядит так:
import Intents
class IntentHandler: INExtension, INStartCallIntentHandling {
func handle(intent: INStartCallIntent, completion: @escaping (INStartCallIntentResponse) -> Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INStartCallIntent.self))
guard intent.contacts?.first?.personHandle?.value != nil else {
completion(INStartCallIntentResponse(code: .failureContactNotSupportedByApp, userActivity: userActivity))
return
}
let response = INStartCallIntentResponse(code: .continueInApp, userActivity: userActivity)
completion(response)
}
func resolveContacts(for intent: INStartCallIntent, with completion: @escaping ([INStartCallContactResolutionResult]) -> Void) {
var contactName = ""
if let contacts = intent.contacts {
contactName = contacts.first?.displayName ?? ""
}
//This shared method is used to get contact data for completion
DataManager.sharedManager.findContact(contactName: contactName, with: {
contacts in
switch contacts.count {
case 1: completion([.success(with: contacts.first ?? INPerson(personHandle: INPersonHandle(value: "1800-olakase", type: .phoneNumber), nameComponents: nil, displayName: "ola k ase", image: nil, contactIdentifier: nil, customIdentifier: INPersonHandle(value: "1800-olakase", type: .phoneNumber).value))])
case 2...Int.max: completion([.disambiguation(with: contacts)])
default: completion([.unsupported()])
}
})
}
func confirm(intent: INStartCallIntent, completion: @escaping (INStartCallIntentResponse) -> Void) {
let userActivity = NSUserActivity(activityType: NSStringFromClass(INStartCallIntent.self))
let response = INStartCallIntentResponse(code: .ready, userActivity: userActivity)
completion(response)
}
}
Добавлено INStartCallIntent
в IntentsSupported
в Info.plist
Итак, когда код в func handle(intent: INStartCallIntent, completion: @escaping (INStartCallIntentResponse) -> Void)
был завершен, предполагается, что NSUserActivity
будет отправлен моему делегату приложения непосредственно в func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
... но не запускает эту функцию. В настоящий момент мое приложение не может совершать новые вызовы, потому что не получает userActivity
для получения контактных данных.
Также я пытаюсь использовать func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool
, но тоже не работает.
Чтобы быть более конкретным, я следую этому руководству, но меняю INStartAudioCallIntent
для INStartCallIntent
, потому что не рекомендуется. Я не знаю, проблема в swiftUI или нет, я использовал @ UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
, чтобы добавить делегата моего приложения в жизненный цикл swiftUI.
И да, у моего приложения есть запрос на авторизацию Siri и он включен. Любое предложение? Я что-то упускаю?