MPMediaPickerController.showsCloudItems似乎什么都不做

在Apple上发布这个没有运气,但现在iOS 6 NDA已经上传,希望更多的目光能够在这里看到它。

我正在尝试修改应用程序以仅允许用户选择已在本地下载的音乐。 我在iOS 6 GM下面有以下代码:

MPMediaPickerController* mpc = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAnyAudio]; mpc.allowsPickingMultipleItems = YES; mpc.modalPresentationStyle = UIModalPresentationCurrentContext; mpc.showsCloudItems = NO; [self presentViewController:mpc animated:YES completion:nil]; 

从文档:

媒体项目选择器的默认行为是YES,这意味着选择器显示可用的iCloud项目。 如果媒体项目可通过iTunes Match获得并且尚未存储在设备上,则该媒体项目被视为iCloud项目。

我认为这意味着如果启用了iTunes Match,则只有已下载到设备的项目才会显示在选择器中,但我总是会看到整个iTunes Match库。 我为此提出了一个雷达,因为它似乎是一个严重的错误。 如果有人能告诉我,我很想知道我在这里缺少什么。

这似乎是一个操作系统问题。

使用picker.showsCloudItems = NO; 正确显示较少的歌曲,而不是整个列表…其中列出的歌曲是在音乐应用程序中手动下载的歌曲或流式播放并因此缓存的歌曲。

至少在我的情况下,问题在于处理缓存的问题。

如果我选择手动下载的歌曲,则MPMediaItemPropertyIsCloudItem值为NO ,这是正确的。 我还可以通过MPMediaItemPropertyAssetURL属性访问资产的URL。

另一方面,选择一个缓存的歌曲在MPMediaItemPropertyIsCloudItem上返回YESMPMediaItemPropertyIsCloudItem上返回nil ,使得这首歌对我来说几乎无用。

对不起,我没有真正的答案,但我没有足够的声誉来简单评论。

希望我的2美分能以某种方式提供帮助,但在我看来,这个问题只能由Apple在未来的更新中解决。

测试项目是否来自didPickMediaItems委托中的iCloud的更好解决方案:

  MPMediaItem *selectedItem = [selectedItems objectAtIndex:0]; if (![[selectedItem valueForProperty:MPMediaItemPropertyIsCloudItem] boolValue]) 

您实际上不需要播放它,在MPMediaItem中使用嵌入属性更有效。

我有同样的问题。 虽然我无法隐藏这些项目,但这是一个很好的解决方法,我用它来阻止人们选择它们。 在didPickMediaItems ,您应该暂时将其加载到AVPlayerItem ,然后只检查该项的有效性,如下所示:

 - (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection { MPMediaItem *selectedItem = [[mediaItemCollection items]objectAtIndex:0]; NSURL *tempURL = [selectedItem valueForProperty:MPMediaItemPropertyAssetURL]; AVPlayerItem *playerItem = [[AVPlayerItem alloc]initWithURL:tempURL]; if(playerItem.loadedTimeRanges==NULL) { UIAlertView *alert=[[[UIAlertView alloc]initWithTitle:NSLocalizedString(@"Invalid Song Choice",NULL) message:NSLocalizedString(@"Please choose a song that is local to your phone.",NULL) delegate:self cancelButtonTitle:NSLocalizedString(@"Okay",NULL) otherButtonTitles:nil]autorelease]; [alert show]; [playerItem release]; } else { NSLog(@"Your good to go...do whatever you want with the local song"); } } 

它似乎在iOS 7中得到修复。

以下代码有效; iCloud项目未显示:

  MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic]; picker.delegate = self; picker.allowsPickingMultipleItems = NO; picker.showsCloudItems = NO;