如何修改SiriKit支付指令识别规则?INPayBillIntent自定义词汇问题
解决SiriKit INPayBillIntent 自定义机构名称的识别问题
我之前做Siri账单支付功能时也碰到过一模一样的情况——默认情况下Siri确实需要“Bill”这类关键词来绑定到INPayBillIntent,核心原因是要区分「给Devon转账」和「支付Devon的账单」这两种不同意图。不过咱们可以通过几个配置调整,实现你要的“Pay Devon”直接触发账单支付的效果:
1. 完善自定义词汇的注册
首先要让Siri把“Devon”和账单收款人强关联起来,在App启动时调用INVocabularyAPI完成词汇注册:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let customBillPayees = ["Devon"] INVocabulary.shared().setVocabularyStrings(customBillPayees, of: .billPayee) return true }
这个操作会明确告诉Siri:“Devon”是一个账单支付机构,而非普通联系人。
2. 调整Intent Definition的短语模板
打开你的.intentdefinition文件,找到INPayBillIntent的配置:
- 切换到
Phrases标签页,默认触发短语可能只有“Pay [payee] Bill”这类格式,手动添加新的短语模板:Pay [payee]Settle [payee]
这样Siri会学习这些新触发模式,不需要“Bill”关键词也能关联到账单支付意图。
- 同时检查
payee参数设置,确保它的类型是BillPayee,并且勾选“Supports Search Results”,让Siri能从你的自定义词汇库中匹配机构名称。
3. 优化Intent Handler的解析逻辑
在实现INPayBillIntentHandling的类中,重写resolvePayee方法,主动帮Siri区分账单机构和普通联系人:
extension BillPaymentIntentHandler: INPayBillIntentHandling { func resolvePayee(for intent: INPayBillIntent, with completion: @escaping (INBillPayeeResolutionResult) -> Void) { guard let payeeName = intent.payee?.name else { completion(.needsValue()) return } // 匹配自定义账单机构 if payeeName.lowercased() == "devon" { let billPayee = INBillPayee(name: payeeName) completion(.success(with: billPayee)) } else { // 其他名称根据业务需求返回对应结果 completion(.unsupported()) } } }
这一步很关键——Siri可能会把“Pay Devon”误判为转账意图,通过这里的解析,我们明确告知Siri这是账单支付的收款人。
4. 训练Siri适应你的使用习惯
完成配置后,多手动触发几次“Pay Devon”指令,比如在Siri中说出这句话并确认跳转到你的账单支付界面,Siri会学习你的使用习惯,后续识别会越来越准确。也可以用Xcode的Siri测试工具模拟语音输入,验证意图是否被正确识别。
内容的提问来源于stack exchange,提问作者Mohamad Sheikh
相关产品推荐
相关产品推荐

