iOS - AppDelegate не получает userActivity при запуске намерения Siri

Фактически создаю приложение в 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 и он включен. Любое предложение? Я что-то упускаю?


person lcpr_phoenix    schedule 23.02.2021    source источник


Ответы (1)


Хорошо, я понял: проблема заключалась в том, что я пытался получить NSUserActivity из метода func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool из моего AppDelegate, который никогда не запускается, забудьте об этом и не следуйте документация от Apple, если вы используете SwiftUI, потому что он больше не работает.

Для SwiftUI вы должны реализовать модификатор .onContinueUserActivity() для получения NSUserActivity, и отсюда вы можете делать все, что вам нужно. Пример кода:

WindowGroup {
    ContentView().onContinueUserActivity(NSStringFromClass(INStartCallIntent.self), perform: { userActivity in
        //do something
    })
}
person lcpr_phoenix    schedule 24.02.2021