Siri自定义意图INCurrencyAmount参数失效问题求助(FB12645837)
SiriKit INCurrencyAmount 参数解析异常排查与解决
核心问题总结
此前正常运行的费用记录自定义意图,近期出现INCurrencyAmount类型参数解析异常:
- 带验证规则时,Siri直接触发“金额不能为负”提示,自定义
resolveParameterExpenseAmount方法无法触发断点 - 移除验证规则后,方法可触发但参数为nil
- 新建仅含该参数的测试意图,仍触发默认验证错误;调整最小值后又触发最大值限制提示
- 临时改为Decimal类型后,Siri无法解析“dollar”“cents”等货币词汇
针对疑问的解答
1. 意图定义文件配置是否有误?
是,核心问题出在货币代码未配置和验证规则冲突上。早期版本正常可能是因为当时SiriKit对货币代码的要求较宽松,后续系统更新后验证逻辑收紧,导致配置不兼容。
2. SiriKit对INCurrencyAmount的验证是否存在问题?
官方验证逻辑本身无问题,但存在前置拦截特性:参数的预设验证规则会在自定义resolve方法执行前触发,一旦不符合规则直接返回错误,导致你无法调试后续逻辑。另外默认的数值范围限制(比如隐含的最大值100000)可能和你的需求不匹配,引发误拦截。
3. 是否必须指定货币代码?
是,必须配置用户可能使用的ISO 4217标准三位货币代码(比如USD对应dollar/cents)。Siri依赖货币代码来匹配用户表述中的货币词汇,未配置时无法正确解析金额,甚至会触发默认的验证错误。
具体修复步骤
- 补全货币代码配置:
在意图定义文件中找到该INCurrencyAmount参数,在“Currency Codes”列表中添加用户常用的货币类型(比如USD、CNY等),无需添加辅币代码(cents属于USD的一部分,仅需配置USD)。 - 迁移验证逻辑到自定义方法:
- 清空意图参数中所有预设的验证规则(最小值、最大值等),避免Siri前置拦截。
- 所有金额合法性检查(非负、范围限制等)放到
resolveParameterExpenseAmount方法中处理,示例逻辑:func resolveExpenseAmount(for intent: RecordExpenseIntent, with completion: @escaping (INCurrencyAmountResolutionResult) -> Void) { guard let amount = intent.expenseAmount else { // 参数为nil时,请求用户提供金额 completion(INCurrencyAmountResolutionResult.needsValue()) return } // 自定义非负验证 if amount.amount.doubleValue < 0 { completion(INCurrencyAmountResolutionResult.unsupported(forReason: .negativeAmount)) return } // 自定义范围验证 if amount.amount.doubleValue > 100000 { completion(INCurrencyAmountResolutionResult.unsupported(forReason: .amountTooLarge)) return } // 验证通过 completion(INCurrencyAmountResolutionResult.success(with: amount)) }
- 刷新意图代码:
修改配置后,在Xcode中执行Editor > Refresh SiriKit Intent,确保配置变更同步到生成的代码中。 - 清理缓存:
清理Xcode缓存(Product > Clean Build Folder),重启测试设备,避免Siri缓存旧的意图配置。
内容的提问来源于stack exchange,提问作者MacMc
相关产品推荐
相关产品推荐

