在SiriKit扩展的INSendMessageIntent Handler中打开宿主应用遇阻:无continueInApp选项
解决SiriKit中INSendMessageIntent Handler打开宿主App的问题
我之前做SiriKit消息扩展时也碰到过一模一样的问题——翻遍了响应选项都没找到直接的continueInApp开关,后来才搞明白:INSendMessageIntent的响应逻辑和部分其他Intent不一样,得手动在代码里配置才行。
给你一步步拆解操作:
- 先在你的
INSendMessageIntentHandler的handle(intent:completion:)方法里,完成消息相关的业务逻辑(比如验证收件人合法性、处理消息内容等)。 - 最关键的一步:创建
INSendMessageIntentResponse时,要选择带RequiringAppLaunch后缀的响应码,比如.successRequiringAppLaunch——这个标识是告诉Siri,需要启动宿主App来完成后续操作。 - 最后手动给响应对象设置
continueInApp = true,再把响应传给completion回调即可。
直接上代码示例,一看就明白:
class SendMessageIntentHandler: NSObject, INSendMessageIntentHandling { func handle(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) { // 先处理消息相关逻辑:比如检查收件人是否存在 guard let recipient = intent.recipients?.first else { completion(INSendMessageIntentResponse(code: .failure, userActivity: nil)) return } // 创建需要跳转宿主App的响应对象 let response = INSendMessageIntentResponse(code: .successRequiringAppLaunch, userActivity: nil) response.continueInApp = true // 如果需要给宿主App传递数据,可以通过NSUserActivity实现 // let userActivity = NSUserActivity(activityType: "com.yourapp.sendMessage") // userActivity.userInfo = ["recipientName": recipient.displayName] // let response = INSendMessageIntentResponse(code: .successRequiringAppLaunch, userActivity: userActivity) completion(response) } }
另外还有两个注意点:
- 确保宿主App的
Info.plist已经正确配置了SiriKit权限(NS Siri Usage Description),如果需要跳转后传递数据,还要让扩展和宿主App共享同一个App Group。 - 别用错响应码:如果用
.success,Siri只会提示操作完成,不会打开App;必须用.successRequiringAppLaunch或.failureRequiringAppLaunch这类带RequiringAppLaunch的响应码,才会触发跳转逻辑。
内容的提问来源于stack exchange,提问作者Bharathi Mm
相关产品推荐
相关产品推荐

