javascript - 如何让 native WebSockets 在 Android 4.03 及更高版本中工作?

标签 javascript android html mobile websocket

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

=更新=

有一种 hacky 方法可以确定 websocket 是否真正工作,然后回退到 flash。为此,您必须更改 web-socket-js 代码以检查它是否是 android 客户端。然后,在使用网络套接字之前,尝试连接到本地机器上的端口。然后检查 websocket 的协议(protocol)属性。如果已定义,那么您最好使用原生,否则退回到闪存。仍在寻找更好的方法,但这是我现在使用的技巧:

例如:

   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...");

最佳答案

因此,事实证明,我的问题中提到的 hack 实际上并不总是有效。一些带有 4.0.3 的 android 设备似乎支持 native 网络套接字,而其他设备则不支持。我试图确定这种差异是否可能出现在 4.0.3 附带的设备和升级后的设备之间。我现在首先检查是否支持 Flash Player,如果支持,我就使用它。如果没有,那么我检查android版本。如果它大于 4.0,我建议用户尝试在 chrome 中加载站点。否则,如果定义了 window.WebSocket,我会尝试使用它。

关于javascript - 如何让 native WebSockets 在 Android 4.03 及更高版本中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11246846/

相关文章:

android - 我的手机(和某些应用程序)如何知道要附加到我的通讯录中的号码的国家/地区代码前缀(例如 +1、+505、+49...)

安卓对话框

javascript - 有没有办法与 css 加载并行加载图像?

javascript - JSDOM:删除一次嵌套的 block 引用但留下 2+ 嵌套的 block 引用

android - OpenGL ES 2.0 : Filling in a Sphere instead of it being wireframe

javascript - 基于使用 php 的另一个选择进行选择不工作

javascript - 使用 SSR 支持根据断点更改 Prop

javascript - mustache JS : fill multiple divs with different content

html - 如何使一组图像与 CSS 中的中心对齐?

javascript - 滚动到时播放 HTML5 视频,然后播放至完成且仅播放一次