Привет всем! У меня возникла проблема с получением локального IP-адреса клиента (типа 192.168.1.10) в Safari 11 через WebRTC API. Тот же код работает нормально в Chrome и Firefox, но в Safari не выдает результатов.\n\nЯ пробовал использовать стандартный подход с RTCPeerConnection
, создавая фиктивный канал данных и прослушивая события onicecandidate
. Однако, похоже, что ice.candidate
не определяется в Safari.\n\nКто-нибудь сталкивался с подобной проблемой? Может быть, существуют альтернативные способы получить IP-адрес клиента в Safari? Буду благодарен за любые идеи и советы!\n\njavascript\nfunction getClientIP(callback) {\n const peerConn = new (window.RTCPeerConnection || window.webkitRTCPeerConnection)({\n iceServers: []\n });\n\n peerConn.createDataChannel('');\n peerConn.createOffer().then(offer => peerConn.setLocalDescription(offer));\n\n peerConn.onicecandidate = (event) => {\n if (event.candidate) {\n const ipMatch = event.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3})/);\n if (ipMatch) {\n callback(ipMatch[1]);\n }\n }\n };\n}\n\ngetClientIP(ip => console.log('IP адрес:', ip));\n
\n\nЭтот код должен работать, но в Safari он не выдает IP. Что я делаю не так?
К сожалению, Safari действительно блокирует доступ к локальным IP через WebRTC. Это сделано намеренно для защиты приватности. Альтернативных способов получить IP клиента на фронтенде в Safari просто нет.
Если это критично для вашего приложения, придется использовать серверную часть. Можно отправить запрос на сервер, который вернет IP пользователя из заголовков. Но учтите, что это будет внешний IP, а не локальный.
В целом, я бы посоветовал пересмотреть архитектуру приложения, чтобы не зависеть от клиентского IP. Это ненадежный подход с точки зрения безопасности.
Да, с Safari такая проблема есть. Может, стоит попробовать другой подход? Например, использовать API геолокации для определения примерного местоположения. Или сделать запрос на свой сервер, который вернет IP из заголовков. Конечно, это будет внешний адрес, но иногда и такой вариант подходит. А вообще, зачем вам именно локальный IP? Может, есть способ решить вашу задачу как-то иначе?