【问题标题】:Cordova: Keep socket.io connection aliveCordova:保持 socket.io 连接处于活动状态
【发布时间】:2015-06-17 21:24:44
【问题描述】:

我目前正在使用 Ionic 框架开发一个 Apache Cordova 应用程序,该应用程序应该通过 WebSocket 与我的服务器通信,并且我使用 Socket.Io 库。现在我面临两个问题:

  1. 当应用程序进入后台(cordova pause 事件)时,例如通过主页或待机按钮,一段时间后,套接字关闭并且客户端断开连接。

    李>
  2. 当我通过 android 设备上的硬件后退按钮退出应用程序时,套接字甚至会立即关闭。

到目前为止我所尝试的:

  • socket.io.reconnect()socket.io.connect()disconnect 事件触发时

  • $scope 上的 $destroy 事件触发时相同(Ionic 在 AngularJS 之上工作)

基本上,我只想在用户启动应用程序后保持 WebSocket 连接处于活动状态,直到通过任务管理器或类似工具手动终止它。

我已经彻底搜索了这里的所有相关问题,但它们不适合我的情况。我真的需要这个东西来工作,如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 我不是 Cordova 专家,但如果您在本机 ADK 中开发此功能,我会说您必须更改您的设计而不需要在您的应用程序中打开一个套接字。 Android 可以并且会在需要时退出任何后台应用,在 JS 框架中开发的资源和应用也不例外。
  • 如果你不能使用GCM之类的东西,通常这应该是一个后台服务。 developer.android.com/training/run-background-service/… 不确定是否可以在科尔多瓦开发
  • @farshad90 我的应用程序没有立即关闭连接,相反,当应用程序没有响应时,服务器会在一段时间后关闭连接。如何在应用进入后台或退出后立即关闭连接?

标签: angularjs cordova socket.io ionic-framework


【解决方案1】:

一旦 Websocket 关闭,它就会被销毁。这样您就无法通过回调函数通知 websocket 关闭事件或无法从任何地方连接。

所以,我写了 reconnectSocket 并从另一个服务调用。

以另一个类的频率调用此 reconnectSocket。 (我每隔 5 秒 调用一次)。如果连接关闭,这将尝试连接。

private subject: WebSocket;

 reconnectSocket() {
    console.log('reconnecting socket call');

    if (this.subject.readyState == 3) {// If webs-socket closed
      this.subject.close();

      let ws = new WebSocket(CHAT_URL);
      let self = this;
      ws.onmessage = function (event) {
        self.listener(event.data);
      };
      ws.onerror = this.onError;
      ws.onclose = this.onClose;
      ws.onopen = this.onOpen;
      this.subject = ws;
      console.log("websocket reconnected");
    }

【讨论】:

    【解决方案2】:

    您应该使用 signalr 而不是 websocket,并在您的应用中使用 JavaScript 禁用硬件后退按钮。然后,在您的情况 1 和 2 中,连接应该能够保持活动状态。

    Signalr 也可以使用 Websocket,但实际上你不需要选择它,因为 Signalr 会为你选择最好的可用协议。

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 2021-09-13
      • 2013-08-27
      • 2019-09-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多