浏览器兼容性检测,获取iOS版本,chrome版本,引导用户升级的提示,参考示例,最佳实践
浏览器兼容性检测 Demo 代码的功能点:
- 获取浏览器名称,检测是不是chrome浏览器
- 获取操作系统OS名称、版本号,对不兼容的iOS系统做提示
- iOS仅兼容 Safari 浏览器,不是 iOS 官方浏览器,做提示,引导用户使用推荐的浏览器
- chrome 版本低于 V101,做提示浏览器版本太低,引导用户升级 v101
- 单独对华为设备、系统做浏览器判断,建议使用华为官方的华为浏览器 (参考原因)
因为我的业务系统可以邀请用户使用指定环境、浏览器,所以我的浏览器要求是比较高的,您可以参考代码,再针对自己的情况做修改。
以下代码使用的开源库 "ua-parser-js": "1.0.37" (参考 demo 实现快速获取浏览器、系统名称+版本号等)
checkBrowser() {
const UAParser = require('ua-parser-js');
let result = UAParser();
console.log(result);
// https://github.com/faisalman/ua-parser-js/tree/1.0.35#documentation
/*
{
"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
"browser": {
"name": "Chrome",
"version": "122.0.0.0",
"major": "122"
},
"engine": {
"name": "Blink",
"version": "122.0.0.0"
},
"os": {
"name": "Windows",
"version": "10"
},
"device": {},
"cpu": {
"architecture": "amd64"
}
}
*/
let osName = result.os.name;
// 根据系统做判断
if (osName === 'iOS') return this.checkIOS(result);
if (osName === 'Mac OS') return this.checkMac(result);
// 华为手机
if (result.ua.toLowerCase().indexOf('huawei') > -1 && osName !== 'Windows') return this.checkHuaWei(result);
if (osName.startsWith('Android')) return this.checkAndroid(result);
if (osName === 'Windows') return this.checkWindows(result);
/* 浏览器兼容性判断-总体逻辑
*/
// 其他情况
let isGoodBrowser = result.browser.name === 'Chrome' && getMainVersion(result.browser.version) >= 101;
if (!isGoodBrowser) {
this.$alert('您的浏览器可能不兼容本系统,建议您使用 Chrome V101 以上版本访问,以免出现问题。');
return false;
}
return true;
},
checkIOS(result) {
if (getMainVersion(result.os.version) < 15) {
this.$alert('您的 iOS 版本太低,推荐使用 iOS 15.0 以上的 Safari 浏览器访问此系统,以免出现问题。');
return false;
} else if (result.browser.name !== 'Mobile Safari') {
this.$alert('您的浏览器可能不兼容本系统,建议您使用 Safari 访问,以免出现问题。');
return false;
}
return true;
},
checkMac(result) {
if (result.browser.name === 'Chrome') {
if (getMainVersion(result.browser.version) < 101) {
this.$alert('您的浏览器可能不兼容本系统,建议您使用 Chrome V101 以上版本访问,以免出现问题。');
return false;
}
} else {
this.$alert('您的浏览器可能不兼容本系统,建议您使用 Chrome V101 以上版本访问,以免出现问题。');
return false;
}
return true;
},
checkHuaWei(result) {
let isGoodBrowser = result.browser.name === 'Huawei Browser' && getMainVersion(result.browser.version) >= 14;
if (isGoodBrowser) return true;
this.$alert('您的浏览器可能不兼容本系统,建议您使用华为浏览器 V14.0 以上版本访问,以免出现问题。');
return false;
},
checkAndroid(result) {
if (result.browser.name === 'Chrome') {
if (getMainVersion(result.browser.version) < 101) {
this.$alert('您的浏览器版本太低,建议您使用 Chrome V101 以上版本访问,以免出现问题。');
}
return false;
} else {
this.$alert('您的浏览器可能不兼容本系统,建议您使用 Chrome V101 以上版本访问,以免出现问题。');
}
return true;
},
checkWindows(result) {
return this.checkMac(result);
}
以上的浏览器兼容性检测,我是写在 Vue 工程的 App.vue methods 里面的,因为全局都需要用,以后还需要 i18n 多语言、国际化,所以,直接放进 App.vue 里面了。
子、孙组件怎么快速调用 App.vue 根组件的 methods 方法呢?
子组件调用示例,比如 login.vue 路由中,登录之前告知用户浏览器的兼容性,给用户引导升级,就执行代码:this.$root.$children[0].checkBrowser()
setTimeout(() => { let checkBrowser = this.$root.$children[0].checkBrowser(); console.log('checkBrowser', checkBrowser); });
一些全局的弹窗对话框,这样实现,全局唯一,又能方便的调用,我觉得还是不错的。
华为使用 chrome 的webrtc bug:
WebRTC开发的时候,还遇到过问题:chrome 无法解码H264视频,H264编码的画面变成了黑屏画面。这时候的兼容性判断就需要做的更复杂,后来发现切换到华为浏览器v14才解决画面黑屏的bug。