iOS และ Safari 11 WebRTC ไม่รวบรวมผู้สมัคร STUN/TURN Trickle ICE

เว็บแอปพลิเคชันของฉันไม่สามารถรวบรวมผู้สมัคร 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 ของฉันสอดคล้องกับมาตรฐานต่อไปนี้:

และฉันได้ลองใช้พารามิเตอร์หลายรูปแบบ:

// 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 ที่ได้รับการพิสูจน์แล้วให้ลองใช้ก็ตาม


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 ได้อย่างไร ไม่มีเอกสารประกอบเกี่ยวกับการรองรับ WebRTC ครึ่งทางของ Apple ฉันยังต้องเปลี่ยนรหัสแอปพลิเคชันอีกครั้งในวันอื่นเพื่อเพิ่มปุ่มเล่นเพื่อให้ผู้ใช้คลิกเพื่อหลีกเลี่ยงการปฏิเสธสัญญาล็อคใหม่   -  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