如何让原生 WebSocket 在 Android 4.03 及更高版本中工作

How to get native WebSockets to work in Android 4.03 and above?

本文关键字:高版本 版本 工作 原生 WebSocket Android      更新时间:2023-09-26

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

=

更新=

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

例如:

   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.0.3 的 Android 设备似乎支持本机网络套接字,而其他设备则不支持。我正在尝试确定这种差异是否可能存在于 4.0.3 附带的设备与升级的设备之间。我现在首先检查是否支持闪存播放器,如果是,那么我使用它。如果没有,那么我会检查安卓版本。如果它大于 4.0,我建议用户尝试在 chrome 中加载网站。否则,如果窗口。WebSocket 已定义,我尝试使用它。

Chrome for Android 支持 WS (RFC6455) - 它可在 ICS 上使用,但不适用于标准浏览器。

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

WS (Hixie76) 在大多数 Android 设备上由 Opera Mobile 提供支持。

推动谷歌:

  • 使 Chrome for Android 在子 ICS 设备上可用
  • 将 Chrome for Android 设为默认浏览器

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

Android

版本到4.X版本仅通过Web-socket-js等Flash模拟器支持WebSockets。 希望4.1(ICS)将引入原生WebSocket支持。

也许是窗口。正在定义 WebSocket,因为您正在加载模拟器?