iOS и Safari 11 WebRTC не собирает кандидатов STUN / TURN Trickle ICE

Мое веб-приложение не может собрать кандидатов ICE-ретранслятора WebRTC через сервер CoTURN при использовании Safari 11 на iOS 11 (iPhone 5s и iPhone 7) или на рабочем столе. Веб-приложение (которое устанавливает одностороннее одноранговое соединение WebRTC только для аудио) отлично работает между реальными браузерами (Chrome и Firefox) либо напрямую, либо через ретранслятор CoTURN, и я обычно получаю 6-15 кандидатов ICE в этих браузерах.

У меня есть (откровенно говоря, ненужный) вызов getUserMedia на принимающей стороне, который позволяет Safari создавать кандидатов на хост ICE. (Примечание ... пользователь должен одобрить доступ к аудио и / или видео, прежде чем Safari предоставит хосту Ice Candidates, даже если на стороне приема. Я преодолел это препятствие, но вы тоже не попадется ... Это из соображений "конфиденциальности".). До того, как я добавил разрешить getUserMedia, я не получил ICE. Сейчас я получаю двух кандидатов. Один с частным IPv4, а другой с IPv6. Этого достаточно, чтобы приложение работало правильно на том же компьютере или в локальной сети. Так что я вполне уверен в других частях кода приложения. Я не уверен, связана ли моя проблема с кодом приложения или с сервером CoTURN.

Пример полученных кандидатами ICE:

{"candidate":{"candidate":"candidate:622522263 1 udp 2113937151 172.27.0.65 56182 typ host generation 0 ufrag r23H network-cost 50","sdpMid":"audio","sdpMLineIndex":0,"usernameFragment":"r23H"}}

Я почти уверен, что словарь RTCIceServer для моего RTCPeerConnection соответствует следующим стандартам:

И я пробовал несколько вариантов параметров:

// For Example:
var RPCconfig = {
    iceServers: [{ 
        urls: "turn:Example.live",
        username: "un",
        credential: "pw"
        }] 
     };

// Or:    
var RPCconfig = {
    iceServers: [{ 
        urls: "turns:Example.live",
        username: "un",
        credential: "pw",
        credentialType: "password"
        }, {
        urls: "stun:Example.live"
        }] 
    };

// And even more desperate attempts...
var RPCconfig = {
    iceServers: [{ 
        urls: "turn:Example.live?transport=tcp",
        username: "un",
        credential: "pw",
        credentialType: "password"
        }] 
};

Вот пример журнала процесса сигнализации, чтобы понять, что происходит. Это от принимающей стороны, то есть Safari 11. Другим браузером был Chrome (сравните 6 против 2 кандидатов на ICE). Изменение состояния относится к oniceconnectionstatechange.

SDP Offer received. 
Sending signal SDP 
Sending signal IceCandidate
Sending signal IceCandidate 
ICE Candidate Received 
4:08:25 AM State Change -> checking 
ICE Candidate Received 
ICE Candidate Received 
ICE Candidate Received 
ICE Candidate Received 
ICE Candidate Received
4:08:40 AM State Change -> failed

Насколько мне известно, CoTURN настроен довольно свободно с точки зрения принятия всех возможных методов транспортировки. Он хорошо работает для предоставления кандидатов ICE и в качестве ретранслятора для других браузеров.

Приветствуется любое направление. Даже если это всего лишь образец кода словаря RTCIceServer, который работает, или проверенный сервер TURN, который стоит попробовать.


person Justin    schedule 06.10.2017    source источник
comment
У меня тоже было много проблем с этим. Если вы найдете решение, сообщите об этом !. Я сделаю то же самое. В качестве побочного примечания, использование устаревших параметров, например (offerToReceiveAudio: 1), как известно, вызывает такое поведение, но в новом адаптере adapter.js это скрыто. К сожалению, проблема все еще существует, несмотря на удаление устаревших опций.   -  person Geige V    schedule 04.11.2017
comment
Я не думаю, что проблема в сервере TURN. Я думаю, что это как-то связано с тем, как сеть работает в определенных сетях, потому что я добился успеха, прежде всего, с сотовыми данными. Я думаю, мне нужно заставить его использовать TCP, но я не уверен, обращает ли Safari на это внимание, и я не уверен, как просматривать внутреннюю версию WebRTC в Safari. Документация о том, что Apple наполовину поддерживает WebRTC, не существует. На днях мне также пришлось снова изменить код приложения, чтобы добавить кнопку воспроизведения, которую пользователь мог бы щелкнуть, чтобы обойти отказ от нового обещания блокировки.   -  person Justin    schedule 05.11.2017
comment
@GeigeV Вы когда-нибудь в этом разбирались? Я заметил, что когда мое приложение WebRTC работает в Safari в IOS 12, оно зависает при попытке установить кандидатов ICE.   -  person    schedule 09.03.2019
comment
У меня также возникает аналогичная проблема, но иногда разница в том, что другие типы кандидатов ICE также возвращаются из Trickle ICE, поэтому я могу иметь соединение (но это происходит не всегда). Действительно смущен таким поведением Safari   -  person Humoyun Ahmad    schedule 28.05.2020