getUserMedia () работает правильно в последней версии iOS. Обычно 11.1 и более поздние версии подходят.
Чтобы устранить эту проблему, вам необходимо подключить устройство iOS к Ma c и использовать настройку удаленной отладки Safari. Таким образом вы можете получить консоль и отладчик javascript.
enumerateDevices () работает, если вы уже использовали getUserMedia (), чтобы запросить у пользователя разрешение на использование камеры и / или mi c. Без этого разрешения результаты emumerateDevices () расплывчаты или отсутствуют. Это сделано для предотвращения снятия отпечатков пальцев в браузере. Потому что cybercreeps.
В версиях iOS, где действительно работает getUserMedia, вам не нужно искать его в различных пространствах имен. navigator.mediaDevices.getUserMedia()
достаточно.
Вот код, подобный тому, который я использовал для перечисления медиа-источников на всех типах различных браузерных платформ, включая. iOS, Android и различные рабочие столы. Я использовал async / await
, потому что это простой способ обработать обещание, возвращаемое getUserMedia (). Но вы можете использовать Promise напрямую, если вы используете sh. (Обратите внимание, что я отредактировал этот код, чтобы удалить материалы, специфичные для приложения c, но я его не отлаживал.)
async function enumerateSources() {
if( navigator
&& navigator.mediaDevices
&& typeof navigator.mediaDevices.enumerateDevices === 'function' ) {
try {
/* open a generic stream to get permission to see devices;
* Mobile Safari insists */
const stream = await navigator.mediaDevices.getUserMedia(
{ video: true, audio: true} )
let devices = await navigator.mediaDevices.enumerateDevices()
const cameras = devices.filter( device => {
return device.kind === 'videoinput'
})
if (cameras.length >= 1) console.log ('cameras avail')
const mics = devices.filter( device => {
return device.kind === 'audioinput'
})
if (mics.length >= 1) console.log ('mics avail')
/* release stream */
const tracks = stream.getTracks()
if( tracks ) {
for( let t = 0; t < tracks.length; t++ ) tracks[t].stop()
}
return ({cameras, mics})
} catch(error) {
/* user refused permission, or media busy, or some other problem */
console.error(error.name, error.message)
return {cameras:[], mics:[]})
}
}
else throw ('media device stuff not available in this browser')
}