2016-04-27 2 views
5

Я пытаюсь использовать новые API Apple Music от 9.3, чтобы добавить песню в список воспроизведения, созданный моим приложением, без добавления его в библиотеку пользователя.Ошибка при использовании - [MPMediaPlaylist addItemWithProductID: completeHandler:]

Рассмотрите продукт ID 316654632, это песня Lisztomania от Phoenix, в магазине iTunes в США.

Используя следующий код, я могу играть песню

MPMusicPlayerController *musicPlayer = [MPMusicPlayerController systemMusicPlayer]; 
[musicPlayer setQueueWithStoreIDs:@[@"316654632"]]; 
[musicPlayer play]; 

Используя следующий код, я могу добавить песню в библиотеку Apple Music

[[MPMediaLibrary defaultMediaLibrary] addItemWithProductID:@"316654632" completionHandler:^(NSArray<__kindof MPMediaEntity *> * _Nonnull entities, NSError * _Nullable error) { 
    NSLog(@"%@", error); 
}]; 

Ошибка равна нулю, и я могу см. песню в моей библиотеке.

Но попытка же с плейлистом не работает.

[[MPMediaLibrary defaultMediaLibrary] getPlaylistWithUUID:uuid creationMetadata:[[MPMediaPlaylistCreationMetadata alloc] initWithName:@"Test Playlist"] completionHandler:^(MPMediaPlaylist * _Nullable playlist, NSError * _Nullable error) { 
    NSLog(@"%@", error); 

    if (!error) { 
     [playlist addItemWithProductID:@"316654632" completionHandler:^(NSError * _Nullable error) { 
      NSLog(@"%@", error); 
     }]; 
    } 
}]; 

плейлист создается, я могу видеть его в Music.app, но когда я пытаюсь добавить один и тот же идентификатор продукта я играл & добавлен в библиотеку в список воспроизведения, я получаю сообщение об ошибке

Error Domain=MPErrorDomain Code=4 "The requested id could not be found" UserInfo={NSLocalizedDescription=The requested id could not be found}

Но как его не найти, если я успешно добавил один и тот же элемент в свою библиотеку?

ОБНОВЛЕНИЕ

Хорошие новости! Apple установила rdar: // 26408683 на 10.2.1!

+0

Любая удача в поиске решения? – TWilly

+0

@TWilly nope :(Я даже разместил его на форумах Apple dev и не отвечал. – Jota

+0

У меня тоже была эта проблема - используется [MPMediaPlaylist addMediaItems: completionHandler:] как обходной путь. – Dan

ответ

4

В моем приложении для преобразования плейлиста (mixlib) единственное решение, которое я нашел, чтобы надежно добавить несколько дорожек в только что созданный список воспроизведения, - это wait.

В моих тестах ожидающих пять секунд кажется достаточно.

[[MPMediaLibrary defaultMediaLibrary] getPlaylistWithUUID:uuid creationMetadata:[[MPMediaPlaylistCreationMetadata alloc] initWithName:@"Test Playlist"] completionHandler:^(MPMediaPlaylist * _Nullable playlist, NSError * _Nullable error) { 
if (!error) { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 /*seconds*/ * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)), ^() { 
     [playlist addItemWithProductID:@"316654632" completionHandler:^(NSError * _Nullable error) { 
      NSLog(@"%@", error); 
    }]; 
} 
}]; 

Я подозреваю, что это проблема, связанная сервер/сеть, потому что иногда работает без ожидания. «Запрошенный идентификатор», который не найден, может быть идентификатором списка воспроизведения, а не идентификатором дорожки.

Когда он начинает работать с плейлистом, он всегда будет работать. Поэтому вам не нужно ждать, прежде чем добавлять каждый дополнительный трек, но только перед добавлением первого.

+0

Эй, что мы должны ввести в параметр uuid? понятия не имею. –

+1

Объект NSUUID. Вы можете создать его с помощью [NSUUID UUID]. Сохраните его, если вам нужно позже получить список воспроизведения. – FKDev

Смежные вопросы