Я пытаюсь получить доступ к микрофону в iOS Safari с помощью getUserMedia. Ниже вы можете найти фрагмент моего кода.
if (navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = function(constraints) {
// First get ahold of the legacy getUserMedia, if present
let getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
// Some browsers just don't implement it - return a rejected promise with an error
// to keep a consistent interface
if (!getUserMedia) {
return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
}
// Otherwise, wrap the call to the old navigator.getUserMedia with a Promise
return new Promise(function(resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
}
}
navigator.mediaDevices.getUserMedia({
audio: true
}).then(function(stream) {
successCallBack(.......);
}).catch(function(error) {
debug.log(error);
..........
});
Тем не менее, обещание всегда ловит ошибку, а точнее - OverConstraintError.
{message: "Invalid constraint", constraint: ""}
Это поведение уникально для iOS Safari, во всех других браузерах (Chrome, Firefox, Safari osX) оно работает без каких-либо проблем. На самом деле моя проблема похожа на эту: => Как решить проблему iOS 11 Safari getUserMedia «Недопустимое ограничение» , но я не пытаюсь использовать камеру. Меня интересует только микрофон.
Я тестирую на реальном iPhone (5 и X, оба обновлены до последней версии), поэтому он не связан с симулятором iPhone.
Доступ к микрофону предоставлен, и всплывающее окно с запросом разрешений также отображается, поэтому это не проблема с разрешениями.