[iphone] Riproduci automaticamente i file audio su un iPad con HTML5



Answers

Vorrei anche sottolineare che la ragione per cui non puoi farlo è una decisione commerciale presa da Apple, non una decisione tecnica. Per arguire, non c'era alcuna giustificazione tecnica razionale per Apple per disabilitare il suono dalle app Web su iPod Touch. Questo è solo un dispositivo WiFi, non un telefono che può incorrere in costosi addebiti per la larghezza di banda, quindi l'argomento non ha valore per quel dispositivo. Potrebbero dire che stanno aiutando con la gestione della rete WiFi, ma qualsiasi problema con la larghezza di banda sulla mia rete WiFi è la mia preoccupazione, non quella di Apple.

Inoltre, se ciò di cui veramente si preoccupava di impedire un consumo eccessivo e indesiderato della larghezza di banda, fornirebbe un'impostazione che consentisse agli utenti di attivare i suoni delle app Web. Inoltre, farebbero qualcosa per impedire ai siti Web di consumare una larghezza di banda equivalente con altri mezzi. Ma non ci sono tali restrizioni. Un sito Web può scaricare più e più volte file enormi sullo sfondo e Apple potrebbe interessarsi di meno. E infine, credo che i suoni possano essere scaricati in ogni caso, quindi NON VIENE EFFETTIVAMENTE SALVATA BANDWIDTH! Apple semplicemente non consente loro di giocare automaticamente senza l'interazione dell'utente, rendendoli inutilizzabili per i giochi, che naturalmente è il loro vero intento.

Apple ha bloccato il suono perché ha iniziato a notare che le app HTML5 possono essere altrettanto valide delle app native, se non di più. Se vuoi il suono nelle app Web, devi fare pressione su Apple per smettere di essere anticoncorrenziale come Microsoft. Non ci sono problemi tecnici che possono essere risolti qui.

Question

Sto cercando di ottenere un file audio per la riproduzione automatica in Safari su un iPad. Se vado alla pagina usando Safari sul mio Mac, va bene. Sull'iPad, la riproduzione automatica non funziona.




L'ho gestito allegando un gestore di eventi per tutti gli eventi per i quali è consentito attivare l'audio sull'elemento body che attiva gli elementi audio html con la riproduzione automatica da riprodurre una volta.

var mobile = /iPad|iPhone|iPod|android/.test(navigator.userAgent) && !window.MSStream;
if (mobile) {
    $('body').on('touchstart click doubleclick keydown', function() {
        $("audio[autoplay='autoplay']").each(
            function(){
                this.play();
                this.removeAttribute('autoplay');
            });
    });
}



Se crei un elemento audio utilizzando:

var a = new Audio("my_audio_file.wav");

E aggiungi un listener di eventi di suspend tramite:

a.addEventListener("suspend", function () {console.log('suspended')}, false);

E poi carica il file in Safari mobile (iPad o iPhone), vedrai che il messaggio 'sospeso' viene registrato nella console degli sviluppatori. Secondo le specifiche HTML5, ciò significa "L'agente utente attualmente non sta recuperando i dati multimediali, ma non ha scaricato l'intera risorsa multimediale".

Chiamando a.load () successivo, testare l'evento "canplay" e quindi usare a.play () sembra un metodo adatto per l'attivazione automatica del suono.




Mi sembra che la risposta a questa domanda sia (almeno ora) chiaramente documentata sui documenti HTML5 di Safari :

Controllo utente dei download su reti cellulari

In Safari su iOS (per tutti i dispositivi, incluso iPad), in cui l'utente può trovarsi su una rete cellulare e essere addebitato per unità di dati, il precaricamento e la riproduzione automatica sono disabilitati. Nessun dato viene caricato fino all'avvio dell'utente. Ciò significa che i metodi JavaScript play () e load () sono anche inattivi fino a quando l'utente inizia la riproduzione, a meno che il metodo play () o load () non sia attivato dall'azione dell'utente. In altre parole, un pulsante Riproduci avviato dall'utente funziona, ma un evento onLoad = "play ()" no.

Questo riproduce il film: <input type="button" value="Play" onClick="document.myMovie.play()">

Questo non fa nulla su iOS: <body onLoad="document.myMovie.play()">




Prova a chiamare il metodo .load () prima del metodo .play () sul tag audio o video ... che sarà rispettivamente HTMLAudioElement o HTMLVideoElement. Era l'unico modo in cui avrebbe funzionato sull'iPad per me!




A partire da iOS 4.2.1, né il trucco falso né il trucco .load () funzioneranno per riprodurre automaticamente l'audio su qualsiasi dispositivo iOS. L'unica opzione che conosco è che l'utente esegua effettivamente un'azione di clic e inizi la riproduzione nel gestore di eventi click senza includere la chiamata .play () in qualcosa di asincrono (ajax, setTimeout, ecc.).

Qualcuno, per favore, dimmi se mi sbaglio. Ho avuto scappatoie lavorative sia per iPad che per iPhone prima dell'ultimo aggiornamento, e tutte sembrano essere state chiuse.




Apple non supporta completamente lo standard, ma esiste una soluzione alternativa. La loro justification è la congestione della rete cellulare, forse perché atterrerai su pagine che riproducono audio casuale. Questo comportamento non cambia quando un dispositivo va su wifi, forse per coerenza. A proposito, quelle pagine di solito sono una pessima idea. Non dovresti provare a mettere una colonna sonora su ogni pagina web. È semplicemente sbagliato. :)

l'audio html5 verrà riprodotto se viene avviato come risultato di un'azione dell'utente. Il caricamento di una pagina non conta. Quindi è necessario ristrutturare la tua app Web per diventare un'app di tutte le pagine. Invece di un collegamento che apre una pagina che riproduce l'audio, è necessario che quel collegamento lo riproduca nella pagina corrente, senza modificare la pagina. Questa regola "interazione utente" si applica ai metodi html5 che è possibile chiamare su un elemento audio o video. Le chiamate ritornano senza alcun effetto se vengono attivate automaticamente al caricamento della pagina, ma funzionano quando vengono chiamate dai gestori di eventi.




Related