2016-05-25 11 views
6

Hinweis: Dieses Problem wurde im November 2016 in iOS 10.1.1 behoben. Danke Apple!iOS auf iPad Deaktivierung der Web-Audio-API

Ich kann keine Audio über Web Audio API auf iPad spielen. Dies verwendet die neueste Version von iOS (seit 9.3.2 - derzeit 10.1).

Test Case

Hier ist a bare-bones test ich eingerichtet haben (Code unten). Keiner der Tests funktioniert für mich auf dem iPad. Keine Probleme auf dem iPhone oder anderen kompatiblen Browsern. Es gibt another test page here (von William Malone). Keiner dieser Töne spielt auf drei iPads aus. Schließlich verwendet this game Web Audio API (danke Derek) und ist auch stummgeschaltet.

Wenn Sie dies auf iPad lesen, versuchen Sie es bitte bare-bones test und melden Sie in den Kommentaren (oder contact me privately), wenn laden, gefolgt von spielen, funktioniert und spielt Sound. Bitte geben Sie die iOS-Versionsnummer an (Einstellungen -> Allgemein -> Info -> Version).

Alle Einsichten oder Rückmeldungen würden sehr geschätzt werden! Hier

ist der Testcode:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Web Audio API - iPad Test</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <script src="./jquery-2.2.3.min.js"></script> 
    <style> 
     section { padding:10px; margin:0 0 10px; background:DarkSeaGreen } 
     a { cursor:pointer; display:block; background: DarkSeaGreen; padding:10px; margin:0 0 3px } 
    </style> 
</head> 
<body> 
    <script> 
     var app = {}; 
     $(document).ready(function() { 
      // Do we have Web Audio API? 
      try { 
       window.AudioContext = window.AudioContext || window.webkitAudioContext; 
       audioContext = new AudioContext(); 
      } catch (e) { 
       alert('Web Audio API is not supported in this browser'); 
      } 
      $('#loadClick').on('click',function(){load('./ipad_test.mp3')}); 
      $('#playTouchEnd').on('touchend',play); 
      $('#playTouchStart').on('touchstart',play); 
      $('#playClick').on('click',play); 
      $('#unlockTouchEnd').on('touchend',unlock); 
      $('#unlockTouchStart').on('touchstart',unlock); 
      $('#unlockClick').on('click',unlock); 
     }); 
     function unlock() { 
      // play empty buffer to unmute audio 
      var buffer = audioContext.createBuffer(1, 1, 22050); 
      var source = audioContext.createBufferSource(); 
      source.audioContext = buffer; 
      source.connect(audioContext.destination); 
      source.start(0); 
      $('#messages').append('<p>Unlocked.</p>'); 
     } 
     function load(file) { 
      if(app.loaded) { 
       $('#messages').append('<p>Already loaded.</p>'); 
       return; 
      } 
      var request = new XMLHttpRequest(); 
      request.open ('GET', file, true); 
      request.responseType = 'arraybuffer'; 
      request.onload = function() { 
       audioContext.decodeAudioData(
         request.response, 
         function (buffer) { 
          app.buffer = buffer; 
          $('#messages').append('<p>Loaded.</p>'); 
          app.loaded = 1; 
         }, 
         function(){alert('Load error.');} 
       ) 
      }; 
      request.send(); 
     } 
     function play() { 
      if(!app.loaded) { 
       $('#messages').append('<p>Please load before playing.</p>'); 
       return; 
      } 
      var sourceNode = audioContext.createBufferSource(); 
      sourceNode.buffer = app.buffer; 
      sourceNode.connect (audioContext.destination); 
      sourceNode.start(0); 
      $('#messages').append('<p>Playing.</p>'); 
     } 
    </script> 
    <h1>Web Audio API Test</h1> 
    <p>Unlock should not be needed at all, but offers an alternative way to try and get the audio going. Load and then play should be all any compatible device needs. Refresh to start again.</p> 
    <a id="unlockTouchEnd">Unlock (touchend)</a> 
    <a id="unlockTouchStart">Unlock (touchstart)</a> 
    <a id="unlockClick">Unlock (click)</a> 
    <a id="loadClick" style="background:#c0c0c0">Load (click)</a> 
    <a id="playTouchEnd">Play Audio (touchend)</a> 
    <a id="playTouchStart">Play Audio (touchstart)</a> 
    <a id="playClick">Play Audio (click)</a> 
    <section id="messages"></section> 
</body> 
</html> 

Hintergrund

Die Apple documentation makes it clear, dass das Audiosignal von einer Benutzeraktion initiiert werden für Web Audio API zu arbeiten. Sie geben an:

Hinweis: Unter iOS erfordert die Web Audio-API, dass Sounds von einer expliziten Benutzeraktion ausgelöst werden, z. Der Aufruf von noteOn() von einem Onload-Ereignis wird nicht wiedergegeben.

Es gibt eine Reihe von Themen im Online über Probleme mit diesem, das zuletzt im Herbst 2015 mit iOS 9,0-9,2:

Sie schlagen vor, Audio von einem Touchstart-Ereignis auszulösen, um iOS-Audio zu entsperren (oder zu hören, während Probleme zu dieser Zeit aufgetreten sind). Ich habe alle vorgeschlagenen Techniken ausprobiert und kann keinen Touchstart, Touchend oder Klick zur Arbeit bekommen. Das Audio wird immer auf dem iPad stummgeschaltet.

+1

Wahrscheinlich eine dumme Frage, aber haben Sie Ihren Stummschalter überprüft? Dies ist mir mehrmals mit Web-Audio-Kram auf iOS-Geräten passiert. Ich vergesse, dass mein Telefon vibriert wurde und der Browser keine Töne mehr spielt. –

+0

Danke. Ja, zuerst habe ich es versucht. Normalerweise spiele ich etwas Audio von etwas anderem auf dem Gerät, um es zu überprüfen. – SuperDuperApps

+0

Eine wilde Vermutung: Chrome auf Win Desktop verfügt über die Fähigkeit, "Registerkarte stummschalten" (Zugriff durch Rechtsklick). Ist dies standardmäßig in Ihrem Browser und vielleicht aus den Voreinstellungen? –

Antwort

0

Apple hat dieses Problem in iOS 10.1.1 November 2016 behoben. Danke Apple!