MPMusicPlayerController не воспроизводится из Apple Music

Я пытаюсь воспроизвести песни из Apple Music, и это не удается со следующими журналами:

2019-09-26 00:15:57.790999+0200 [1886:463973] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""
2019-09-26 00:15:57.791129+0200 [1886:463973] SSAccountStore: Failed to fetch the backing accounts. error = Error Domain=com.apple.accounts Code=9 "(null)"
2019-09-26 00:15:57.792655+0200 [1886:464074] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""
2019-09-26 00:15:57.792770+0200 [1886:464074] SSAccountStore: Failed to fetch the backing accounts. error = Error Domain=com.apple.accounts Code=9 "(null)"
2019-09-26 00:15:57.794124+0200 [1886:464074] SSAccountStore: Unable to get the local account. error = Error Domain=SSErrorDomain Code=100 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store}
2019-09-26 00:15:59.670842+0200 [1886:463973] [SDKPlayback] -[MPMusicPlayerController prependQueueDescriptor] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1 "No commands provided." UserInfo={NSDebugDescription=No commands provided.}
2019-09-26 00:15:59.671051+0200 [1886:463973] [SDKPlayback] -[MPMusicPlayerController prepareToPlay] completed id=applicationMusicPlayer error: Error Domain=MPMusicPlayerControllerErrorDomain Code=1 "prepareToPlay without a queue" UserInfo={NSDebugDescription=prepareToPlay without a queue}
2019-09-26 00:15:59.681627+0200 [1886:464074] [MediaRemote] MRC <MPCPlayerPath: route=<MPAVEndpointRoute: 0x282930a80 name=iPhone uid=LOCAL> origin=Nastasia's iPhone-1280262988 bundleID=com.apple.MediaPlayer.RemotePlayerService playerID=MPMusicPlayerApplicationController>: Undo optimistic state [failed] command=Play error=Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1)" UserInfo={NSDebugDescription=Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1), MPCPlayerErrorKeyMediaRemoteCommandHandlerStatus=1}
2019-09-26 00:15:59.681787+0200 [1886:464074] [SDKPlayback] -[MPMusicPlayerController play] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 0" UserInfo={NSDebugDescription=Failed to send command 0, NSUnderlyingError=0x281319230 {Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1)" UserInfo={NSDebugDescription=Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1), MPCPlayerErrorKeyMediaRemoteCommandHandlerStatus=1}}}
2019-09-26 00:16:03.596320+0200 [1886:464071] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""
2019-09-26 00:16:03.596374+0200 [1886:464071] SSAccountStore: Failed to fetch the backing accounts. error = Error Domain=com.apple.accounts Code=9 "(null)"
2019-09-26 00:16:03.597965+0200 1886:464051] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""
2019-09-26 00:16:03.598079+0200 [1886:464051] SSAccountStore: Failed to fetch the backing accounts. error = Error Domain=com.apple.accounts Code=9 "(null)"
2019-09-26 00:16:03.599416+0200 [1886:464074] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""
2019-09-26 00:16:03.599456+0200 [1886:464074] SSAccountStore: Failed to fetch the backing accounts. error = Error Domain=com.apple.accounts Code=9 "(null)"
2019-09-26 00:16:03.599542+0200 [1886:464074] SSAccountStore: Unable to get the local account. error = Error Domain=SSErrorDomain Code=100 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store}

Я также попробовал официальный пример проекта кода от Apple под названием Adding-Content-to-Apple-Music и получил аналогичные результаты:


2019-09-25 23:20:37.268162+0200 [1738:432623] [RemoteControl] userIdentityForMediaRemoteOptions -❗️No user identity data. Using active account.
2019-09-25 23:20:37.333703+0200 [1738:432751] [SDKPlayback] -[MPMusicPlayerController prepareToPlayWithCompletionHandler:] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 122" UserInfo={NSDebugDescription=Failed to send command 122, NSUnderlyingError=0x282eacff0 {Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 122 (MRMediaRemoteCommandHandlerStatus = 2)" UserInfo={NSDebugDescription=Failed to send command 122 (MRMediaRemoteCommandHandlerStatus = 2), MPCPlayerErrorKeyMediaRemoteCommandHandlerStatus=2}}}
2019-09-25 23:20:37.333721+0200 [1738:432562] [SDKPlayback] -[MPMusicPlayerController prepareToPlay] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 122" UserInfo={NSDebugDescription=Failed to send command 122, NSUnderlyingError=0x282eacff0 {Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 122 (MRMediaRemoteCommandHandlerStatus = 2)" UserInfo={NSDebugDescription=Failed to send command 122 (MRMediaRemoteCommandHandlerStatus = 2), MPCPlayerErrorKeyMediaRemoteCommandHandlerStatus=2}}}
2019-09-25 23:20:37.337138+0200 [1738:432546] [MediaRemote] MRC <MPCPlayerPath: route=<MPAVEndpointRoute: 0x281498a80 name=iPhone uid=LOCAL> origin=Nastasia's iPhone-1280262988 bundleID=com.apple.MediaPlayer.RemotePlayerService playerID=MPMusicPlayerApplicationController>: Undo optimistic state [failed] command=Play error=Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1)" UserInfo={NSDebugDescription=Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1), MPCPlayerErrorKeyMediaRemoteCommandHandlerStatus=1}
2019-09-25 23:20:37.337529+0200 [1738:432562] [SDKPlayback] -[MPMusicPlayerController play] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 0" UserInfo={NSDebugDescription=Failed to send command 0, NSUnderlyingError=0x282ead260 {Error Domain=MPCPlayerRequestErrorDomain Code=1000 "Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1)" UserInfo={NSDebugDescription=Failed to send command 0 (MRMediaRemoteCommandHandlerStatus = 1), MPCPlayerErrorKeyMediaRemoteCommandHandlerStatus=1}}}
2019-09-25 23:20:37.342424+0200 [1738:432623] [Middleware] INVALIDATE: 0x2813842d0: Invalidated before returning a response. Re-requesting items.
2019-09-25 23:20:38.144321+0200 [1738:432323] [SDKPlayback] Failed validators id=applicationMusicPlayer: {(
    play
)}
2019-09-25 23:20:38.944291+0200 [1738:432323] [SDKPlayback] Failed to get a valid response. Resetting expectations id=applicationMusicPlayer

