Iphone MPMediaPickerController.showsCloudItems似乎什么都不做

Iphone MPMediaPickerController.showsCloudItems似乎什么都不做,iphone,ios,itunes,mpmediapickercontroller,Iphone,Ios,Itunes,Mpmediapickercontroller,在苹果上发布了这篇文章,但是现在iOS 6 NDA已经发布,希望更多的人能在这里看到它 我试图修改一个应用程序,只允许用户选择本地下载的音乐。我在iOS 6 GM下有以下代码: MPMediaPickerController* mpc = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAnyAudio]; mpc.allowsPickingMultipleItems = YES; mpc.modalPresen

在苹果上发布了这篇文章,但是现在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];
从文件中:

媒体项选取器的默认行为为“是”,这意味着 选择器显示可用的iCloud项。媒体项被视为 iCloud项目(如果通过iTunes Match提供,但尚未提供) 存储在设备上


我认为这意味着,如果iTunes Match启用,只有下载到设备上的项目才会显示在选择器中,但我始终可以看到整个iTunes Match库。我为此申请了雷达,因为它看起来像一个严重的错误。如果有人能告诉我其他情况,我很想知道我在这里遗漏了什么。

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

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

     MPMediaItem *selectedItem = [selectedItems objectAtIndex:0];

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

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

它在iOS 7中似乎是固定的

以下代码起作用;iCloud项目未显示:

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

这似乎是操作系统的问题

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

至少在我的例子中,问题在于如何处理缓存的数据

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

另一方面,选择缓存的歌曲在MPMediaItemPropertyIcloudItem上返回YES,在MPMediaItemPropertyAsetUrl上返回nil,这使得歌曲对我来说几乎毫无用处

对不起,我没有一个实际的答案,但我没有足够的声誉来简单的评论


希望我的2美分能有所帮助,但在我看来,这个问题只能由苹果在未来的更新中解决。

雷达号是多少?我会复制它。它仍然在6.0.1上被破坏。仍然在2013年3月6日被破坏。我自己也在和这个战斗。很高兴看到我不是一个人。仍然在6.1.2上崩溃。但是当它是一个iCloud/iTunes匹配项时,MPMediaItem的属性MPMediaItemPropertyAsetUrl应该返回零。我也提交了一个bug 14022908。自从iOS7以来有没有对此进行过修复?我一直在使用下面的答案所建议的方法,但这并不是理想的解决方案。请注意:这似乎只在您的部署目标是≥ 7.0.它似乎对我的部署目标6起作用。谢谢可可迷们。。有人能说贵吗?谢谢!请指出这一点。您可以直接检查tempurl是否为nill。