TL;DR
Как в iOS 13 и Xcode 11 настроить намерение для работы в фоновом режиме и просто вернуть результат, чтобы его можно было использовать в качестве входных данных для других действий в приложении «Ярлыки»?
Подробная информация о том, чего я пытаюсь достичь
В моем приложении есть список песен, которые я хочу показать с помощью ярлыков (на самом деле, метаданные о песне, а не о самой песне). Идея состоит в том, чтобы дать опытным пользователям возможность интегрировать эту базу данных музыки с другими приложениями или действиями, которые они хотят. Например, может оказаться полезным получить список предстоящей музыки на следующий месяц и использовать его для создания событий календаря для каждой песни. Доступ к этому списку в приложении «Ярлыки» может позволить им это сделать.
Я создал намерение под названием «Список всех непрочитанных музыкальных релизов» и определил его ответ как список объектов, содержащих информацию о каждой песне. Проблема в том, что когда я перехожу в приложение «Ярлыки», создаю новый ярлык с помощью этого намерения и запускаю его, оно открывает мое приложение вместо того, чтобы работать в фоновом режиме.
Шаги, которые я сделал для создания и настройки намерений
Вот общее определение того, что я сделал для настройки намерений в проекте. В следующем разделе будет собственно исходный код и скриншоты.
- Создан новый файл определения намерения SiriKit.
- Created a new Intent.
- Defined it's Title, Description, Parameters, and disabled the "Intent is eligible for Siri Suggestions" checkbox.
- Определил свойство ответа как массив (потому что это будет список песен) и настроил выход как это свойство массива.
- Создано новое расширение намерений с отключенным флажком Включить расширение пользовательского интерфейса. Идея здесь состоит в том, чтобы обработать запрос пользователя в фоновом режиме и вернуть список с результатами - пользовательский интерфейс не требуется.
- В целевом объекте расширения Intents определил массив IntentsSupported внутри Info.plist с именем намерения, созданного на шаге 2.
- Сделал класс
IntentHandler
реализацией протокола, созданного для намерения, созданного на шаге 2.
Примеры кода и скриншоты
Мой файл определения намерения SiriKit и намерение GetUnreadReleases:
Ответ GetUnreadReleases Intent:
Расширение Intents 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
расширения Intents:
Заключение
Итак, я хотел бы, чтобы это намерение работало в фоновом режиме, собирало список песен на основе параметров, определенных пользователем, и возвращало этот список для использования в качестве входных данных для других действий в приложении «Ярлыки».
Похоже, что в предыдущих версиях редактора намерений (Xcode ‹11 / iOS‹ 13.0) был флажок Поддерживает выполнение в фоновом режиме, который делал именно это, но я больше не могу найти его в Xcode 11.