MPMediaPickerController didPickMediaItems возвращает MPModelObjectMediaItem - PullRequest
0 голосов
/ 24 января 2020

У меня супер странная проблема. Я использую iOS13 MPMediaPickerController, чтобы получить несколько песен из пользовательской библиотеки apple musi c, чтобы воспроизвести ее через [MPMusicPlayerController applicationMusicPlayer].

Теперь с некоторыми не загруженными песнями из некоторых плейлистов, которые у меня есть В мою библиотеку добавлена ​​функция делегата

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

, которая возвращает

mediaItemCollection.items.firstObject

объект типа MPModelObjectMediaItem, который не может быть воспроизведен игроком. (Я также не могу привести к этому типу, потому что он неизвестен. Также нет документации для этого типа. Кажется, что это закрытый класс внутри среды медиаплеера.)

Я ожидаю тип MPConcreteMediaItem который поступает для всех загруженных (и всех других облачных элементов, которых нет в плейлистах)

Средство выбора настроено следующим образом

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

Любые советы, что там происходит?

1 Ответ

0 голосов
/ 25 января 2020

Что ж, кажется, что элементы, которые вы загружаете в собственное приложение, не могут быть загружены должным образом, если вы не добавили их в свою библиотеку musi c. (iOS13.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];
    ...
}
...