เว็บแอปพลิเคชันของฉันไม่สามารถรวบรวมผู้สมัคร ICE ถ่ายทอด WebRTC ผ่านเซิร์ฟเวอร์ CoTURN เมื่อใช้ Safari 11 บน iOS 11 (iPhone 5s และ iPhone 7) หรือเดสก์ท็อป เว็บแอปพลิเคชัน (ซึ่งสร้างการเชื่อมต่อเพียร์ WebRTC แบบเสียงทางเดียวเท่านั้น) ทำงานได้ดีระหว่างเบราว์เซอร์จริง (Chrome และ Firefox) ไม่ว่าจะโดยตรงหรือผ่านการถ่ายทอด CoTURN และโดยปกติแล้วฉันจะได้ตัวเลือก ICE 6-15 ตัวบนเบราว์เซอร์เหล่านี้
ฉันมีการเรียก (ตรงไปตรงมาและไม่จำเป็น) เพื่อ getUserMedia ทางฝั่งรับซึ่งอนุญาตให้ผู้สมัครโฮสต์ ICE สร้างโดย Safari (หมายเหตุ... ผู้ใช้ ต้อง อนุมัติการเข้าถึงเสียงและ/หรือวิดีโอก่อนที่ 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 Dictionary สำหรับ 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 (เปรียบเทียบผู้สมัคร ICE 6 กับ 2 คน) การเปลี่ยนแปลงสถานะอ้างถึง 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 Dictionary ที่ใช้งานได้หรือเซิร์ฟเวอร์ TURN ที่ได้รับการพิสูจน์แล้วให้ลองใช้ก็ตาม