iPhone 歌曲库查询,已知持久标识符返回 nil

Posted

技术标签:

【中文标题】iPhone 歌曲库查询,已知持久标识符返回 nil【英文标题】:iPhone song library query with known persistentIdentifier returning nil 【发布时间】:2013-05-05 19:11:36 【问题描述】:

我正在尝试播放从存储的持久标识符引用的歌曲,但如果我使用存储的值对其应用过滤器,MPMediaQuery 将返回 0 结果。

我的无效过滤版本代码:

NSNumber *persistentId = [NSNumber numberWithLongLong:15991677378153886747];
MPMediaPredicate *filter = [MPMediaPropertyPredicate predicateWithValue:persistentId forProperty:MPMediaItemPropertyPersistentID];
MPMediaQuery *songQuery = [[MPMediaQuery alloc] initWithFilterPredicates:[NSSet setWithObject:filter]];
NSArray *songs = [songQuery items]; // [songs count] is zero here

尽管songs 包含应该通过此过滤器的 MPMediaItem,但我却得到零个项目返回。看看这个(做得不好):

MPMediaQuery *songQuery = [[MPMediaQuery alloc] init];
NSArray *songs = [songQuery items];

 // gives <MPConcreteMediaItem: 0x1dd4d3c0> 15991677378153886747
NSLog(@"%@", [songs objectAtIndex:5]); 

 // gives 15991677378153886747
NSLog(@"%@", persistentId);

我做错了什么?我已经阅读了文档/示例项目,看起来就是这样。

【问题讨论】:

【参考方案1】:

初始化 unsigned long long 常量可能是个问题。尝试为号码添加ULL 后缀:

15991677378153886747ULL

然后将其包装成 NSNumber 文字:

NSNumber *persistentId = @15991677378153886747ULL;
// Identical to: [NSNumber numberWithUnsignedLongLong:15991677378153886747ULL]

【讨论】:

【参考方案2】:

我不认为它是零项,而是说它有一个具体的媒体项:

// gives <MPConcreteMediaItem: 0x1dd4d3c0> 15991677378153886747

尝试添加这个,看看是否有任何标题弹出:

NSLog(@"%@", [songs valueForKeyPath:@"title"]);

【讨论】:

我认为您正在查看我的代码的“这种方式有效”部分......这是(1)获取音乐库中所有歌曲列表的“坏”方式,并且(2) 在测试环境中读取已知索引进行调试:)

以上是关于iPhone 歌曲库查询,已知持久标识符返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

使用Swift 2编程从持久ID中查找歌曲

Iphone:在播放一首歌曲时,另一首歌曲重叠。

如何将音频歌曲放入 iPhone 中的 NSdata

如何使用 AVAssetExportSession 覆盖 iPhone/iPod 库中的歌曲?

如何从 ipod 库歌曲中获取歌曲的歌词

将多首歌曲存储在 mpplayer 中,这些歌曲正在从具有歌曲持久 ID 的数据库中获取