Iphone MPMediaPickerController.showsCloudItems似乎什么都不做
在苹果上发布了这篇文章,但是现在iOS 6 NDA已经发布,希望更多的人能在这里看到它 我试图修改一个应用程序,只允许用户选择本地下载的音乐。我在iOS 6 GM下有以下代码: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
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。