我一直在使用 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/