MediaRecorder не работает на некоторых айфонах

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

Подскажите, пожалуйста, в чем может быть проблема? У меня нет айфона и нет возможности отладить, посмотреть консоль на нем. Не знаю даже на что ругается.

Скрин с iphone

Ссылка на пример: https://marsurvey.ru/marina/ssi8/cgi-bin/test.html

Код функции записи голоса (убрала некоторые неважные куски кода, полный код можно посмотреть по ссылке в voice_record-v0.1.js):

function voiceRecord(pass, ques, testMode, recordName) {
  if (recordName === undefined) recordName = ques;

  var URL = '../voice_record/voice.php?pass=' + pass + '&q=' + recordName + '&testMode=' + testMode;

  if (navigator.mediaDevices === undefined) {
    navigator.mediaDevices = {};
  }
  if (navigator.mediaDevices.getUserMedia === undefined) {
    navigator.mediaDevices.getUserMedia = function(constraints) {
      var getUserMedia = (navigator.getUserMedia ||
        navigator.mozGetUserMedia ||
        navigator.msGetUserMedia ||
        navigator.webkitGetUserMedia);
      if (!getUserMedia) {
        return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
      }
      return new Promise(function(resolve, reject) {
        getUserMedia.call(navigator, constraints, resolve, reject);
      });
    }
  }

  if (navigator.mediaDevices.getUserMedia === undefined || MediaRecorder === undefined) {
    $("#" + ques + "_div .header2 .err").show()
  } else {
    $(".timer").val("00:00:00")
  }

  var mime = 'audio/webm';
  if (!MediaRecorder.isTypeSupported(mime)) {
    mime = 'audio/mp3'
  }
  if (!MediaRecorder.isTypeSupported(mime)) {
    mime = 'audio/wav'
  }
  if (!MediaRecorder.isTypeSupported(mime)) {
    mime = 'audio/ogg'
  }

  navigator.mediaDevices.getUserMedia({
      audio: true
    })
    .then(stream => {
      const mediaRecorder = new MediaRecorder(stream, {
        mimeType: mime
      });

      document.querySelector('#start').addEventListener('click', function() {
        if (!document.querySelector('#start').classList.contains("disabled")) {
          mediaRecorder.start();
          $('#start').addClass("disabled")
          $('#stop').removeClass("disabled")
          StartTime()
        }
      });
      let audioChunks = [];
      mediaRecorder.addEventListener("dataavailable", function(event) {
        audioChunks.push(event.data);
      });

      document.querySelector('#stop').addEventListener('click', function() {
        if (!document.querySelector('#stop').classList.contains("disabled")) {
          mediaRecorder.stop();
          $('#stop').addClass("disabled")
          $('#replay').removeClass("disabled")
          StopTime()
        }
      });

      document.querySelector('#replay').addEventListener('click', function() {
        if (window.confirm("Подтвердите, пожалуйста, что Вы хотите удалить эту запись и записать свой ответ заново.")) {
          if (!document.querySelector('#replay').classList.contains("disabled")) {

            $(".timer").val("00:00:00")

            if ($("audio").length == 1) {
              let src = $("audio").attr("src")
              let params = {
                src: src
              };

              (async() => {
                let promise = await fetch("../voice_record/remove.php", {
                  method: 'POST',
                  body: JSON.stringify(params)
                });
                if (promise.ok) {
                  let response = await promise.json();

                  $('#start').removeClass("disabled")
                  $('#replay').addClass("disabled")
                  $("#messages").empty()
                  $("#" + ques).val("")
                  console.log("remove: " + response.result);
                }
              })();
            }
          }
        }
      });

      mediaRecorder.addEventListener("stop", function() {
        const audioBlob = new Blob(audioChunks, {
          type: mime
        });

        let fd = new FormData();
        fd.append('voice', audioBlob);

        sendVoice(fd);
        audioChunks = [];
      });
    });

  async function sendVoice(form) {
    let promise = await fetch(URL, {
      method: 'POST',
      body: form
    });
    if (promise.ok) {
      let response = await promise.json();
      let audio = document.createElement('audio');
      audio.src = response.data + "#" + (new Date().getTime());
      audio.controls = true;
      audio.autoplay = false;
      document.querySelector('#messages').appendChild(audio);
      $("#" + ques).val(location.href.split('/cgi-bin')[0] + response.data.replace("..", ""))
    }
  };
}

Ответы (0 шт):