ОБНОВЛЕНИЕ для iOS 6:
Это все исправлено в iOS 6. Вы можете кэшировать аудиофайл и воспроизводить его через JavaScript без ввода данных пользователем.
shaun5 7 ноября 12 в 0: 58
Несмотря на то, что он должен работать, и нет никаких спецификаций (W3C, Apple), которые говорят, что это не должно, я протестировал некоторые сценарии, и кажется, что Safari на iOS просто отказывается кэшировать звуковые файлы.
Safari загружает аудиофайл (но не index.html) каждый раз, когда я перезагружаю страницу, поэтому, очевидно, кеширование работает неправильно независимо от размера файла.
После некоторых исследований: похоже, что невозможно кешировать аудиофайлы. Таким образом, вы можете отправить сообщение об ошибке на Apple bugtracker .
Вот мой код для подтверждения моих результатов:
index.html:
<!DOCTYPE HTML>
<html lang="en-US" manifest="audio.appcache">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<title>Cached audio</title>
</head>
<body>
<h1>Cached audio</h1>
<audio controls autobuffer>
<source src="sample.mp3" type="audio/mpeg" />
</audio>
</body>
</html>
audio.appcache:
CACHE MANIFEST
# 2012-02-23:v1
# explicitly cached
CACHE:
index.html
sample.mp3
.htaccess:
AddType text/cache-manifest .appcache
AddType audio/mpeg .mp3
EDIT
Я также пытался использовать URI данных, но Safari продолжает отказывать в аудиоданных. Поэтому я думаю, что невозможно кешировать аудио ...
<?php
function data_uri( $file ) {
$contents = file_get_contents( $file );
$base64 = base64_encode( $contents );
return ( 'data:audio/mpeg;base64,'.$base64 );
}
?>
...
<audio controls autobuffer>
<source src="<?php echo data_uri('sample.mp3'); ?>" type="audio/mpeg" />
</audio>
...
РЕДАКТИРОВАТЬ 2
Отличная идея, но похоже, что она не работает ... Safari для OS X -> хорошо; Safari для iOS -> та же проблема, что и раньше.
<?php
function base_64_string( $file ) {
$contents = file_get_contents( $file );
return base64_encode( $contents );
}
?>
...
<audio controls autobuffer>
<source id="sound-src" src="sample.mp3" type="audio/mpeg" />
</audio>
...
<script>
(function(){
var sound;
if ( localStorage.getItem('cachedSound')) {
sound = localStorage.getItem('cachedSound');
}
else {
sound = "<?php echo base_64_string('sample.mp3'); ?>";
localStorage.setItem('cachedSound',sound);
}
document.getElementById("sound-src").src='data:audio/mpeg;base64,' + sound;
})();
</script>