Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SiriKit意图扩展:动态提供值时避免/自动解析参数_Ios_Swift_Ios13_Sirikit_Intents Extension - Fatal编程技术网

Ios SiriKit意图扩展:动态提供值时避免/自动解析参数

Ios SiriKit意图扩展:动态提供值时避免/自动解析参数,ios,swift,ios13,sirikit,intents-extension,Ios,Swift,Ios13,Sirikit,Intents Extension,我正在开发一个应用程序,它使用Intents扩展来跟踪各种指标,如体重、步数、炉床率等。我想根据用户想要跟踪的指标,向用户提供可供选择的测量单位。例如,如果用户跟踪饮用水,她可以选择升、液盎司、毫升或杯,我将向她提供单位。如果用户跟踪步骤,则使用的唯一单位是“步骤”,为其提供消歧或动态选项是没有意义的。 我注意到,在使用动态选项时,每次都会调用为其生成的provideUnitOptions函数,即使在resolve函数中我发送了notRequired解析结果 以下是我的意图处理程序中的函数: f

我正在开发一个应用程序,它使用Intents扩展来跟踪各种指标,如体重、步数、炉床率等。我想根据用户想要跟踪的指标,向用户提供可供选择的测量单位。例如,如果用户跟踪饮用水,她可以选择升、液盎司、毫升或杯,我将向她提供单位。如果用户跟踪步骤,则使用的唯一单位是“步骤”,为其提供消歧或动态选项是没有意义的。 我注意到,在使用动态选项时,每次都会调用为其生成的provideUnitOptions函数,即使在resolve函数中我发送了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)
}
resolveUnit函数在provideUnitOptions之前和之后调用
我可以禁用动态选项,但在这种情况下,用户无法使用快捷方式中的预定义单位。你认为我应该怎么做?我错过什么了吗?谢谢大家!

找到了一个解决方法,帮助我克服了这个问题。 因此,provideOptions将被调用,至少第一次用于解决完成问题,如success和notRequired,但不用于消除歧义或确认Required。消除歧义在这里没有帮助,但如果我使用confirmationRequired,我可以自动传递我的唯一选项。在确认提示中,我不必包含字段值,任何操作都有效

if units.count == 1 {
        completion(.confirmationRequired(with: units[0]))
}
希望在以后的iOS更新中能够有一种更动态的方式来处理用户参数,但现在已经足够了