SiriKit中含‘video’的播放列表词汇无法被INPlayMediaIntent识别
解决SiriKit中含“video”词汇的播放列表名称无法正确识别的问题
问题场景
配置SiriKit时整体流程正常,但遇到以下识别异常:
- 使用含“video”的播放列表名称(如
trending video),测试指令Play trending video in the {App}时,IntentHandler中的mediaSearch对象为nil - 换成“videos”形式(如
trending videos),虽能拿到mediaSearch,但mediaType为0(非预期的.playlist类型) - 非视频类词汇(如
shardy jeans)能正常识别,返回的mediaSearch对象中mediaType为5(对应.playlist)
原注册代码
let playlistTitles = [ "trending video" ] let vocabulary = INVocabulary.shared() let playlistTitleSet = NSOrderedSet(array: playlistTitles) vocabulary.setVocabularyStrings(playlistTitleSet, of: .mediaPlaylistTitle)
问题原因
Siri内置语义会优先将“video”“videos”这类词汇解析为媒体类型(视频),而非播放列表名称的一部分,导致自定义词汇的语义被覆盖,出现解析异常。
解决方案
1. 手动修正媒体类型解析
在处理INPlayMediaIntent时,结合自定义词汇列表手动匹配并修正mediaType:
func handle(intent: INPlayMediaIntent, completion: @escaping (INPlayMediaIntentResponse) -> Void) { let customPlaylists = ["trending video", "trending videos"] var response: INPlayMediaIntentResponse if let mediaName = intent.mediaSearch?.mediaName?.lowercased(), customPlaylists.contains(mediaName) { // 构造正确的INMediaSearch,指定mediaType为.playlist let correctedSearch = INMediaSearch( mediaName: mediaName, mediaType: .playlist, sortOrder: .unknown, albumName: nil, artistName: nil, genreNames: nil, moodNames: nil, releaseDate: nil, mediaIdentifier: nil ) let playbackQueue = INPlaybackQueue(mediaSearch: correctedSearch, identifier: "trending-video-playlist") response = INPlayMediaIntentResponse(code: .success, userActivity: nil) response.playbackQueue = playbackQueue } else { // 处理常规识别逻辑 response = INPlayMediaIntentResponse(code: .success, userActivity: nil) // 原有业务逻辑... } completion(response) }
2. 调整自定义词汇表述
避免直接使用Siri有内置语义的词汇,给播放列表名称添加独特标识,比如:
let playlistTitles = [ "Trending Video Playlist", "My Trending Videos Collection" ]
这类表述能降低Siri误解析的概率,更易被识别为自定义播放列表。
3. 确保词汇生效
- 词汇注册代码务必在
application(_:didFinishLaunchingWithOptions:)中执行 - 重启App后,建议重置Siri数据(设置 -> Siri与搜索 -> 关闭Siri再重新开启,或重启设备),确保新词汇被Siri索引
内容的提问来源于stack exchange,提问作者Andrew Stamm
相关产品推荐
相关产品推荐

