Исправлена ​​ошибка «Не готово свойство« контейнер »с нулевым значением» из musickit.js при запуске приложения Angular на сервере - PullRequest
0 голосов
/ 18 февраля 2019

Я пишу приложение, которое использует Angular и MusicKit, чтобы позволить пользователям одновременно слушать одну и ту же музыку.Я сталкиваюсь со следующей ошибкой при попытке запустить приложение (с помощью ng serve --host xxxx) против чего-либо, кроме локального хоста по умолчанию (с использованием ng serve):

core.js:14597 ERROR TypeError: Cannot read property 'container' of null  
    at Player. (musickit.js:formatted:6614)  
    at musickit.js:formatted:726  
    at Object.next (musickit.js:formatted:739)  
    at fulfilled (musickit.js:formatted:627)  
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:388)  
    at Object.onInvoke (core.js:16156)  
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:387)  
    at Zone.push../node_modules/zone.js/dist/zone.js.Zone.run (zone.js:138)  
    at zone.js:872  
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:421)  



21:08:38.100 core.js:14597 ERROR Error: Uncaught (in promise): 
TypeError: Cannot read property 'isFairplay' of undefined  
TypeError: Cannot read property 'isFairplay' of undefined  
    at MediaExtension.get [as isFairplay] (musickit.js:formatted:5020)  
    at musickit.js:formatted:6728  
    at Array.filter ()  
    at Player._playbackDataForItem (musickit.js:formatted:6726)  
    at Player. (musickit.js:formatted:6504)  
    at musickit.js:formatted:726  

Я думаю, что isFairplay«ошибка - результат того, что вызывает первое, но я включил это, чтобы быть безопасным.Я использую сервер nginx на digitalocean (сборка ng, переместите папку dist в / var / www / html), но локально я просто использую «ng serve --host xxxx для запуска с моим локальным IP.Я просто попробовал с другими учетными записями Apple Music на тот случай, если Apple запуталась в том, какое приложение на самом деле делает запрос, и я пробовал в разных браузерах / окнах инкогнито в Chrome.

Я пытаюсь сделать следующее: 1. Показать пользователю список песен из своей библиотеки 2. Разрешить пользователю выбрать песню 3. Подпишитесь на следующие шаги в наблюдаемой: 4. Когда песня выбрана, очередьпесня с musicKit.queueSong 5. Когда песня ставится в очередь, используйте musicKit.player.play () для воспроизведения текущей песни в очереди

Следующие ошибки возникают после шага 5. Я уже добавляю container.id впесня, поэтому я считаю, что по какой-то причине Apple на самом деле не ставит в очередь песню, я просто не знаю, что с ней происходит потом.ueueSong успешно возвращается, поэтому я думаю, что container.id - это не единственное, что может быть неопределенным или неопределенным, это всего лишь первое, на что он жалуется.

Код, описывающий, что происходит на вышеуказанных этапах.«playSong (..)» подписан в другом классе:

playSong(songs: any[], index: number): Observable {  
    if(songs) {  
      //songs play without the forEach, but musicKit still complains 
      //about not finding container.id in the song object  
      songs.forEach(song => song['container'] = { 'id' : song.id });  


      return from(this.musicKitService.setQueue({ 'items': songs, startPosition: index}))  
        .pipe(mergeMap(x => this.play()));  
    }  
  }  

  modifyPlayback(arg: Observable): Observable {  
    return arg.pipe(map(x => this.setTitle()));  
  }  


  play(): Observable {  
    return this.modifyPlayback(from(this.player.play()));  
  }      

После этого момента я ожидаю, что песня начнет воспроизводиться в браузере.По сути, я ставлю в очередь одну песню, а затем говорю musicKit.js, чтобы проиграть песню в очереди.Однако, когда msuicKit.js идет, чтобы воспроизвести песню в очереди, там нет песни для воспроизведения.Я не уверен, что на самом деле происходит с песней после ее успешной постановки в очередь, когда я бегу за пределами localhost.

Я также опубликовал это на форумах разработчиков Apple, где я включил кого-то с проблемой прошлого года, но она так и не была решена.https://forums.developer.apple.com/message/350355#350355

Я также забыл упомянуть в оригинальном сообщении: это происходит ТОЛЬКО в Chrome.Код отлично работает в Firefox и в мобильном сафари.

1 Ответ

0 голосов
/ 20 февраля 2019

Решение:

По крайней мере, в chrome musicKit.js требует, чтобы размещаемый сайт использовал SSL.Это не было проблемой для меня, когда я запускал все локально, но если я даже запускал IP-адрес своей сети, требовался SSL.Я перестал получать ошибки, как только я установил https на моем сервере.Насколько я знаю, это не задокументировано в документации musicKit.js, но я, возможно, пропустил это.

...