Иногда проблема решается случайным образом, поигравшись с приложениями, зайдя в приложение Apple Music, воспроизведя что-то там, уничтожив его, вернувшись и так далее...

Если кто-то сталкивался с подобными проблемами, сообщите, пожалуйста, как это исправить.

Это происходит на iOS 12 и 13, iPhone 6s и iPhone 11, учетная запись Apple Music в настоящее время находится в пробной версии на 3 месяца. Присутствуют все музыкальные возможности, можно успешно получить токен разработчика и токен пользователя музыки, оба отлично работают с запросами Apple Music API.


person frangulyan    schedule 25.09.2019    source источник
comment
Одно из сообщений об ошибках содержит prepareToPlay without a queue. Я думаю, что это может быть место для начала   -  person Ashley Mills    schedule 27.09.2019
comment
у меня та же проблема, но без использования вашего подхода prepend. Вы нашли что-нибудь еще актуальное? все нормально для локально загруженных файлов, но не работает для облачных элементов   -  person Martin Mlostek    schedule 19.10.2019
comment
и можете ли вы добавить ссылку на официальный пример, который вы упоминаете. я ничего не могу найти #   -  person Martin Mlostek    schedule 19.10.2019
comment
@MartinMlostek похоже, что они удалили эти примеры кодов, очень странно. Это называется «Взаимодействие с контентом Apple Music». Они даже упоминают об этом на форуме поддержки здесь - forums.developer.apple.com/thread/81352 Во всяком случае, я нашел его в разделе «Ресурсы» этого видео WWDC — developer. apple.com/videos/play/wwdc2017/502/#   -  person frangulyan    schedule 21.10.2019
comment
@frangulyan, ты смог это понять? У меня аналогичная проблема с загрузкой разделов «Для вас» и «Обзор» MPMediaPickerController, где он просто постоянно показывает счетчик и никогда не заполняет содержимое.   -  person Aaltan Ahmad    schedule 04.04.2020


Ответы (1)


Похоже, одной из причин может быть то, что я использую функцию musicPlayerController.prepend() вместо setQueue(). К сожалению, я был вынужден использовать prepend() из-за ограничений музыкального проигрывателя.

Вот краткое описание того, что должно делать мое приложение:

  • Пользователь начинает воспроизведение списка песен.
  • Во время воспроизведения приложение каждые 5-10 секунд получает новый список песен из бэкенда и устанавливает его в качестве новой очереди песен. Это означает, что он довольно динамичен в отношении того, что играет дальше.

Теперь, когда дело доходит до установки новой очереди во время воспроизведения, setQueue() очень плохо с этим справляется. Если я просто позвоню setQueue(), то ничего не произойдет, останется старая очередь. Однако, если я вызову play() или prepareToPlay() после setQueue(), то текущее воспроизведение будет остановлено и начнется воспроизведение первой песни новой очереди. Это не то, что я хочу, мне нужно изменить очередь «за кулисами», чтобы, когда пользователь нажимал «перейти к следующему» в приложении или на экране блокировки iOS, воспроизводились новые песни. Поэтому я использовал prepend() - работает просто отлично, текущее воспроизведение не прерывается. Альтернатива - вызов perform() в applicationQueuePlayer вылетает с сообщением "это занимает слишком много времени" - удаление старой очереди из 30 песен вручную поэлементно, я думаю, не так уж оптимально.

Так что на данный момент я вижу только один вариант - вручную сохранить состояние, которое скажет, первый это запуск или нет. Если да, то звоните setQueue(), иначе звоните prepend(). Также нет способа заставить текущую очередь проверить себя, пуста она или нет.

А по поводу play() - оказывается, это не такая простая функция, как кажется. Как я уже упоминал выше, play() запускает воспроизведение новой очереди, если я когда-либо вызывал setQueue() раньше. Это доставляло мне больше проблем, потому что, когда я звонил setQueue() без play(), он ничего не делал, однако каждый раз, когда я нажимал паузу/воспроизведение - плеер перескакивал на следующую песню благодаря ранее "молчащему" setQueue(). Мне пришлось реализовать другой обходной путь вызова player.currentPlaybackRate = 1 вместо player.play(), что выглядит не очень хорошо. Было бы здорово, если бы все это было как-то задокументировано.

person frangulyan    schedule 28.09.2019