在Cordova项目中检查原生Android浏览器中的WebSocket支持

Check for WebSocket support in native android browser in a cordova project

本文关键字:浏览器 WebSocket 支持 Android 原生 Cordova 项目 检查      更新时间:2023-09-26

我创建了一个Cordova项目,它将大量使用websockets。我已经设置了一些java类,这些类将在android平台上实现websockets,同时仍然能够以与本机实现相同的方式使用javascript中的websockets。这意味着,然后我有一个 websocket 对象及其方法 onopenonmessage 等等......

由于移动野生动物园(iPhone)已经支持websockets,我不必再次实现javascript部分(两个平台只有1个html/css/js源代码)。这意味着我必须编写一个函数来告诉我是否支持 android。

我有什么:

var supportsWebSockets = function() {
    if ('WebSocket' in window) {
        if (WebSocket.hasOwnProperty('onopen'))
            return true;
        else
            return false;
    } else {
        return false;
    }
}

但这并不能做到这一点。然后,我制作了一个脚本,它将输出 WebSocket 对象的所有方法和属性:

var obj = new WebSocket('ws://echo.websocket.org');
var methods = [];
for (var m in obj) {
    methods.push(m);
}
document.write(methods.join("<br>"));

这在android中输出的属性和方法与在移动野生动物园中相同。

我想这意味着,他们已经保留了带有空函数的命名空间。

然后,我将如何检查是否支持 WebSocket?我不想使用用户代理字符串来识别,因为我不想在具有最终支持的新版本到来时再次修改它。

奇怪的是以前没有人遇到过这个问题。

有什么想法吗?

好的,

所以我可以看到有评论的正确答案略有不同,我个人喜欢积极检查,所以会执行以下操作来检查浏览器是否支持使用 JavaScript 的 WebSockets...

if (typeof WebSocket === "function"){
    // implement WebSockets
} else {
    // fallback
}

另一个答案会在 Safari 中给出误报。我认为最好的方法是三件事的结合:

if ('WebSocket' in window
    && (typeof WebSocket === 'function' || typeof WebSocket === 'object')) {
    // supports WebSocket
} else {
    // does not support WebSocket
}