Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios MPMediaPickerController didPickMediaItems返回MPModelObjectMediaItem_Ios_Iphone_Mpmediaitem_Mpmediapickercontroller_Mpmediaplayercontroller - Fatal编程技术网

Ios MPMediaPickerController didPickMediaItems返回MPModelObjectMediaItem

Ios MPMediaPickerController didPickMediaItems返回MPModelObjectMediaItem,ios,iphone,mpmediaitem,mpmediapickercontroller,mpmediaplayercontroller,Ios,Iphone,Mpmediaitem,Mpmediapickercontroller,Mpmediaplayercontroller,我有一个非常奇怪的问题。我正在使用iOS13MPMediaPickerController从用户的苹果音乐库中获取一些歌曲,以便通过[MPMusicPlayerController applicationMusicPlayer]播放 现在,我将一些播放列表中的未下载歌曲添加到我的音乐库中,并使用委派功能 - (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollecti

我有一个非常奇怪的问题。我正在使用iOS13
MPMediaPickerController
从用户的苹果音乐库中获取一些歌曲,以便通过
[MPMusicPlayerController applicationMusicPlayer]
播放

现在,我将一些播放列表中的未下载歌曲添加到我的音乐库中,并使用委派功能

- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
回报

mediaItemCollection.items.firstObject
播放器无法播放的类型为
MPModelObjectMediaItem
的对象。(我也不能强制转换到该类型,因为它是未知的。此外,没有关于该类型的文档。它似乎是mediaplayer框架内的私有类。)

我希望所有下载的内容(以及不在播放列表中的所有其他云项目)都会收到类型为
MPMediaItem

选择器的配置如下所示

musicPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
musicPicker.showsCloudItems               = true;
musicPicker.showsItemsWithProtectedAssets = true;
musicPicker.delegate                      = self;
musicPicker.allowsPickingMultipleItems    = false;

有什么提示吗?

好吧,如果您没有将加载到自己的应用程序中的项目添加到音乐库中,它们似乎无法正确加载。(13.3)

我正在使用此解决方法:

- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
    assert(mediaItemCollection.count == 1);
    // this check is done because it seems that in the following scenario you dont get a
    // MPConcreteMediaItem which can be played. Instead you get a MPModelObjectMediaItem
    // this happens when an item was selected that is inside a playlist, but does not belong
    // to your library (nor is it downloaded to your device)
    if(mediaItemCollection.items.firstObject.persistentID <= 0)
    {
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Song Not Added")
                                                                message:@"This song must be added to your Apple Music library. Please add the song to your library from the Music App."
                                                                preferredStyle:UIAlertControllerStyleAlert];
        [alertController addAction:[UIAlertAction actionWithTitle:@"Dismiss"
                                                  style:UIAlertActionStyleDefault
                                                  handler:nil]];
        [alertController addAction:[UIAlertAction actionWithTitle:@"Open Music App"
                                                  style:UIAlertActionStyleCancel
                                                  handler:^(UIAlertAction *alertAction)
                                                  {
                                                      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"music://"]
                                                                      options:nil
                                                                      completionHandler:nil];
                                                  }]];
        [self presentViewController:alertController animated:true completion:nil];
        return;
    }
    // good to go? then load it
    [musicPlayer setQueueWithItemCollection:mediaItemCollection];
    ...
}
-(void)mediaPicker:(MPMediaPickerController*)mediaPicker didPickMediaItems:(MPMediaItemCollection*)mediaItemCollection
{
断言(mediaItemCollection.count==1);
//完成此检查是因为在以下场景中,您似乎没有得到
//可以播放的MPModelObjectMediaItem。取而代之的是MPModelObjectMediaItem
//当选择的项目位于播放列表中但不属于该项目时,会发生这种情况
//到您的库(也不会下载到您的设备)

在这两种情况下,如果使用
isKindOfClass
检查
MPMediaItem
时返回(mediaItemCollection.items.firstObject.persistentID