![](/img/trans.png)
[英]How to get access token from node-webkit for a desktop app without hosting page?
[英]How can I reset the WebRTC state in Chrome/node-webkit, without refreshing the page?
如何重置Chrome中的WebRTC組件狀態 - 無需重新加載頁面 - 當它們被踢入無效狀態時如何? 有關我如何復制此狀態的詳細信息,請參閱下文,以及為什么我這樣問:
嘗試在撥打電話時設置Ice Candidates時,我在Chrome 35 / node-webkit 0.10.0中收到以下錯誤:
無法在“RTCPeerConnection”上執行“addIceCandidate”:無法添加ICE候選項。
現在,我知道為什么會這樣。 我正在制作一個可以處理一些普通用戶濫用的ROBUST WebRTC應用程序。 要復制這種狀態,我基本上必須進行一些WebRTC調用然后快速殺死它們然后立即嘗試另一個調用。 我猜這必須將PeerConnection和其他組件放到一個不同的狀態,在那里它會發生B,但我重新開始用A.這可以通過以下錯誤消息證明:
無法設置會話描述:無法設置遠程應答sdp:調用錯誤狀態:STATE_INIT
現在,我們在互聯網上看到的大多數WebRTC演示,如http://apprtc.appspot.com ,都是無狀態的,瀏覽器經常刷新,導致重置DOM狀態。 因此,對於那些開發人員來說,答案很簡單。 只需重新加載頁面並將其稱為好。
目前,我必須在DOM進入此狀態時重新加載應用程序。 但是,這不是一個可接受的解決方案,因為我正在構建單頁應用程序 ,而不是網站 ,
我想知道是否有辦法調用API來告訴它重置拋出這些錯誤的狀態?
我嘗試了以下命令,從node-webkit(Chrome 35)中的JavaScript控制台,看看我是否可以手動重置PeerConnection的狀態,但它沒有幫助:
var properties = {};
properties.pcConfig = {
"iceServers": [{
"url": "stun:stun.l.google.com:19302"
}]
};
properties.pcConstraints = {
"optional": []
};
peerConn = new RTCPeerConnection(properties.pcConfig, properties.pcConstraints);
peerConn.close();
peerConn.signalingState --> "closed"
peerConn.iceConnectionState --> "closed"
peerConn.iceGatheringState --> "complete"
您應該能夠回滾更改。 這只能在角色未更改時發生,即第一次調用中的調用者仍然是后續調用中的調用者,並且在您的情況下可能不合適,因為您獲得的錯誤消息與對等連接接收有關在發出要約之前的答案(即來電者/被叫者之間的不匹配)。
請注意,關閉狀態是最終狀態,應刪除關閉的對等連接,因為它無法重用。
在您的情況下,刪除原始對等連接並創建一個新連接是必須的,但還不夠。 您需要重新發起握手,並確保不會捕獲和使用針對原始對等連接的消息,並由其他對等連接使用。 多方客戶具有相同的設計問題。 解決它的一種方法,也是解決眩光問題的方法是添加到“提供”,“回答”,“候選”消息,您可以離線交換“原點”和可能的“目標”字段。 您必須自己生成ID,因為默認情況下對等連接對象沒有唯一ID。
這是正常的舞蹈(有涓流ICE):
現在有問題的情況:
眩光案例:
請注意,此設計還允許多方調用,因為每個調用都將由映射隔離,並由消息傳遞邏輯路由。
function handleGenericMsg(msg){
if( msg.origin === username
) {
trace( 'MAIN - [' + username + '] Ignoring self message: ' + msg.type + '.' );
return;
}
switch(msg.type){
case 'offer':
offerHandler(msg);
break;
default:
trace( 'MAIN - [' + targetMid + '] Unsupported message received: ' + JSON.stringify(msg));
break;
}
};
function offerHandler( msg ){
var targetMid = msg.origin;
offer = new RTCSessionDescription(msg);
trace( 'PC - [' + targetMid + '] Received offer.' )
var pc = peerConnections[ targetMid ];
if( !pc ) {
openPeer( targetMid, false );
pc = peerConnections[ targetMid ];
} else {
// we already had a PC, let's reuse it
}
pc.setRemoteDescription( offer );
doAnswer( targetMid );
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.