如何让原生 WebSocket 在 Android 4.03 及更高版本中工作
How to get native WebSockets to work in Android 4.03 and above?
我一直在使用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
版本到4.X版本仅通过Web-socket-js等Flash模拟器支持WebSockets。 希望4.1(ICS)将引入原生WebSocket支持。
也许是窗口。正在定义 WebSocket,因为您正在加载模拟器?
- 以ECMAScript 5及更高版本为目标时,八进制文字不可用
- 如何在ie7或更高版本中设置密码字段的占位符
- 有没有一种方法可以使用已经过时的jquery的Filtrify和需要更高版本jquery的bootstrap
- 使用JQuery和IE在悬停时高亮显示表行-所有版本
- Angular 1.2 到 1.3(或更高版本)形式 removeControll 和 addControll 问题
- 是否还需要更多(从高图表版本 4.0.4 开始)
- 如何让原生 WebSocket 在 Android 4.03 及更高版本中工作
- 如何添加指向 Fancybox 的链接以下载图像的高分辨率版本
- 使用 gzip 压缩大文件 - IE8 及更高版本
- 如何下载具有 Angular2 或更高版本的文件
- 如何使用 javascript 针对 IE9 及更高版本
- 如何在谷歌浏览器(v38及更高版本)/firefox(v33及更高版本)中使用Javascript关闭窗口
- 如何在 Angular 1.4 及更高版本中使用 ng-class 和 ng-options
- Angularjs 将空的 JSON 发送到服务器(仅在 IE 9 及更高版本中)
- 无法使用jQuery 1.9.1及更高版本上传ajax文件
- 使用JavaScript检测iOS 5或更高版本
- 代码适用于jquery 1.8.3,但不适用于1.9.1及更高版本
- 如何在Node.js0.11.8及更高版本中使用tlsSocket.regregate(选项、回调)
- 为android中的phonegap 2.3或更高版本解压缩插件
- jQuery脚本不适用于更高版本