我正在开发一个使用AVPlayer,MPMediaItem和MPMediaQuery的应用程序。只要Itunes匹配,它就可以工作。我们从MPMediaQuery开始,然后我们执行一些过滤,留下一些MPMediaItems,然后我们一直在使用AVPlayer,因为: 1.-我们在歌曲播放期间也会发出噪音 2.-我们需要承诺播放/停止来自ipod的活动。
所有这些功能目前都在使用,除非ipod库启用了itunes匹配。即使正在播放AVPlayer状态,也不会发出声音。显而易见的是它没有触发从iCloud下载的歌曲。
关于itunes匹配的所有信息暂时都是这篇帖子: MPMediaItem and iTunes Match
表示您可以使用MPMusicPlayerController播放调用触发下载。由于上面给出的原因,我们不能利用这个类来控制我们自己的玩家。
我有两个关于如何解决这个问题的想法: A.找一种方法来检查一首歌是否已经下载并在库中可用以使用AVPlayer播放。如果歌曲不可用,请让用户知道我们不支持不可用的歌曲。 B.找到一种方法,在它成为下一个要播放的项目之前触发下载。
我仍然无法找到如何实施任何这些解决方案而且我没有找到任何相关文档,因此我提交了一个警告消息,以防止用户使用此应用程序,如果他们使用的是iTunes匹配。
答案 0 :(得分:3)
在iOS 6及更高版本中,您可以使用[[item valueForProperty:MPMediaItemPropertyIsCloudItem] boolValue]
检查项目是否已下载。
答案 1 :(得分:2)
一个。找到一种方法来检查歌曲是否已下载并可用 在库中使用AVPlayer播放。如果歌曲不可用 让用户知道我们不支持不可用的歌曲。
这并不完美,但在大多数情况下都适用。从iTunes Match下载的歌曲将不受DRM影响。因此,您可以检查资产DRM标记,如果它不可导出则需要下载。音频书籍/播客可能会误报,但你绝对安全。
MPMediaItem* item
NSURL* url = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVURLAsset* assetToLoad = [[AVURLAsset alloc] initWithURL:url options:nil];
bool protectedCon = assetToLoad.hasProtectedContent;
bool exportable = true;
if (gApp.mSysVersionInt >= 5) {
exportable = assetToLoad.exportable; //4.3+
}
B中。找到一种方法来触发它之前的歌曲下载 成为下一个玩的项目。
你可以尝试这样做一个静音的MPMusicPlayerController,但没有办法跟踪歌曲下载的时间,有时需要很长时间。