2016-11-01 19 views
21

Я делаю веб-приложение, которое использует WebRTC. Он отлично работает на настольных браузерах. Однако на небольшом веб-браузере смартфонов появляются нежелательные события:Как сохранить данные в формате WebRTC в открытой вкладке браузера браузера?

При переключении вкладок на браузере браузера Chrome для android и firefox для Android открыт открытый канал данных webrtc, созданный с .createDataChannel. Обработчик события dataChannel.onclose запускается. Как предотвратить закрытие канала данных? Если это невозможно, возможно ли открыть канал данных без перезапуска всей фазы сигнализации?

Это также происходит при просмотре для файла с <input type="file">

Я просмотрел StackOverflow немного и заметил, есть и другие вещи, которые спиливают/замедлился в неактивных вкладках, как requestTimeOut и setInterval.

Есть ли какая-либо авторизация, чтобы заставить ее оставаться открытой в фоновом режиме.

+2

Просто выстрел в темноте: попробуйте сохранить SDP и ICE кандидатов и выполнить фазу сигнализации снова, но с сохраненными данными вместо фактической сигнализации. – Kevin

+0

см. Здесь: https://www.webrtc-experiment.com/ –

+0

можете ли вы разместить код, пожалуйста, –

ответ

0

В сафари нет события, которое позволяет вам определить, приостановлена ​​ли табуляция, однако вы можете определить, будет ли вкладка повторно открываться через некоторое время, добавив регулярно повторяющуюся функцию, например, это простой пример -

 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); 
} 

можно использовать window.onunload, чтобы сохранить данные в datachannel на печенье, и если он вновь открывается по истечении времени, указанного в этой функции (10 секунд), то вы можете перезагрузить данные из печенья

надеюсь, что это помогло, mukund2003

+2

Вы ответили что-то еще. –

1

Один из способов заставить браузер поддерживать активную вкладку даже на заднем плане - использовать API веб-аудио. Действительно, любое приложение (например, музыкальный проигрыватель), воспроизводящее звук, должно оставаться в живых, что имеет смысл. Но это нестандартный взлом и, следовательно, не будущее доказательство. Поделитесь своими знаниями, если вам удастся найти другие способы.

2

Согласно MOZILLA документации WebRTC ..

Handling состояние канала изменяется

Обе наши локальные и удаленные сверстники использовать один метод для обработки событий, указывающих на изменение в состоянии соединения канала.

Когда местный сверстников испытывает открытое или близкое событие, метод handleSendChannelStatusChange() называется:

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; 
    } 
} 

}

Если состояние телеканала изменился на «открыть», что указывает, что мы завершили установление связи между двумя сверстниками. Пользовательский интерфейс обновляется соответствующим образом, предоставляя текстовое поле ввода для отправки сообщения, фокусируя поле ввода так, чтобы пользователь мог сразу начать вводить, позволяя кнопкам «Отправить» и «Отключить», теперь, когда они пригодны для использования, и отключение кнопки «Подключить», поскольку она не нужна, когда соединение открыто.

Если состояние изменилось на «закрыто», происходит противоположный набор действий: окно ввода и кнопка «Отправить» отключены, кнопка «Подключиться» включена, чтобы пользователь мог открыть новое соединение, если они хотите сделать это, и кнопка «Отключить» отключена, так как это не полезно, когда соединение отсутствует.

так пытаются играть с handleReceiveChannelStatusChange
Этот пример удаленного узла, с другой стороны, игнорирует события изменения состояния, для регистрации события на консоли, за исключением:

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

The handleReceiveChannelStatusChange () принимает в качестве входного параметра событие, которое произошло; это будет RTCDataChannelEvent.

+0

Я уже знаю это. В моем вопросе я сказал, что обработчик события dataChannel.onclose запущен, что означает, что у меня уже есть handleReceiveChannelStatusChange, который делает правильную вещь. Как предотвратить событие onclose? –

+0

, что скопировать пасту, хотя :), я думаю, 500 было слишком много –

+0

Не важно 500 :)) Надеюсь, ты решил! – CristiC777