2012-11-07 17 views
11

Prima di essere fiammato a morte, so che questo non funziona attualmente a causa della preoccupazione di Apple per il terrificante costo per i propri utenti di scaricare automaticamente un file audio (niente a che fare con loro cercando di paralizzare il web app in quanto non ricevono il 30% da loro).Riproduzione automatica dell'audio su safari mobile

Tuttavia, la mia domanda è: qualcuno ha ancora trovato una soluzione astuta? Voglio solo avviare un suono all'avvio di un gioco e attualmente devo aspettare che l'utente clicchi da qualche parte prima di poter riprodurre l'audio. Uno di voi ragazzi intelligenti deve aver funzionato a questo punto?

+1

Stavo cercando di fare qualcosa di simile qualche settimana fa e la mia ricerca era infruttuosa ... – boz

+0

Ho cercato su Google questo problema e non ho trovato nulla di utile. Please StackOverflow, sei la mia unica speranza ... –

+0

Ho trovato una soluzione alternativa per Firefox e Chrome usando 'AudioContext', ma non ho provato su Safari (per favore conferma se funziona con Safari mobile). Vedi la mia risposta su una domanda simile https://stackoverflow.com/a/46485784/2342518 [Speriamo che @boz sia stato l'ultimo ad avere una ricerca infruttuosa da ora in poi ☺] – Xenos

risposta

6

Non è possibile eseguire la riproduzione automatica nei browser mobili. Android e iOS non lo consentono e personalmente ritengo che sia un limite possibile! Immagina ogni secondo sito web che aprirai giochi e suoni brutti all'inizio!

Ma si può fare un po 'di trucco, in modo che l'utente non notare che attualmente ha iniziato l'audio per la vostra applicazione:

  1. avrete bisogno di un intervento da parte dell'utente per iniziare il vostro audio. Pertanto, la tua app o il tuo gioco potrebbero avere uno schermo di avvio o un pulsante di benvenuto che richiede un clic per accedere a mainmenu o avviare il gioco. Associare a quell'evento click e chiamare il metodo load() per il tuo <audio>.

  2. Associare all'evento "canplaythrough" dello <audio>. Questo evento viene attivato quando la tua fonte è pronta per giocare. Qui puoi ora chiamare play(), pause() o aspettare altre interazioni. Quindi l'audio è pronto ma ora hai il pieno controllo quando avviare o interrompere il suono.

  3. Si consiglia inoltre di utilizzare sprite audio sui client mobili. iOS (e Android?) supporto audio implementato internamente tramite Singleton. Ciò significa che non puoi, come nel browser desktop, avere 10 elementi audio e riprodurre suoni diversi contemporaneamente. Puoi giocare solo un file! Quindi cambiare la sorgente per suoni diversi richiede molto tempo. Con uno sprite audio puoi iniziare i tuoi sprite quando l'utente interagisce prima con il tuo sito web o gioco. Metti in pausa lo sprite e quando hai bisogno di riprodurre il suono devi impostare il tempo corrente all'inizio dello sprite e mettere in pausa lo sprite quando il tempo corrente del file raggiunge la fine del tuo sprite. C'è un evento timeupdate in cui puoi controllare il tempo corrente del tuo sprite.

Se sei più interessato, posso preparare il mio lettore di sprite audio javascript per te !!

+0

Grazie per aver risposto, purtroppo il nostro gioco deve iniziare senza ulteriori interazioni con gli utenti, quindi il tuo "hacking" non funzionerà per noi. e che funziona bene (soprattutto!). Ti darò la risposta giusta perché sembra che non ci sia altra soluzione in questo momento ... –

+0

C'è una possibilità di usare 'AudioContext'; vedi la mia risposta https://stackoverflow.com/a/46485784/2342518 – Xenos

+0

Sai se posso caricare più elementi audio diversi quando l'utente fa clic sul pulsante? –

2

L'unica soluzione che ho visto finora è creare un'app shell e inserire l'app Web all'interno di UIWebView.

http://flowz.com/2011/03/apple-disabled-audiovideo-playback-in-html5/

UIWebView.allowsInlineMediaPlayback = YES; 
UIWebView.mediaPlaybackRequiresUserAction = NO; 

Inoltre vorrei davvero sapere come fare questo in una pianura vecchio web app.

+0

Sfortunatamente il nostro punto di vista delle versioni HTML5 del nostro attuale portafoglio è che dovrebbero essere indipendenti dal dispositivo. Avvolgendolo in una UIWebView significa solo iOS :-( Grazie per aver risposto ... –

0

Credo di averlo appena risolto per la mia app.

I passi,

carichi controller si accende,

poi ....in viewDidLoad

fare in modo che la vista Web carichi HTML: loadHTMLString: htmlFile baseURL: [self getBasePath]];

THEN ... set mediaPlaybackRequiresUserAction = NO nella visualizzazione Web.

Se lo si imposta troppo presto, penso che il carico per l'html lo ripristini.