Мое веб-приложение не может собрать кандидатов 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 соответствует следующим стандартам:
- https://w3c.github.io/webrtc-pc/webrtc.html
- https://tools.ietf.org/html/rfc7064
- https://tools.ietf.org/html/rfc7065
И я пробовал несколько вариантов параметров:
// 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, который стоит попробовать.