В Xcode 11, как я могу настроить намерение для работы в фоновом режиме?

TL;DR

Как в iOS 13 и Xcode 11 настроить намерение для работы в фоновом режиме и просто вернуть результат, чтобы его можно было использовать в качестве входных данных для других действий в приложении «Ярлыки»?

Подробная информация о том, чего я пытаюсь достичь

В моем приложении есть список песен, которые я хочу показать с помощью ярлыков (на самом деле, метаданные о песне, а не о самой песне). Идея состоит в том, чтобы дать опытным пользователям возможность интегрировать эту базу данных музыки с другими приложениями или действиями, которые они хотят. Например, может оказаться полезным получить список предстоящей музыки на следующий месяц и использовать его для создания событий календаря для каждой песни. Доступ к этому списку в приложении «Ярлыки» может позволить им это сделать.

Я создал намерение под названием «Список всех непрочитанных музыкальных релизов» и определил его ответ как список объектов, содержащих информацию о каждой песне. Проблема в том, что когда я перехожу в приложение «Ярлыки», создаю новый ярлык с помощью этого намерения и запускаю его, оно открывает мое приложение вместо того, чтобы работать в фоновом режиме.

Шаги, которые я сделал для создания и настройки намерений

Вот общее определение того, что я сделал для настройки намерений в проекте. В следующем разделе будет собственно исходный код и скриншоты.

  1. Создан новый файл определения намерения SiriKit.
  2. Created a new Intent.
    • Defined it's Title, Description, Parameters, and disabled the "Intent is eligible for Siri Suggestions" checkbox.
    • Определил свойство ответа как массив (потому что это будет список песен) и настроил выход как это свойство массива.
  3. Создано новое расширение намерений с отключенным флажком Включить расширение пользовательского интерфейса. Идея здесь состоит в том, чтобы обработать запрос пользователя в фоновом режиме и вернуть список с результатами - пользовательский интерфейс не требуется.
  4. В целевом объекте расширения Intents определил массив IntentsSupported внутри Info.plist с именем намерения, созданного на шаге 2.
  5. Сделал класс 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.


person Marcos Tanaka    schedule 06.01.2020    source источник


Ответы (1)


Благодаря Эдфорду с форумов разработчиков Apple мне удалось заставить его работать. В файле определения намерений необходимо установить флажок «Намерение подходит для предложений Siri», чтобы фоновое выполнение работало.

person Marcos Tanaka    schedule 10.01.2020
comment
Это сэкономило мне много времени, спасибо! - person Dominic Williams; 13.03.2021