You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

INPlayMediaIntentHandling异常:Siri媒体意图处理器未触发求助

问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:48:25