Похоже, одной из причин может быть то, что я использую функцию musicPlayerController.prepend()
вместо setQueue()
.К сожалению, я был вынужден использовать prepend()
из-за ограничений музыкального проигрывателя.
Вот краткое описание того, что должно делать мое приложение:
- Пользователь начинает воспроизведение спискапесен.
- Во время воспроизведения приложение выбирает новый список песен из серверной части каждые 5-10 секунд и устанавливает его в качестве новой очереди песен.Это означает, что он довольно динамичен с помощью того, что воспроизводится дальше.
Теперь, когда дело доходит до установки новой очереди во время воспроизведения, setQueue()
действительно плох в этом.Если я просто позвоню setQueue()
, то ничего не произойдет, старая очередь останется.Однако, если я позвоню play()
или prepareToPlay()
после setQueue()
, то текущее воспроизведение будет остановлено, и начнется воспроизведение первой песни из новой очереди.Это не то, что я хочу, мне нужно изменить очередь «за кулисами», чтобы, когда пользователь нажимает «перейти к следующему» на экране блокировки приложения или iOS, воспроизводились новые песни.Вот почему я использовал prepend()
- он работает просто отлично, текущее воспроизведение не прерывается.Альтернатива - вызов perform()
в applicationQueuePlayer завершается с сообщением «это занимает слишком много времени» - удаление старой очереди из 30 песен вручную, пункт за пунктом, я не думаю, что это оптимально.
Так что в настоящее время я вижутолько один вариант - вручную сохранить состояние, которое сообщит, если это первый запуск или нет.Если да, тогда звоните setQueue()
, в противном случае звоните prepend()
.Также нет способа заставить текущую очередь проверить себя, пуста она или нет.
А что касается play()
- получается, что это не такая простая функция, как кажется.Как я уже упоминал выше, play()
запускает воспроизведение новой очереди, если я когда-либо звонил setQueue()
раньше.Это доставляло мне больше проблем, потому что когда я звонил setQueue()
без play()
, он ничего не делал, однако каждый раз, когда я нажимал pause / play - проигрыватель переходил к следующей песне благодаря более раннему «молчанию» setQueue()
.Мне пришлось применить другой обходной путь вызова player.currentPlaybackRate = 1
вместо player.play()
, что выглядит не очень хорошо.Было бы здорово, если бы все это было как-то задокументировано.