SiriKit: Как установить свойство вывода, когда намерение обрабатывается в основном приложении? - PullRequest
0 голосов
/ 10 марта 2020

Контекст

Я работаю над добавлением поддержки Siri Shortcuts (Intents?) В нетривиальное приложение. Моя главная цель - позволить пользователям автоматизировать некоторые задачи в приложении с помощью Shortcuts.app.

Я определил MyIntent в Intents.intentdefinition в цели Intents Extension вместе с MyIntentResponse, что имеет выходное свойство file: INFile.

Учитывая нетривиальный характер приложения, я пересылаю намерение из Intent Extension в основное приложение:

    func handle(intent: MyIntent, completion: @escaping (MyIntentResponse) -> Void) {
        // Can't handle the intent in the app extension yet, let the main app handle it
        let response = MyIntentResponse(code: .continueInApp, userActivity: nil)

        // TODO: How to update the response (with an output property) if the intent continues in the app?
        completion(response)
    }

Проблема

Как только намерение направлено в приложение, вызывается метод AppDelegate.application(_:continue:restorationHandler:) с пользовательским действием, у которого также установлено свойство interaction: INInteraction?.

Из предоставленного INInteraction я могу получить и intent: INIntent и response: INIntentResponse для соответствующей обработки намерения.

Однако, чего не хватает, так это способа передать обратно в Shortcuts.app информацию о результате намерения и предоставить требуемое свойство вывода (file: INFile).

Вопрос

Есть ли способ предоставления ответа о намерении с установленным свойством вывода, если намерение обрабатывается в основном приложении?

Детали

Интересно, что есть метод AppDelegate который должен обрабатывать этот вариант использования:

optional func application(_ application: UIApplication, 
                   handle intent: INIntent, 
        completionHandler: @escaping (INIntentResponse) -> Void)

И документация гласит:

Приложение с расширением приложения Intents может использовать этот метод для прямой обработки намерения вместо обработки это в расширении приложения. Вы можете использовать этот метод для реализации рабочих процессов, которые вы не можете легко реализовать в своем расширении. Например, вы можете использовать его для запуска или управления сеансом тренировки пользователя. Если ваше приложение не запущено, SiriKit запускает ваше приложение в фоновом режиме, чтобы интерфейс Siri оставался активным.

Дополнительная информация: https://developer.apple.com/documentation/uikit/uiapplicationdelegate/2887573-application

In Согласно теории, можно просто вызвать completionHandler с недавно созданным экземпляром MyIntentResponse, в котором свойство file будет установлено правильно.

Однако этот метод никогда не вызывается. Вместо этого вышеупомянутый AppDelegate.application(_:continue:restorationHandler:) называется.

1 Ответ

0 голосов
/ 10 марта 2020

Если вы используете .handleInApp вместо .continueInApp в своей функции handle () расширения Intents, то функция handleIntent () вашего делегата приложения будет вызываться вместо функции continue: restorationHandler (). Это позволит вам вернуть обратно INIntentResponse обратно в расширение в завершениеХандлера.

...