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 は、play の呼び出しがユーザー アクションによって初期化されるという制限付きで動作するはずです。iOS5 以下ではおそらく修正されません。

何らかのハックでこれを解決しようとしますが、おそらくすぐには適切な解決策が得られないでしょう.

SoundCloud Widget は HTML5 Audio を使用して iOS でサウンドを再生します。iOS での再生の開始には 2 つの制限があります。

  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 が廃止されました。これは、API 呼び出しがユーザー アクションによって呼び出される限り、playサウンドを再生できることを意味します。親ウィンドウとウィジェットの iframe 間の通信はまだ非同期ですが。残念ながら、iOS はこの制限を解除していません。

これがお役に立てば幸いです。適切な回避策が見つかった場合に備えて、この回答を更新します。

iOS での再生の制御がアプリにとって重要な場合に備えて、Audio5JSSoundManager2などのライブラリを使用して独自のカスタム プレーヤーを構築することをお勧めします。

developer.apple.comリソースで、私が話していることのあいまいな説明を見ることができます。

于 2012-11-26T17:16:11.717 に答える
1

@gryzzly がこれを言おうとしているかどうかは完全にはわかりませんが、モバイルでは Widget API の外部コントロールが完全に壊れています。答えはその理由を説明しています-iFrameにサウンドを再生するように同期的に指示することはできませんが、適切な iframe.contentWindow 呼び出しが同期することは私の理解です? 私は間違っているかもしれません。

携帯電話をウィジェット API プレイグラウンドに向けてみてください: https://w.soundcloud.com/player/api_playground.html

オレンジ色のボタンを押さない限り、実際には再生されません。

ストリーミング API の制限を回避するアプリケーションもないため、かなりイライラします。文字通り、1 日あたり 15,000 を超えるリクエスト/プレイが発生する可能性のあるサイトを、モバイルで SoundCloud と連携させる方法はないようです。連続して音楽を再生したいだけです。

于 2015-10-17T21:46:36.707 に答える