iOS6.1 Web Audio API 最新バッドノウハウです
iOS6.1 にしてから timbre.js のドキュメントページが一部動かなくなった。 具体的には このページ とか、このページとか、再生が始まらない。
色々検討して多分こうだろうというのを書きます。検討不足な感は多いにある。
iOS の Web Audio API はユーザーのアクションきっかけでないとスタートしない
クリックイベントとかそういうのなしに、window.onload とかで勝手に音を鳴らす事はできない。ドキュメントに書いてあるのでこれは確実。
Safari HTML5 Audio and Video Guide: Playing Sounds with the Web Audio API
Note: On iOS, the Web Audio API requires sounds to be triggered from an explicit user action, such as a tap. Calling noteOn() from an onload event will not play sound.
XMLHttpRequest をつかうとユーザーのアクションがリセットされる
こっちは検証した結果。たぶんそうだろうということ。最初にあげた2つのページはどちらもクリックしたあと XMLHttpRequest で wav を読み込んで利用している。wavを読み込んだ後にコールバックで Web Audio API を起動しているのが駄目っぽい。
setInterval だとユーザーのアクションがリセットされない
こっちも検証の結果。
回避方法
かなり ugly ですが、 XMLHttpRequest のあと setInterval でポーリングするとOKです。setInterval と XMLHttpRequest の順番が逆だと駄目。アホか。
2013/02/05 追記:こうしても動かないときがありました。すみません。
var flag = false; var t = setInterval(function() { if (flag) { clearInterval(t); callback( xhr.response ); } }, 100); var xhr = new XMLHttpRequest(); xhr.open("GET", path, true); xhr.responseType = "arraybuffer"; xhr.onload = function() { flag = true; }; xhr.send();
ちなみに
iOS6.0 でも ユーザーイベントなしに再生を始めることは出来なかったのだけど、 setTimeout を使うと自動再生もできるっぽかった。
で
そういう対策をしたら動くのは分かったのだけど、そういうコード入れたくない気持ちもあって悩んでいる。 アップルにはレポート送った。