Я создаю приложение, которое использует 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, но в этом случае у пользователя не будет возможности использовать предопределенные единицы из ярлыка. Как вы думаете, я должен продолжить? Я что-то пропустил? Спасибо!