INPlayMediaIntentHandling异常:Siri媒体意图处理器未触发求助
我尝试实现INPlayMediaIntentHandling来捕获Siri指令(比如“嘿Siri,在MyApp中播放Hero”),但所有功能都无法正常运行——处理器方法完全没被调用,也没有执行任何逻辑。
我的意图处理器代码:
class IntentHandler: INExtension, INPlayMediaIntentHandling { func handle(intent: INPlayMediaIntent, completion: @escaping (INPlayMediaIntentResponse) -> Void) { if let identifier = intent.mediaSearch?.mediaIdentifier { print(identifier) } print("Aloha") completion(INPlayMediaIntentResponse(code: .continueInApp, userActivity: nil)) } func resolveMediaItems(for intent: INPlayMediaIntent, with completion: @escaping ([INPlayMediaMediaItemResolutionResult]) -> Void) { if let identifier = intent.mediaSearch?.mediaIdentifier { print(identifier) } print("Aloha") completion([INPlayMediaMediaItemResolutionResult.unsupported()]) } }
AppDelegate中的相关方法:
func application(_ application: UIApplication, handle intent: INIntent, completionHandler: @escaping (INIntentResponse) -> Void) { guard let playMediaIntent = intent as? INPlayMediaIntent else { completionHandler(INPlayMediaIntentResponse(code: .failure, userActivity: nil)) return } print("Print") print(playMediaIntent.mediaSearch?.mediaIdentifier ?? "Print") }
排查与修复步骤
确认Intent Extension配置:
确保项目已添加Intents Extension target,Extension的Info.plist中NSExtensionPrincipalClass指向IntentHandler,且IntentsSupported数组包含INPlayMediaIntent;按需配置IntentsRestrictedWhileLocked以支持锁屏使用。检查Siri权限配置:
主App的Info.plist必须添加NSSiriUsageDescription字段说明用途;在iOS设置中确认已给App开启Siri与搜索权限,且“嘿Siri”功能正常启用。移除AppDelegate中的冗余处理:
application(_:handle:completionHandler:)是旧版Intent处理方式,会和Intents Extension冲突,直接删除该方法,让Extension单独处理INPlayMediaIntent。修正Intent解析逻辑:
当前resolveMediaItems返回.unsupported()会导致Siri中断流程,若需处理目标媒体项,应返回成功结果:func resolveMediaItems(for intent: INPlayMediaIntent, with completion: @escaping ([INPlayMediaMediaItemResolutionResult]) -> Void) { if let mediaSearch = intent.mediaSearch, let identifier = mediaSearch.mediaIdentifier { // 验证identifier对应媒体是否存在后生成媒体项 let mediaItem = INPlayMediaMediaItem(identifier: identifier, title: mediaSearch.mediaTitle, type: .song, artwork: nil) completion([INPlayMediaMediaItemResolutionResult.success(with: mediaItem)]) } else { completion([INPlayMediaMediaItemResolutionResult.needsValue()]) } }测试注意事项:
必须使用真机测试;测试前重启App和Siri避免缓存问题;确保指令中的App名称与App显示名称完全一致,Siri才能准确定位。
内容的提问来源于stack exchange,提问作者Talha

