SoundCloud Widget外部控制iOS问题

我发现了一个使用外部控件的iOS5上的HTML5小部件的错误,我已经testing了iPhone和iPad。 小部件里面的控件工作正常。 然而,在我的客户端网站http://www.bushytunes.net和小工具api游乐场http://w.soundcloud.com/player/api_playground.html外部控制运行错误。

这里是从小工具操场打印的控制台:

SC.Widget.Events.PLAY {"loadedProgress":null,"currentPosition":0,"relativePosition":0} SC.Widget.Events.PAUSE {"loadedProgress":null,"currentPosition":0,"relativePosition":0} SC.Widget.Events.PLAY {"loadedProgress":null,"currentPosition":0,"relativePosition":0} SC.Widget.Events.PLAY {"loadedProgress":null,"currentPosition":0,"relativePosition":0} SC.Widget.Events.PLAY {"loadedProgress":null,"currentPosition":0,"relativePosition":0} SC.Widget.Events.READY {} Loading... 

谢谢,詹姆斯

TL; DR :iOS 6应该可以通过用户操作初始化一个调用的限制,iOS5或更低版本可能不会得到修复。

我们将尝试用某种黑客来解决这个问题,但很可能这很快就不会得到正确的解决scheme。

SoundCloud Widget正在使用HTML5audio在iOS上播放声音。 在iOS中开始播放有两个限制:

  1. 回放必须由用户操作启动(所以在事件处理程序中)
  2. audio.play方法的调用必须位于该事件处理程序的同步调用堆栈中。

这意味着,这工作:

 document.querySelector('.play-button').addEventListener('click', function () { audioController.play(); }, false); 

但是这不是:

 document.querySelector('.play-button').addEventListener('click', function () { setTimeout(function () { audioController.play(); }, 500); }, false); 

iframe之间的跨域通信只能以asynchronous方式进行。 我们的实现是使用postMessage DOM API,但即使是较旧的技术,如使用location.hash片段标识符消息传递(FIM)也是asynchronous的。 这意味着我们目前还没有看到通过iOS5及以下版本的API启用播放的方式(因为没有Flash后备)。

不过,也有好消息: iOS6已经放弃了No2的限制 。 这意味着只要用户操作调用API调用,就可以播放声音。 即使您的父窗口和小部件的iframe之间的通信仍然是asynchronous的。 不幸的是,iOS还没有放弃这个限制。

我希望这有帮助,我会更新这个答案,以防我们find一个适当的解决方法。

我的build议是用Audio5JS或SoundManager2等库来build立自己的自定义播放器, 以便在iOS上控制播放对您的应用至关重要。

你可以在developer.apple.com资源上看到我所说的模糊描述。

我不能完全知道,如果@ grryzzly试图说这个,但Widget API的外部控件是完全打破了移动 。 答案确实解释了为什么 – 你不能同步告诉iFrame播放声音,但是我的理解是,正确的iframe.contentWindow调用是同步的吗? 我可能是错的。

尝试将您的手机导向小部件API操场: https : //w.soundcloud.com/player/api_playground.html

即使在那里它实际上不玩,除非你按下橙色button。

相当恼人,因为没有应用程序绕过streamAPI的限制。 似乎没有办法让一个每天可能经历超过15,000次请求/播放的站点与移动设备上的SoundCloud一起工作。 我只想连续播放音乐。