MPMediaItemPropertyAssetURL仅为iPhone 5s返回null

时间:2014-01-17 20:16:06

标签: ios iphone objective-c xcode5

我一直在使用以下代码从MPMediaItemPickerController返回的MPMediaItem对象中提取资产网址,以便我可以将用户iPhone itunes音乐库中的音乐文件复制到文档文件夹进行处理,但是在iPhone 5s上我总是从MPMediaItemPropertyAssetURL获取一个空值,但是当我在iPhone 4或iPhone 5上运行相同的代码时,它应该可以返回一个正确的URL。

- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {

    [self dismissViewControllerAnimated:YES completion:nil];

        if(mediaItemCollection){
           MPMediaItem *mediaItem = (MPMediaItem *)[mediaItemCollection.items objectAtIndex: 0];
           NSString *songTitle = [mediaItem valueForProperty: MPMediaItemPropertyTitle];
           NSLog(@"songtitle: %@", songTitle);
           NSURL *assetURL = [mediaItem valueForProperty: MPMediaItemPropertyAssetURL];
           NSLog(@"%@", assetURL);
        }

}

我尝试从有效的架构中删除arm64,并且只为armv7和armv7s构建,但这并没有解决这个问题。

有谁知道为什么会发生这种情况以及如何解决这个问题,或者我是否可以使用解决方法?我需要能够将音乐从iPhone的音乐库复制到文档文件夹,以便我可以正确处理dj应用程序的音乐。

由于

3 个答案:

答案 0 :(得分:24)

我发现问题是我试图获取MPMediaItemPropertyAssetURL属性的歌曲实际上不在我的设备上。它被列在媒体库中,但实际上仍然在iCloud中。一旦我将歌曲下载到我的设备,问题就解决了。尽管我不喜欢回答我自己的问题,但我还是接受了Jeroen的建议,以便能够帮助他人。

答案 1 :(得分:1)

我们可以使用

添加不显示iCloud项目的过滤器
[mediaPicker setShowsCloudItems:NO];

答案 2 :(得分:0)

这不仅仅与iPhone5s有关,现在它在所有iPhone设备上都发生了。我对此事进行了研究。

MPMediaItemPropertyAssetURL / MPMediaItem assetURL为null / nil有两个原因。

  1. 音乐未下载到您的设备,但已添加到音乐中 仅库。
  2. 音乐已加载,但受DRM保护。

受DRM保护的资产无法使用AVPlayer播放,它只能使用MPMusicPlayer播放。因此,在继续使用AVPlayer之前,您必须检查两件事。

  1. MPMediaItemPropertyAssetURL为零吗?
  2. MPMediaItem是否受保护?

请参见下面的代码...。

    MPMediaItem *theChosenSong = [[mediaItemCollection items] firstObject];
    NSURL *assetURL = [theChosenSong valueForProperty:MPMediaItemPropertyAssetURL];

        if(assetURL) {
            BOOL bIsProtected = theChosenSong.protectedAsset;
            if(!bIsProtected) {
                // Do whatever you want to do
                NSLog(@"Its not protected");
           }
            else {
                NSLog(@"Its DRM protected");
            }
        }
        else {
                NSLog(@"Its DRM protected");
        }