Как я могу запросить разрешение пользователя на аудио в Chrome?

Я работаю над решением SAAS, и мне нужно, чтобы клиенты получали звуки уведомлений из приложения. Даже если они просто запустили его без какого-либо взаимодействия с ним. Google изменил поведение Chrome в отношении этого аспекта, и теперь пользователю необходимо щелкнуть веб-страницу, чтобы услышать звуки уведомлений. Я обнаружил, что здесь можно явно разрешить звуки:

введите описание изображения здесь

а затем пользователь должен явно включить звуки для ваших веб-сайтов:

введите описание изображения здесь

Теперь пользователю не нужно будет нажимать, чтобы включить звуковые уведомления. Мой вопрос: возможно ли запросить разрешение пользователя на звук так же, как мы делаем это для микрофона:

введите описание изображения здесь


person Stepan Yakovenko    schedule 07.12.2019    source источник


Ответы (1)


Просто сделайте свое собственное модальное оповещение. Вы можете определить, требуется это или нет, пытаясь воспроизвести звук при отключенном звуке.

const audio = new Audio( 'https://dl.dropboxusercontent.com/s/h8pvqqol3ovyle8/tom.mp3' );
audio.muted = true;

const alert_elem = document.querySelector( '.alert' );

audio.play().then( () => {
  // already allowed
  alert_elem.remove();
  resetAudio();
} )
.catch( () => {
  // need user interaction
  alert_elem.addEventListener( 'click', ({ target }) => {
    if( target.matches('button') ) {
      const allowed = target.value === "1";
      if( allowed ) {
        audio.play()
          .then( resetAudio );
      }
      alert_elem.remove();
    }
  } );
} );

document.getElementById( 'btn' ).addEventListener( 'click', (e) => {
  if( audio.muted ) {
    console.log( 'silent notification' );
  }
  else {
    audio.play();
  }
} );

function resetAudio() {
  audio.pause();
  audio.currentTime = 0;
  audio.muted = false;
}
.alert {
  font: 14px Arial, sans-serif;
  position: fixed;
  top: 0;
  left: 0;
  background: white;
  border: 1px solid lightgray;
  box-shadow: 3px 3px 12px lightgray;
}
p { margin: 12px; }
.alert .buttons {
  float: right
}
<div class="alert">
  <p>This webpage would like to play sounds</p>
  <p class="buttons">
    <button value="0">Block</button>
    <button value="1">Allow</button>
  </p>
</div>
<button id="btn">trigger notification</button>


Ps: обратите внимание, что в спецификациях API разрешений есть значение "speaker", но это для разрешения устройств через метод HTMLMediaElement.setSinkId(), который является еще одним зверем. (вы можете увидеть этот вопрос/ответ, если вам интересно в этой еще не реализованной функции).

person Kaiido    schedule 24.12.2019
comment
это заставит моего пользователя щелкать каждый раз, когда он открывает браузер, верно? - person Stepan Yakovenko; 24.12.2019
comment
Только когда нужно. Если они уже разрешили ваш сайт навсегда, они не получат сообщения. Невозможно установить это постоянное разрешение из веб-API, так что это лучшее, что вы можете сделать, что не так уж плохо... - person Kaiido; 24.12.2019
comment
Можно ли сделать то же самое для Safari и Firefox? Они не перестают играть, как Chrome, поэтому код «поймать» никогда не запускается… - person Anderson Fagionato; 22.04.2020
comment
Политики автоматического воспроизведения Chrome уникальны: developers.google.com/web/ обновления/2017/09/ - person Prashant Singhal; 20.05.2020
comment
эй, этот ответ полезен, но не могли бы вы объяснить, как воспроизводить звуки при автозапуске, не нажимая кнопку? - person Smooth Neon; 06.07.2021