音の鳴るブログ

鳴らないこともある

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 を使うと自動再生もできるっぽかった。

そういう対策をしたら動くのは分かったのだけど、そういうコード入れたくない気持ちもあって悩んでいる。 アップルにはレポート送った。