Контекст
Я работаю над добавлением поддержки 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:)
называется.