Как инициализировать 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

Другие вопросы по тегам