2016-11-01 5 views
21

Ich mache eine Webanwendung, die WebRTC verwendet. Es funktioniert gut auf Desktop-Browsern. Jedoch auf einem kleinen Smartphone-Webbrowser gibt es unerwünschte Ereignisse:Wie WebRTC dataChannel im inaktiven Browser-Browser-Tab geöffnet bleibt?

Beim Wechseln der Tabs auf dem mobilen Webbrowser Chrome für Android und Firefox für Android, ein offener webrtc Datenkanal, der mit .createDataChannel erstellt wird, schließt. Der Ereignishandler dataChannel.onclose wird ausgelöst. Wie kann verhindert werden, dass der Datenkanal schließt? Wenn das nicht möglich ist, ist es möglich, den Datenkanal erneut zu öffnen, ohne die gesamte Signalisierungsphase neu zu starten?

auch Dies geschieht, wenn eine Datei mit Surfen <input type="file">

ich durchsuchte einen Stackoverflow-Bit und bemerkte, es gibt andere Dinge, die in inaktiv Tabs wie requestTimeOut und setInterval abgeholzt/verlangsamte.

Ist eine Autorisierung erforderlich, damit sie im Hintergrund offen bleibt?

+2

Nur ein Versuch im Dunkeln: Versuchen Sie, die SDPs und ICE-Kandidaten zu speichern, und führen Sie die Signalisierungsphase erneut durch, jedoch mit den gespeicherten Daten anstelle der tatsächlichen Signalisierung. – Kevin

+0

bitte hier klicken: https://www.webrc-experiment.com/ –

+0

können Sie den Code bitte –

Antwort

0

Es gibt kein Ereignis in Safari, mit dem Sie erkennen können, ob die Registerkarte pausiert ist. Sie können jedoch feststellen, ob die Registerkarte nach einiger Zeit wieder geöffnet wird, indem Sie eine regelmäßig wiederkehrende Funktion eingeben -

 var beforeTime = new Date.getTime(); 
     var getTime = function() { 
     var timeNow = new Date.getTime       
     if (timeNow - beforeTime > 1000) { 
      console.log("Woken Up)"; 
    } 
     beforeTime = nowTime; 
     setTimeout(getTime, 500); 
} 

Sie window.onunload verwenden, können das Datenkanal-Daten auf einem Cookie zu speichern und wenn es nach der Zeit in dieser Funktion angegeben wieder öffnet (10 Sekunden), dann können Sie die Daten aus dem Cookie

nachladen hoffe, es hat geholfen, mukund2003

+2

Sie haben etwas anderes beantwortet. –

1

Eine Möglichkeit, den Browser dazu zu zwingen, eine Registerkarte auch im Hintergrund vollständig aktiv zu halten, ist die Verwendung der Web Audio-API. In der Tat muss jede Anwendung (z. B. Musikabspielgerät), die Ton spielt, am Leben erhalten werden, was sinnvoll ist. Aber das ist ein Nicht-Standard-Hack und daher nicht zukunftssicher. Teilen Sie Ihr Wissen, wenn Sie andere Wege finden.

2

Nach mozilla Dokumentation von WebRTC ..

Kanalstatus Handhabung ändert

Sowohl unsere lokalen und Remote-Peers eine einzige Methode verwenden, um Ereignisse zu handhaben eine Änderung des Status der Verbindung des Kanals angibt.

Wenn der lokale Peer ein Öffnen oder Schließen Ereignis erfährt, wird die handleSendChannelStatusChange() -Methode aufgerufen:

function handleSendChannelStatusChange(event) { 
if (sendChannel) { 
    var state = sendChannel.readyState; 

    if (state === "open") { 
    messageInputBox.disabled = false; 
    messageInputBox.focus(); 
    sendButton.disabled = false; 
    disconnectButton.disabled = false; 
    connectButton.disabled = true; 
    } else { 
    messageInputBox.disabled = true; 
    sendButton.disabled = true; 
    connectButton.disabled = false; 
    disconnectButton.disabled = true; 
    } 
} 

}

Wenn der Zustand des Kanals hat sich geändert „offen“, das wir anzeigt haben die Verbindung zwischen den beiden Peers hergestellt. Die Benutzeroberfläche wird entsprechend aktualisiert, indem das Texteingabefeld für die zu sendende Nachricht aktiviert wird. Dabei wird das Eingabefeld so ausgerichtet, dass der Benutzer sofort mit dem Schreiben beginnen kann. Die Schaltflächen "Senden" und "Trennen" können jetzt verwendet werden. und deaktivieren Sie die Schaltfläche "Verbinden", da sie nicht benötigt wird, wenn die Verbindung geöffnet ist.

Wenn sich der Status zu "geschlossen" geändert hat, werden die folgenden Aktionen ausgeführt: Das Eingabefeld und die Schaltfläche "Senden" sind deaktiviert, die Schaltfläche "Verbinden" ist aktiviert, sodass der Benutzer eine neue Verbindung öffnen kann möchten, und die Schaltfläche "Disconnect" ist deaktiviert, da es nicht sinnvoll ist, wenn keine Verbindung besteht.

so versuchen, mit handleReceiveChannelStatusChange
Dieses Beispiel Remote-Peer, auf der anderen Seite zu spielen, ignoriert die Statusänderung Ereignisse, mit Ausnahme der Veranstaltung an die Konsole Anmeldung:

function handleReceiveChannelStatusChange(event) { 
     if (receiveChannel) { 
       console.log("Receive channel's status has changed to " + 
       receiveChannel.readyState); 
    } 
} 

The handleReceiveChannelStatusChange () Methode erhält als Eingabeparameter das aufgetretene Ereignis; Dies wird ein RTCDataChannelEvent sein.

+0

Das weiß ich schon. In meiner Frage habe ich gesagt, dass der Ereignishandler dataChannel.onclose gefeuert wird, was bedeutet, dass ich bereits einen handleReceiveChannelStatusChange habe, der das Richtige tut. Wie verhindere ich, dass das onclose-Ereignis eintritt? –

+0

dass kopieren einfügen obwohl :), ich denke, 500 war zu viel –

+0

Macht nichts 500 :)) Ich hoffe, Sie haben gelöst! – CristiC777

Verwandte Themen