MPMusicPlayerControllerMutableQueue вставляет песню Apple Music, которая не работает

Итак, я уже несколько дней пытаюсь использовать API MusicKit. Я пытался использовать MPMusicPlayerApplicationController и MutableQueue.

У меня очередь уже инициализирована с использованием setQueue(with: [String]) с массивом идентификаторов магазинов для песен Apple Music. Затем я хочу разрешить пользователю переупорядочивать песни в очереди. Я использую следующий код, чтобы попытаться это сделать.

let musicPlayerController = MPMusicPlayerController.applicationQueuePlayer

musicPlayerController.perform(queueTransaction: { queue in 

  let afterItem = queue.items.first(where: { $0.playbackStoreID == predecessorId })
  let descriptor = MPMusicPlayerStoreQueueDescriptor(storeIDs: [newItemId])
  queue.insert(descriptor, after: afterItem)

}) { (queue, error) in

  // Completion for when items' position update
  if error != nil {
    print(error!)
  }
}

Приведенный выше код работает, как и ожидалось, если afterItem равно нулю (т. е. песня правильно вставлена ​​в начало очереди). Однако, если afterItem не равно нулю, ничего не происходит. Очередь остается такой же, как если бы вставки не было, и в обработчике завершения не было ошибки. Эта проблема возникает независимо от того, находится ли вставляемая песня уже в очереди или нет.

Я пытаюсь изменить очередь неправильно?


person Nick    schedule 29.05.2018    source источник
comment
Итак, если вы зарегистрируете queue до и после, он останется прежним? Мне просто любопытно, откуда мы знаем, что ничего не происходит. Я не сомневаюсь в тебе (весь этот API ужасно глючит), просто любопытно.   -  person matt    schedule 30.05.2018
comment
@matt да, при регистрации очереди все то же самое   -  person Nick    schedule 30.05.2018
comment
@matt Я только что проверил еще раз, чтобы убедиться. Все элементы мультимедиа одинаковы до и после, и порядок одинаков. Некоторые элементы мультимедиа в очереди после являются другими объектами, чем очередь до, но они имеют то же содержимое (storeId, исполнитель, название и т. д.). Очереди также являются разными объектами.   -  person Nick    schedule 30.05.2018
comment
Да, я могу это подтвердить. Это явный баг. Не только Apple Music; это queue.insert независимо от того, какие песни. Пожалуйста, отправьте отчет об ошибке по этому поводу.   -  person matt    schedule 06.08.2018
comment
Еще одна ошибка заключается в том, что даже если insert равно nil, queue в обработчике завершения не отражает изменения в очереди.   -  person matt    schedule 06.08.2018
comment
Вы можете сообщить, была ли эта ошибка зарегистрирована и/или исправлена? Спасибо!   -  person Dylan Reich    schedule 04.03.2019
comment
@matt Вы нашли какое-нибудь решение?, все еще сталкиваюсь с той же ошибкой, обработчик завершения не вызывается для выполнения (queueTransaction)   -  person Shilpriya    schedule 28.12.2020
comment
Есть обновления по этому вопросу?   -  person Arnaldo Capo    schedule 09.02.2021


Ответы (1)


Хорошо, я нашел решение.

Если вы хотите, чтобы очередь была видоизменена.

Вам нужно вернуть запрос

let musicPlayerController = MPMusicPlayerController.applicationQueuePlayer

musicPlayerController.perform(queueTransaction: { queue in 

  let afterItem = queue.items.first(where: { $0.playbackStoreID == predecessorId })
  let descriptor = MPMusicPlayerStoreQueueDescriptor(storeIDs: [newItemId])

  //return the modification here.
  return queue.insert(descriptor, after: afterItem)

}) { (queue, error) in

  // Completion for when items' position update
  if error != nil {
    print(error!)
  }
}
person Arnaldo Capo    schedule 09.02.2021