How can I autoplay media in iOS >= 4.2.1 Mobile Safari?
Asked Answered
V

9

23

I cannot seem to get audio media to play in Mobile Safari on iOS 4.2.1 in any situation other than the handler of a click event performed by the user. Even then, if player.play() is called in any asynchronous fashion (ajax, setTimeout, etc) it doesn't work.

I've tried calling player.load() before player.play(). I've tried triggering a click event on a dom element whose handler calls player.play(). I've tried using both audio and video tags.

All the loopholes that worked prior to iOS 4.2.1 seem to be closed. Any ideas?

Varney answered 23/11, 2010 at 19:24 Comment(4)
Pretty sure that’s by design. Some of your users may be on cell plans that charge by data usage, and they don’t want your media to auto-play.Katey
possible duplicate of Autoplay an Audio File on Mobile SafariKatey
I understand it's by design. However, prior to 4.2.1 there were several loopholes that allowed circumvention. FWIW, I'm not actually trying to autoplay audio on page load. The audio source urls I'm using are unstable and cannot be cached, so I'm making an ajax call inside the click handler to resolve the audio source. This in itself is enough to trigger iOS's defense mechanisms apparently.Varney
I spent about an hour today shuffling code around because I had the play() function within an asynchronous function (Ajax call). Even in a click handler, with an actual click, it still didn't work. So: beware, I guess. I wish Apple would publish the specific criteria we need to follow.Enforce
S
17

Starting from iOS 4.2.x, the download of media will not be started if there isn’t a user-input event, like touchstart.

So the answer is no, there is no method to autoplay media by JavaScript or something else.

Stereophotography answered 28/11, 2010 at 8:20 Comment(3)
Any official links from Apple saying this? Just to satisfy the higher ups ;) Thanks!Formosa
azure_ardee - see this developer.apple.com/library/safari/#documentation/AudioVideo/…Bottle
@ArdeeAram This link from Apple explains how video with audio not muted can't be autoplayed without user interaction. developer.apple.com/documentation/webkit/…Impinge
K
14

There is one way to play the video/audio file automatically on 4.2.1. Create an iframe and set its source to the media file's URL and append the iframe to the body. It'll be autoplay.

var ifr=document.createElement("iframe");
ifr.setAttribute('src', "http://mysite.com/myvideo.mp4");
ifr.setAttribute('width', '1px');
ifr.setAttribute('height', '1px');
ifr.setAttribute('scrolling', 'no');
ifr.style.border="0px";
document.body.appendChild(ifr);
Kunkle answered 15/12, 2010 at 12:20 Comment(4)
works fine for audio, but video player is not loaded on the iPhoneLustihood
I can confirm that this works on the iPad, but it seems to force a reload of a sound each time that it it played. Are there any workarounds that allow it to cache the sound, so that it gets played instantly.Heteroclite
GREAT! It works! Tested on iOS 4.3.5 (iPod Touch 4). No loop, BTW.Trigonometry
Also, if you create 2 iframes, only the last one really plays.Trigonometry
G
6

As others have said here and according to Apple documentation, MobileSafari does NOT support the autoplay attribute in the video tag. However, in iOS 6 it DOES work. This appears to be a bug which Apple fixed in iOS 6.0.1 (and presumably in iOS 6.1).

Don't rely on autoplay working in iOS 6 if you happened to stumble across it working in iOS 6.0.

-Michael

Gelb answered 20/11, 2012 at 23:2 Comment(0)
M
4

As a workaround, I tried tying the load()/play() code to a click event, and then triggering the click event programmatically. This approach worked in Desktop Safari, but not Mobile Safari.

Maurita answered 7/12, 2010 at 19:46 Comment(0)
W
1

This worked on the iPad until last nights 4.2 upgrade:

$(function() {
    var Beep = document.createElement('audio');
    Beep.setAttribute('src', 'beep-23.mp3');
    Beep.load();
    Beep.play();
}

My Beep.play(); still works for a click event, but the initial Beep.play() stopped working...

Worktable answered 24/11, 2010 at 2:10 Comment(0)
V
1

How about this?

Create an audio sprite with Sound Manager 2, preload & cache it from the first user interaction, and then play as and when needed.

Would that work?

Voltcoulomb answered 16/4, 2012 at 15:31 Comment(2)
Unfortunately, this requires you to stop the sound, and then play so won't work. The answer above is right. There is no way :/Voltcoulomb
It works!!! Only the first sound needs to be linked to a user interaction, any subsequent sounds following can be played automatically.Voltcoulomb
F
0

Autoplay is supported (in my tests) with an iPhone 5 (iOS 6) using the headphone jack.

Flyback answered 19/10, 2012 at 15:24 Comment(0)
S
0

On my 3rd-gen iPad running IOS 6, autoplay of HTML5 tags has suddenly begun working! (I've had IOS 6 installed for a couple of weeks, and am pretty sure I tested this feature right away, but only noticed it working tonight.) I don't recall seeing any notice of this from Apple, although I did see that mobile Safari had been granted the ability to support file uploads via

<form><input type="file" .../></form>

-- another feature I needed but which Apple had withheld.

Salmons answered 27/10, 2012 at 7:25 Comment(1)
Surprised by the downvotes. This was an accurate and useful answer because autoplay did work in iOS 6. Helpful to me since it explained why I was pulling my hair out transitioning from 6.0 to 6.0.1 (see Micheal Johnston's answer for more specifics).Semitic
C
-1

Please Try this Code it is working both version, you need to add the audio control dynamically in page. it is working.

var isiPad = false;
if (navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i)) { 
    isiPad = true; 
}
$(function() { 
    if (isiPad) { 
        var audioElement2 = document.createElement('audio'); 
        audioElement2.setAttribute('src', 'img/bgsound.mp3'); 
        audioElement2.controls = true; 
        audioElement2.loop = true; 
        audioElement2.load();
        audioElement2.play();
    }
});
Chlordane answered 9/12, 2010 at 16:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.