MPMediaPickerController.showsCloudItems似乎什么都不做

时间:2012-09-19 20:59:45

标签: iphone ios itunes mpmediapickercontroller

在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项目。媒体项目被视为   iCloud项目,如果可以通过iTunes Match获得,但尚未提供   存储在设备上。

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

4 个答案:

答案 0 :(得分:9)

这似乎是操作系统问题。

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

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

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

另一方面,选择已缓存的歌曲会在YESMPMediaItemPropertyIsCloudItemnil上的MPMediaItemPropertyAssetURL返回,这使得这首歌对我来说几乎无用。

抱歉,我没有真正的答案,但我没有足够的声誉来发表评论。

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

答案 1 :(得分:4)

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

     MPMediaItem *selectedItem = [selectedItems objectAtIndex:0];

     if (![[selectedItem valueForProperty:MPMediaItemPropertyIsCloudItem] boolValue])

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

答案 2 :(得分:1)

我有同样的问题。虽然我无法隐藏这些项目,但这是一个很好的解决方法,我用它来阻止人们选择它们。在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");
   }
}

答案 3 :(得分:-1)

似乎已在iOS 7中修复。

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

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