iOS技术问题:首次调用[MPMediaQuery playlistsQuery] collections如何移除Playback History
解决首次授权媒体库后MPMediaQuery返回"Playback History"的问题
这个问题我做音乐类应用时也踩过坑——首次授权媒体库后调用[[MPMediaQuery playlistsQuery] collections],确实会多出来一个"Playback History"条目,重启后就自动消失了。本质是系统首次授权后媒体库的缓存还没完全同步,导致查询返回了这个特殊的系统历史列表。要在首次运行就移除它,有两种稳妥的方案:
方案一:通过系统枚举值提前过滤(推荐)
从iOS 9开始,系统为特殊播放列表提供了MPMediaPlaylistType枚举,其中MPMediaPlaylistTypeHistory正好对应"Playback History"。我们可以给查询添加谓词,提前排除这个类型的播放列表,不用手动遍历:
MPMediaQuery *playlistsQuery = [MPMediaQuery playlistsQuery]; // 添加过滤谓词,排除历史播放列表 MPMediaPropertyPredicate *historyExcludePredicate = [MPMediaPropertyPredicate predicateWithValue:@(MPMediaPlaylistTypeHistory) forProperty:MPMediaPlaylistPropertyPlaylistType comparisonType:MPMediaPredicateComparisonNotEqualTo]; [playlistsQuery addFilterPredicate:historyExcludePredicate]; // 此时获取的collections已经移除了Playback History NSArray *filteredPlaylists = playlistsQuery.collections;
这个方法的优势是不受多语言影响(不用硬编码标题),而且是系统层面的过滤,性能更优。
方案二:遍历集合过滤标题(兼容旧版本)
如果你的应用需要兼容iOS 9以下的系统,可以通过遍历播放列表,排除标题为"Playback History"的条目。注意要处理多语言场景,比如获取本地化的系统字符串:
MPMediaQuery *playlistsQuery = [MPMediaQuery playlistsQuery]; NSArray *originalCollections = playlistsQuery.collections; NSMutableArray *filteredCollections = [NSMutableArray arrayWithCapacity:originalCollections.count]; for (MPMediaPlaylist *playlist in originalCollections) { // 处理多语言:获取系统本地化的"Playback History"字符串 NSString *historyTitle = NSLocalizedString(@"Playback History", @"系统播放历史列表标题"); if (![playlist.name isEqualToString:historyTitle]) { [filteredCollections addObject:playlist]; } } // filteredCollections就是移除了目标条目的结果
这种方式需要注意不同语言环境下的标题翻译,建议用系统本地化字符串而不是硬编码英文。
内容的提问来源于stack exchange,提问作者vasile tancu
相关产品推荐
相关产品推荐

