iTunes Match+;AVplayer+;MPMediaQuery不工作

iTunes Match+;AVplayer+;MPMediaQuery不工作,itunes,match,avplayer,mpmediaitem,mpmediaitemcollection,Itunes,Match,Avplayer,Mpmediaitem,Mpmediaitemcollection,我正在开发一个应用程序,它使用AVPlayer、MPMediaItem和MPMediaQuery。只要Itunes匹配,它就可以工作。我们从一个MPMediaQuery开始,然后执行一些过滤,留下一些MPMediaItems,然后我们一直使用AVPlayer,因为: 1.-在歌曲播放期间,我们也会播放噪音 2.-我们需要从ipod播放/停止事件 除ipod库启用itunes匹配功能外,所有这些功能目前都正常工作。即使在播放AVPlayer状态时,也不会发出声音。很明显,它不会触发从iCloud下

我正在开发一个应用程序,它使用AVPlayer、MPMediaItem和MPMediaQuery。只要Itunes匹配,它就可以工作。我们从一个MPMediaQuery开始,然后执行一些过滤,留下一些MPMediaItems,然后我们一直使用AVPlayer,因为: 1.-在歌曲播放期间,我们也会播放噪音 2.-我们需要从ipod播放/停止事件

除ipod库启用itunes匹配功能外,所有这些功能目前都正常工作。即使在播放AVPlayer状态时,也不会发出声音。很明显,它不会触发从iCloud下载歌曲

目前我掌握的有关itunes match的所有信息如下:

您可以使用MPMusicLayerController播放调用触发下载。由于上述原因,我们不能利用这个类来控制我们自己的玩家

关于如何解决这个问题,我有两个想法: A.找到一种方法来检查歌曲是否已经下载并可在库中使用AVPlayer播放。如果歌曲不可用,请让用户知道我们不支持歌曲不可用。 B.在歌曲成为下一个播放项目之前,找到一种触发歌曲下载的方法

我仍然找不到如何实现这些解决方案,也没有找到任何相关文档,因此我提交了我的应用程序,其中包含一条警告消息,以防止用户在使用itunes match时使用此应用程序

找到一种方法来检查歌曲是否已经下载并可用 在库中使用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+
}
找到一种方法,在歌曲下载之前触发歌曲下载 成为下一个要播放的项目


您可以尝试使用静音的MPMusicLayerController执行此操作,但无法跟踪歌曲的下载时间,有时需要很长时间。

在iOS 6及更高版本上,您可以使用
[[item valueForProperty:MPMediaItemPropertyIsCloudItem]布尔值]
检查项目是否已下载。

我希望苹果公司尽快发布文档和API标准方法来处理此功能……这并不能区分设备上没有的iTunes Match和设备上的DRMed曲目。两者都有一个无资源URL…没错,但一旦你知道他们有iTunes匹配,你就知道它不是DRMed。我没有办法知道他们有iTunes Match。MPMediaItemPropertyIsCloudItem没有验证它是否已下载。它只是检查它是否是一个iCloud项目。事实上,一旦一个项目被下载,它就是一个本地项目,而不是一个iCloud项目。因此,是的,
[item valueForProperty:MPMediaItemPropertyIsCloudItem]
仅在项目未下载的情况下返回
yes
。呃,您可能希望使用此选项:[[item valueForProperty:MPMediaItemPropertyIsCloudItem]boolValue]否则,我认为[item valueForProperty:MPMediaItemPropertyIsCloudItem]仅返回NSNumber包装的布尔值,在本例中,如果([item valueForProperty:MPMediaItemPropertyIsCloudItem]),即使歌曲在设备上,它也会一直说是:D