16

在 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 库。我为此提交了一个雷达,因为它似乎是一个严重的错误。如果有人可以告诉我,我很想知道我在这里缺少什么。

4

4 回答 4

11

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

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

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

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

另一方面,选择一首被缓存的歌曲会不断返回,YES这让这首歌对我来说几乎毫无用处。MPMediaItemPropertyIsCloudItemnilMPMediaItemPropertyAssetURL

抱歉,我没有实际的答案,但我没有足够的声誉来简单地发表评论。

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

于 2014-04-07T18:24:40.113 回答
4

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

     MPMediaItem *selectedItem = [selectedItems objectAtIndex:0];

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

你真的不需要播放它,使用 MPMediaItem 中的嵌入属性更有效。

于 2013-04-24T14:10:46.263 回答
2

I had this same problem. Although I was unable to hide the items, here's a good workaround that I used to prevent people from being able to select them. Inside didPickMediaItems, you should temporarily load it into an AVPlayerItem and then just check the validity of that item like so:

- (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");
   }
}
于 2013-04-16T00:24:11.957 回答
-1

它似乎已在 iOS 7 中修复。

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

 MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic];
 picker.delegate = self;
 picker.allowsPickingMultipleItems   = NO;
 picker.showsCloudItems = NO;
于 2013-12-16T21:18:08.790 回答