Как инициализировать SoundJS для IOS 9
Мы уже давно используем пакет CreateJS, но только что поняли, что наше аудио не работает на IOS9. К сожалению, у нас есть только одно тестовое устройство IOS9, работающее под управлением IOS9.2.4, но мы получаем смешанные результаты при воспроизведении аудио.
Я использую грубый процесс;
- Предварительная загрузка всех ресурсов (скрипты / изображения / аудио) через PreloadJS
- Создайте начальный экран-заставку в EaselJS, включая кнопку запуска
- Продолжить с основным содержанием
Было бы полезно иметь возможность предварительно загрузить все аудио перед тем, как представить этот экран-заставку. Первоначально был добавлен экран-заставка, позволяющий воспроизводить звук на мобильном Safari, а при нажатии воспроизводится пустой звук. Это, конечно, работает для IOS7/8, но не для 9.
Я создал этот тестовый пример на codepen как попытку отследить проблему и попробовать некоторые варианты.
HTML
<p id="status">Hello World</p>
<canvas id="canvas" width="200" height="200"></canvas>
JS
var canvas, stage, rect;
function init() {
canvas = document.getElementById('canvas');
canvas.style.background = "rgb(10,10,30)";
stage = new createjs.Stage("canvas");
createjs.Touch.enable(stage);
rect = new createjs.Shape();
rect.graphics.f("#f00").dr(50,75,100, 50);
rect.on("mousedown", handleStart, null, true);
rect.on("touchend", handleStart, null, true);
//rect.on("click", handleStart, null, true);
stage.addChild(rect);
stage.update();
$('#status').text("Touch to Start");
createjs.Sound.initializeDefaultPlugins();
//createjs.Sound.alternateExtensions = ["ogg"];
createjs.Sound.registerSound("https://www.freesound.org/data/previews/66/66136_606715-lq.mp3", "ding1");
}
function handleStart(event) {
createjs.WebAudioPlugin.playEmptySound();
$('#status').text("Touch to Play");
rect.graphics._fill.style = '#0f0';
rect.removeAllEventListeners();
rect.on('click', handlePlay);
stage.update();
}
function handlePlay(){
createjs.Sound.play("ding1");
$('#status').text("Playing");
}
init();
Извиняюсь за отсутствие версии ogg, изо всех сил пытался получить тестовые файлы для загрузки x-домена.
При этом аудио частично работает у нас на IOS9. Если мы оставим нажатие на красный прямоугольник (кнопка запуска рисунка) и оставим его на ~20 секунд, затем нажмите зеленую кнопку, чтобы звук не воспроизводился. Если щелкнуть по нему сразу, звук воспроизводится нормально.
Я просматривал эту ошибку / тему и пытался следовать советам Гранта. Я понял, что SoundJS v0.6.2 теперь автоматически пытается воспроизвести пустой звук, подходящий при инициализации плагинов, однако перемещение вызовов initializeDefaultPlugins и registerSounds в функцию handleStart, похоже, не имеет значения. Если я правильно понимаю проблему, достаточно вызвать метод WebAudioPlugin.playEmptySound?
Также смотрели на привязку события, пробуя mousedown/touchend вместо click, но результат тот же с 20-секундным ожиданием. Событие также, кажется, запускается дважды, хотя я мог бы, вероятно, углубиться в это, если бы смог заставить его работать правильно.
Мне известна статья о подходе к мобильному безопасному подходу, нацеленная на эту проблему, но необходимость в пространстве имен на этом уровне означала бы существенную переписку существующего контента. Может ли кто-нибудь посоветовать, если это абсолютно необходимо, чтобы принять этот подход? У меня сложилось впечатление, что это должно быть осуществимо, если правильно воспроизвести пустой звук в этом исходном обработчике.
На самом деле не могу получить основной проект до этого момента, но если я смогу получить рабочий пример, возможно, я буду на шаг ближе.
Любые мысли будут оценены!
1 ответ
Учебник по безопасному для мобильных устройств больше не актуален, так как обновления в 0.6.2. Вероятно, он будет обновлен или удален в ближайшем будущем.
- Вы никогда не должны
initializeDefaultPlugins()
, если вы не хотите воздействовать на результат (то есть, проверьте activePlugin, прежде чем что-то делать). Этот метод срабатывает автоматически при первой попытке зарегистрировать звук. playEmptySound
Также больше не нужно. SoundJS будет прослушивать первый mousedown/click документа и автоматически делать это в фоновом режиме.- сенсорные события не передаются напрямую со стадии EaselJS, а вместо этого превращаются в события мыши (touchstart=mousedown, touchmove=mousemove, touchend=pressup/click)
Исходя из этого, вы должны иметь возможность воспроизводить звук один раз в любом месте документа, нажав на который, независимо от того, слушаете ли вы его или нет.
Это не означает, что ошибки нет, просто шаги, которые вы предпринимаете, не должны быть необходимыми. Я провел некоторое тестирование, и, похоже, оно работает в iOS9. Вот упрощенная скрипка. http://codepen.io/lannymcnie/pen/xVGvvK