2

我一直在使用 web-socket-js 来支持跨设备的 websocket。在所有 IOS 设备上运行良好,因为它们具有本地 web-socket 支持,并且在安装了 flash 时在 android 设备中运行相当一致。现在,Android ICS 4.03 及更高版本声称支持原生网络套接字。Window.WebSocket 已定义,但我没有打开套接字。有谁知道为什么?ICS 原生 websocket 有什么问题?他们使用什么协议?有没有人提出更好的解决方案?

=更新=

有一种 hacky 方法可以确定 websocket 是否真的有效,然后回退到 flash。为此,您必须更改 web-socket-js 代码以检查它是否是 android 客户端。然后,在使用 web-socket 之前,尝试连接到本地机器上的一个端口。然后检查 websocket 的协议属性。如果已定义,那么您最好使用本机,否则回退到 Flash。仍在寻找更好的方法,但这是我现在使用的 hack:

例如:

   var isAndroid = navigator.userAgent.match(/Android/i) != null;
   var isChrome = navigator.userAgent.match(/Chrome/i) != null;

   // assume if its safari, that they use normal websockets.
   if ( isChrome || (!isAndroid && window.WebSocket)) {
          logger.log("Will attempt to use Websockets natively. 1");
          return;
   }


   // check if we need a websocket fallback
   //if (window.WebSocket && !window.WEB_SOCKET_FORCE_FLASH) {
   if ( isAndroid ) {
          try {
                 var testSock = new window.WebSocket("ws://localhost:1474");
                 if (testSock.protocol != undefined) {
                       testSock.close();
                       logger.log("Will attempt to use Websockets natively. 2");
                       return;
                 } else {
                       // use flash
                 }
          } catch (e) {
                 // if there was an error we need to use the flash fallback.
          }
   }

   logger.log("Native Websockets unavailable, trying Flash fallback...");
4

4 回答 4

4

因此,事实证明,我的问题中提到的黑客实际上并不总是有效。一些 4.0.3 的 android 设备似乎支持本机 web-sockets,而其他设备不支持。我正在尝试确定这种差异是否存在于 4.0.3 附带的设备和升级的设备之间。我现在先检查是否支持 Flash 播放器,如果支持则使用它。如果没有,那么我检查android版本。如果它大于 4.0,我建议用户尝试在 chrome 中加载网站。否则,如果定义了 window.WebSocket,我会尝试使用它。

于 2012-10-29T14:31:47.987 回答
2

Chrome for Android 支持 WS (RFC6455) - 它在 ICS 及更高版本上可用,但不是标准浏览器。

至少 ARMv7 的 Android 设备上的 Firefox Mobile 支持 WS (RFC6455)。

大多数 Android 设备上的 Opera Mobile 都支持 WS (Hixie76)。

推动谷歌:

  • 使 Chrome for Android 在子 ICS 设备上可用
  • 将 Android 版 Chrome 设为默认浏览器
于 2012-06-29T09:48:16.823 回答
1

伙计们,不要忘记在模拟设备时,避免在 android 项目的 config.xml 中定义“localhost”来访问本地运行的 WS-Server。使用转换为 127.0.0.1 的定义的 10.0.2.2 地址(并​​确保您的 WS-Server 响应它)。http://developer.android.com/tools/devices/emulator.html#emulatornetworking

于 2013-03-15T12:05:28.050 回答
0

通过 4.X 的 Android 版本仅通过像web-socket-js这样的 Flash 模拟器支持 WebSockets希望 4.1 (ICS) 将引入本机 WebSocket 支持。

也许window.WebSocket正在定义,因为您正在加载模拟器?

于 2012-06-28T20:32:25.883 回答