0

我正在编写一个使用 Angular 和 MusicKit 的应用程序,以允许用户同时收听相同的音乐。尝试针对默认 localhost 以外的任何对象(使用 ng serve)运行应用程序(使用 ng serve --host xxxx)时遇到以下错误:

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”错误是导致第一个错误的结果,但我将其包括在内是安全的。我在 digitalocean 上使用 nginx 服务器(ng build,将 dist 文件夹移动到 /var/www/html),但在本地我只是使用“ng serve --host xxxx 来针对我的本地 IP 运行。当只使用普通的 ng 服务,一切正常。我尝试过使用其他 Apple Music 帐户,以防 Apple 对实际发出请求的应用程序感到困惑,并且我在 Chrome 中的不同浏览器/隐身窗口中进行了尝试。

我正在尝试执行以下操作: 1. 向用户显示他们库中的歌曲列表 2. 允许用户选择一首歌曲 3. 在 observable 中订阅以下步骤: 4. 选择歌曲后,排队歌曲与 musicKit.queueSong 5. 当歌曲排队时,使用 musicKit.player.play() 播放当前排队的歌曲

在第 5 步之后会出现以下错误。我已经在歌曲中添加了 container.id,所以我相信出于某种原因苹果实际上并没有对歌曲进行排队,我只是不确定之后会发生什么。queueSong 成功返回,所以我认为 container.id 不是唯一的 null 或 undefined,它只是它抱怨的第一件事。

描述上述步骤中发生的情况的代码。"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 去播放排队的歌曲时,那里没有歌曲可以播放。当我在本地主机之外运行时,我不确定这首歌在成功排队后实际发生了什么。

我还把它发布到了苹果开发者论坛,我在其中包括了去年遇到问题的人,但它从未得到解决。 https://forums.developer.apple.com/message/350355#350355

我也忘了在原帖中提到:这只发生在 chrome 中。该代码在 Firefox 和移动 safari 中运行良好。

4

1 回答 1

0

解决方案:

至少在 chrome 中,musicKit.js 要求托管的站点使用 SSL。这对我在本地运行一切都不是问题,但如果我什至针对我的网络 IP 地址运行,则需要 SSL。在我的服务器上设置 https 后,我不再收到错误消息。据我所知,musicKit.js 文档中没有记录,但我可能错过了。

于 2019-02-20T00:10:50.547 回答