TL; DR
На iOS 13 и Xcode 11, как я могу настроить Intent для работы в фоновом режиме и просто вернуть результат, чтобы его можно было использовать в качестве ввода для других действий в приложение Shortcuts?
Подробная информация о том, чего я пытаюсь достичь
В моем приложении есть список песен, которые я хочу раскрыть с помощью ярлыков (на самом деле, метаданные о песне, а не песня сам). Идея состоит в том, чтобы дать опытным пользователям возможность интегрировать эту базу данных musi c с другими приложениями или действиями, которые они хотят. Например, может оказаться полезным получить список предстоящих музыки c на следующий месяц и использовать его для создания событий календаря для каждой песни. Доступ к этому списку в приложении ярлыков может позволить им сделать это.
Я создал Intent под названием «Список всех непрочитанных выпусков Musi c» и определил его ответ в виде списка объектов, который содержит информацию о каждой песне. Проблема заключается в том, что когда я go для приложения ярлыков создаю новый ярлык с помощью этого намерения и запускаю его, он открывает мое приложение вместо запуска в фоновом режиме.
Шаги, которые я сделал для создания и настроить Intents
Вот высокоуровневое определение того, что я сделал для настройки Intents в проекте. В следующем разделе будут указаны исходный код и снимки экрана.
- Создан новый файл определения намерений SiriKit.
- Создан новый замысел.
- Определили его заголовок, описание, параметры и отключили флажок «Намерение подходит для предложений Siri».
- Определяли свойство ответа как массив (потому что это будет список песен ), и сконфигурировал Output как свойство этого массива.
- Создано новое расширение Intents, с отключенным флажком «Включить расширение UI». Идея здесь состоит в том, чтобы обработать запрос пользователя в фоновом режиме и вернуть список с результатами - пользовательский интерфейс не требуется.
- В цели расширения Intents определил массив IntentsSupported внутри Info.plist с именем намерения. создано в шаге 2.
- Сделано, чтобы класс
IntentHandler
реализовал протокол, сгенерированный для намерения, созданного в шаге 2.
Примеры кода и снимки экрана
Мой файл определения намерений SiriKit и намерение GetUnreadReleases:
Ответ намерения GetUnreadReleases:
Расширение содержания IntentHandler
класс:
import Intents
class IntentHandler: INExtension, GetUnreadReleasesIntentHandling {
func handle(intent: GetUnreadReleasesIntent, completion: @escaping (GetUnreadReleasesIntentResponse) -> Void) {
let response = GetUnreadReleasesIntentResponse(code: .success, userActivity: nil)
let release1 = IntentRelease(identifier: "1", display: "Teste 1")
release1.name = "Name test 1"
release1.artist = "Artist test 1"
response.releases = [release1]
completion(response)
}
func resolveMediaType(for intent: GetUnreadReleasesIntent, with completion: @escaping (IntentMediaTypeResolutionResult) -> Void) {
if intent.mediaType == .unknown {
completion(.needsValue())
} else {
completion(.success(with: intent.mediaType))
}
}
override func handler(for intent: INIntent) -> Any {
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return self
}
}
Расширение содержания Info.plist
file :
Заключение
Итак, я хотел бы, чтобы это намерение работало в фоновом режиме, собрал список песен на основе пользовательских параметров и вернуть этот список для использования в качестве входных данных для других действий в приложении «Ярлыки».
Похоже, что в предыдущих версиях редактора Intents (Xcode <11 / iOS <13.0) был флажок «Поддерживает фоновое выполнение», который делал именно это, но я не могу найти это больше на Xcode 11. </p>