Ошибка: play() can only be initiated by a user gesture (мобильный Chrome)

275
20 мая 2018, 15:30

Делаем приложение через Ionic/Cordova; компилю на платформу browser; через библиотeку медиа пытаюсь запустить мелодию по событию (пришел заказ от клиента).

Столкнулся с такой проблемой: если PUSH работает нормально, то на попытку инициализировать звук когда открыто приложение через мобильный хром — ну ни как не получается. Вылетает такая ошибка:

Uncaught (in promise) DOMException: play() can only be initiated by a user gesture.

И да, я читал, что это такое и немного вот об этом и этом.

Понаходил советы, что нужно вызов проигрывания цеплять на click или другой жест. Но, при всех прочих, захожу в ВК с мобильного браузера, смотрю на страницу — мне присылают сообщение, и звук идёт (не от PUSH, а от браузера)!

Вопрос: как у них это получилось? И как мне сделать такое же (хотя бы в теории)?
Буду рад любым идеям. Спасибо.

Answer 1

Вы на полпути к решению, осталась только одна деталь - сохранение дом элемента audio для повторного использования.

Этот объект достаточно инициализировать лишь один раз в контексте пользовательского действия (нажатие или даже пролистывание), а затем использовать его везде где нужно запустить воспроизведение по произвольному событию.

Естественно на сайтах-одностраничниках такой "фокус" работает просто на ура, но не будет работать на сайтах которые перезагружают страницу полностью.

А также этот элемент после инициализации можно перемещать в DOM документа

Все вышесказанное относится как к сайту так и к приложению. Знаю что есть опция в настройках cordova разрешающая автовоспоизведение без взаимодействия с пользователем, но к сожалению она не на всех версиях android работает так как должна.

Answer 2
function initAudioItems(e) {
    if (e.originalEvent !== undefined) {
            var dom_item = document.getElementById('my_audio');
            dom_item.muted = true;
            dom_item.play()
                .catch(function(e) {
                    console.log(e);
                });
            dom_item.pause();
            dom_item.muted = false;
            $(dom_item).data('init', true);
        $('body').off('click', initAudioItems);
    }
}
// init audio
$('body').on('click', initAudioItems);

Если пользователь хоть раз кликнет на странице - аудио беззвучно запустится и остановится. После этого вы можете запускать его по произвольному событию.

Как ни старался не смог найти как такую инициализацию повесить на пролистывание, только на клик работает.

READ ALSO
String concatenation mongodb in array [требует правки]

String concatenation mongodb in array [требует правки]

I'm trying to convert array elements to new lines in the document, but I always get null values That's what I have now

220
Помогите пофиксить минус в плагине

Помогите пофиксить минус в плагине

Как можно пофиксить минус в плагине - Quantities and Units for WooCommerceНа добавление товара срабатывает, а минус - нет

234
Переход по ссылкам без перезагрузки

Переход по ссылкам без перезагрузки

Как переходить по ссылкам на сайте без её перезагрузке с помощью JavaScript?

234