2016-03-20 7 views
1

ExpressServerでNodeJSを使用して基本的なSocket.ioを実装しました。 (基本的には、Socket.ioのWebサイトにあるGetting Startedの例)携帯電話のsocket.io - デバイスのスリープを解除しないでください。ブラウザを閉じてタブを変更してください。

期待どおりにデスクトップに接続/切断されます。ページを参照すると、ソケットが接続されます。接続イベントは、クライアント側とサーバー側の両方で発生します。ユーザーがブラウザを閉じると、ソケットが切断されます。

モバイルでは、切断が期待どおりに機能しません。ページを参照すると、ソケットが接続し、イベントが発生します。ユーザー

  • は別のアプリ
  • にブラウザアプリ(SafariやAndroidのブラウザ)(ホームボタンを押す)
  • スイッチを閉じた場合でも、socket.ioは切断されません
  • 新しいタブを開きますデバイスをスリープ状態にします(スリープボタンを押して)

また、切断イベントはサーバーやクライアントで発生しません。

JavaScriptを使用してwindow.pagehideを使ってイベントを検出しようとしましたが、正しく起動していません。

ユーザーが携帯電話のページから離れたときにSocket.ioの接続を解除する方法を知っている人はいませんか。

ご迷惑をおかけして申し訳ございません。 Doruk

答えて

0

私が知る限り、モバイルブラウザでは「これ以上あなたを見ていない」と言うようなイベントはありません。

あなたがウェブページにハートビートを持ち、イベントが発生するたびにクライアントサイドストアを起動することもできますが、これを試してやることもできます。

私がチャットアプリを作ったとしましょう、すべてのメッセージに私の最新の活動時間で私の店を更新するでしょう。

またはウェブページをクリックすると、そのアクティビティの時間を節約するために店舗が更新されます。

次に、何らかのハートビートを行ったサーバーまたはクライアントのいずれかがあります。

サーバーでクライアントにpingを実行したが、最後のアクティビティが何であるかを確認したい場合は、10分以上経過した場合は切断します。その後、あなたは "あなたに再接続しますか?"というような質問をするモーダルを開くことができます。 [はい]をクリックすると、ソケットが再起動します。

または:

あなたは、クライアント上に置くと、ちょうどそれが10分以上であればその店は、最後のアクティブ化されていたかどうかを確認するために30秒ごとにチェックする間隔を持って、ソケットとフラグ外しができモーダルメッセージ "あなたは再接続しますか?"

また、新しいページの読み込みやメッセージの入力時に再接続イベントを発生させ、モーダルをスキップしてよりシームレスにすることもできます。

+0

window.onblurとwindow.onpagehideの2つのイベントがあります。しかし、Androidではうまく実装されていません。また、Socket.ioにはbult-inハートビートメカニズムがあり、接続が開いている間は50msごとにソケット接続を介してデータを送信します。だから私は、クライアントがアイドルであるかどうかを検出するために接続を使用することはできません。私はもっ​​と研究:) –

1

調査の結果、ページがまだ表示されているかどうかを検出する素晴らしいJSライブラリが見つかりました。ユーザーが歩き回った場合。またはページが一定期間アイドル状態であっても。

ライブラリは、それは次のよう

  • は別のアプリ
  • にブラウザアプリ
  • スイッチ内の別のタブにブラウザアプリ
  • スイッチを閉じて検出しifvisible.js(https://github.com/serkanyersen/ifvisible.js/

    です

  • デバイスをスリープ状態にする(*)

これらはすべてAndroidの最後の項目を除いて、iOSとAndroidの両方で動作します。古いAndroid搭載端末では、このイベントは検出されません。私は長いアイドルタイムアウトを代わりに使用しています。

これらのイベントの助けを借りて、手動でソケットを切断します。

関連する問題