1

我在 iOS 上使用 html5 小部件的外部控件发现了一个错误,我已经用 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...

谢谢,詹姆斯

4

2 回答 2

6

TL;DR:iOS 6 应该通过用户操作来限制播放调用,iOS5 及更低版本可能无法修复。

我们将尝试通过某种 hack 来解决这个问题,但很可能这不会很快得到适当的解决方案。

SoundCloud Widget 使用 HTML5 Audio 在 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 之间的跨域通信只能以异步方式进行。我们的实现使用的是postMessageDOM API,但即使是旧的技术,例如正在使用的 Fragment Identifier Messaging (FIM),也是location.hash异步的。这意味着我们目前看不到通过适用于 iOS5 及更低版本的 API 启用播放的方法(因为也没有 Flash 后备)。

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

我希望这会有所帮助,如果我们找到合适的解决方法,我会更新这个答案。

我的建议是使用Audio5JSSoundManager2等库构建您自己的自定义播放器,以防在 iOS 上控制播放对您的应用程序至关重要。

您可以在developer.apple.com资源上看到我在谈论的内容的模糊描述。

于 2012-11-26T17:16:11.717 回答
1

我无法完全判断@gryzzly 是否试图这么说,但Widget API 的外部控件在 mobile 上完全被破坏了。答案确实解释了为什么 - 你不能同步告诉 iFrame 播放声音,但我的理解是正确的 iframe.contentWindow 调用将是同步的?我可能错了。

尝试将您的手机定向到小部件 API 游乐场:https ://w.soundcloud.com/player/api_playground.html

即使在那里,除非您按下橙色按钮,否则它实际上也不会播放。

Pretty irritating since there's no application to get around the streaming API limit either. There seems to be literally no way to get a site that may experience more than 15,000 requests/plays per day to work with SoundCloud on mobile. I just want continuous music playback.

于 2015-10-17T21:46:36.707 回答