我一直在使用 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...");