如何检查快捷指令是否已存在并为Intent设置自定义唯一标识符
解决方案
INIntent的identifier是系统自动生成的只读属性,确实不支持开发者手动赋值,你需要通过添加自定义参数的方式存储你自己的唯一ID。
实现步骤
- 第一步:为你的Intent添加自定义ID参数
如果你是通过Xcode的.intentdefinition文件定义的Intent,直接在对应的Intent配置页添加一个类型为String的参数,命名为customIdentifier即可,Xcode自动生成的Intent类会自动包含这个可读写的属性。
如果你是手动继承INIntent创建的自定义类,直接新增一个customIdentifier的String属性,同时在NSSecureCoding的实现中完成该属性的编码、解码逻辑。 - 第二步:创建快捷指令时赋值自定义ID
当你生成INShortcut实例关联Intent时,将你生成的唯一ID赋值给Intent的customIdentifier属性,再添加到Siri快捷指令中心即可。 - 第三步:修改存在性检查逻辑
将原代码中匹配系统identifier的逻辑,改为匹配你自定义的customIdentifier参数即可,修改后的参考代码如下:
public static func shortcutExists(id: String, completion: @escaping ((Bool) -> Void)) { var exists = false INVoiceShortcutCenter.shared.getAllVoiceShortcuts { voiceShortcutsFromCenter, error in defer { completion(exists) } guard let voiceShortcuts = voiceShortcutsFromCenter, error == nil else { return } for voiceShortcut in voiceShortcuts { // 此处替换为你自己定义的Intent类名 guard let customIntent = voiceShortcut.shortcut.intent as? MyCustomIntent else { continue } if customIntent.customIdentifier == id { exists = true break } } } }
注意事项
- 遍历语音快捷指令时需要先做类型转换,只匹配你自己的自定义Intent类型,避免和其他App的快捷指令、系统内置快捷指令产生类型不匹配的崩溃
- 如果你的App支持多种不同类型的自定义Intent,可以再新增一个
intentType参数做类型区分,避免不同类型Intent的ID重复导致误判
内容的提问来源于stack exchange,提问作者Houman
相关产品推荐
相关产品推荐

