SiriKit Intents Extension: Избегать / автоматически разрешать параметр, когда значения предоставляются динамически - PullRequest
0 голосов
/ 11 января 2020

Я создаю приложение, которое использует Intents Extension для отслеживания различных показателей, таких как вес, количество шагов, частота сердечных сокращений и т. Д. c. Я хочу предложить пользователю единицы измерения для выбора, основываясь на метрике c, которую он хочет отслеживать. Например, если пользователь отслеживает выпитую воду, он может выбирать между литром, унциями жидкости, миллилитрами или чашками, и я представлю ей единицы измерения. Если пользователь отслеживает шаги, единственная используемая единица измерения - это «шаги», и не имеет смысла предоставлять для нее параметры устранения неоднозначности или динамические c. Я заметил, что при использовании параметров Dynami c сгенерированная для него provideUnitOptions функция будет вызываться каждый раз, даже когда в функции разрешения я отправляю notRequired результат разрешения.

Вот функции из моего обработчика намерений:

func resolveMetric(for intent: MeasurementIntent, with completion: @escaping (INStringResolutionResult) -> Void) {
    let requestedMetric = intent.metric
    if requestedMetric == nil {
        completion(INStringResolutionResult.needsValue())
    } else {
        metricService.retrieveUserMetrics { (success) in
            let metricNames = self.metricService.metricNamesMap.keys
            if metricNames.contains(requestedMetric!){
                completion(.success(with: requestedMetric!))
            } else {
                completion(.disambiguation(with: Array(metricNames)))
            }
        }
    }
}

func provideMetricOptions(for intent: MeasurementIntent, with completion: @escaping ([String]?, Error?) -> Void) {
    metricService.retrieveUserMetrics { (success) in
        let metricNames = self.metricService.metricNamesMap.keys
        completion(Array(metricNames), nil)
    }
}

func resolveUnit(for intent: MeasurementIntent, with completion: @escaping (INStringResolutionResult) -> Void) {
    let metric = self.metricService.metricNamesMap[intent.metric!]!
    let units = metric.units.getSystemUnits(defaultUnit: metric.defaultUnit).map { $0.name }
    if units.count == 1 {
        completion(.notRequired())
    } else if intent.unit == nil {
        completion(.disambiguation(with: units))
    } else {
        completion(.success(with: intent.unit!))
    }
}

//This is called even if in resolveUnit I sent .notRequired resolution. Same for .success
func provideUnitOptions(for intent: MeasurementIntent, with completion: @escaping ([String]?, Error?) -> Void) {
    let metric = self.metricService.metricNamesMap[intent.metric!]!
    let units = metric.units.getSystemUnits(defaultUnit: metric.defaultUnit).map { $0.name }
    completion(units, nil)
}

Функция resolUnit вызывается как до, так и после provideUnitOptions Я могу отключить параметры Dynami c, но в этом случае у пользователя не будет возможности использовать предопределенные единицы из ярлыка. Как вы думаете, я должен продолжить? Я что-то пропустил? Спасибо!

1 Ответ

0 голосов
/ 11 января 2020

Нашел обходной путь, который помог мне преодолеть эту проблему. Таким образом, allowOptions будет вызываться, по крайней мере, в первый раз для завершения разрешения, такого как success и notRequired, но не для устранения неоднозначности или translationRequired. Устранение неоднозначности здесь не поможет, но если я использую подтверждениеRequired, я могу автоматически пропустить мой единственный вариант. В запросе подтверждения мне не нужно указывать значение поля, все работает.

if units.count == 1 {
        completion(.confirmationRequired(with: units[0]))
}

Надеюсь, у нас будет еще более динамичный c способ обработки пользовательских параметров в последующем обновлении iOS, но пока этого вполне достаточно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...