229 lines
6.9 KiB
TypeScript
229 lines
6.9 KiB
TypeScript
import React, { useEffect, useState } from "react";
|
||
|
||
interface AndroidCompatibilityInfo {
|
||
isAndroid: boolean;
|
||
androidVersion: number;
|
||
chromeVersion: number;
|
||
webViewVersion: number;
|
||
issues: string[];
|
||
suggestions: string[];
|
||
}
|
||
|
||
const AndroidCompatibilityCheck: React.FC = () => {
|
||
const [compatibility, setCompatibility] = useState<AndroidCompatibilityInfo>({
|
||
isAndroid: false,
|
||
androidVersion: 0,
|
||
chromeVersion: 0,
|
||
webViewVersion: 0,
|
||
issues: [],
|
||
suggestions: [],
|
||
});
|
||
|
||
useEffect(() => {
|
||
const checkAndroidCompatibility = () => {
|
||
const ua = navigator.userAgent;
|
||
const issues: string[] = [];
|
||
const suggestions: string[] = [];
|
||
let isAndroid = false;
|
||
let androidVersion = 0;
|
||
let chromeVersion = 0;
|
||
let webViewVersion = 0;
|
||
|
||
// 检测Android系统
|
||
if (ua.indexOf("Android") > -1) {
|
||
isAndroid = true;
|
||
const androidMatch = ua.match(/Android\s+(\d+)/);
|
||
if (androidMatch) {
|
||
androidVersion = parseInt(androidMatch[1]);
|
||
}
|
||
|
||
// 检测Chrome版本
|
||
const chromeMatch = ua.match(/Chrome\/(\d+)/);
|
||
if (chromeMatch) {
|
||
chromeVersion = parseInt(chromeMatch[1]);
|
||
}
|
||
|
||
// 检测WebView版本
|
||
const webViewMatch = ua.match(/Version\/\d+\.\d+/);
|
||
if (webViewMatch) {
|
||
const versionMatch = webViewMatch[0].match(/\d+/);
|
||
if (versionMatch) {
|
||
webViewVersion = parseInt(versionMatch[0]);
|
||
}
|
||
}
|
||
|
||
// Android 7 (API 24) 兼容性检查
|
||
if (androidVersion === 7) {
|
||
issues.push("Android 7 系统对ES6+特性支持不完整");
|
||
suggestions.push("建议升级到Android 8+或使用最新版Chrome");
|
||
}
|
||
|
||
// Android 6 (API 23) 兼容性检查
|
||
if (androidVersion === 6) {
|
||
issues.push("Android 6 系统对现代Web特性支持有限");
|
||
suggestions.push("强烈建议升级系统或使用最新版Chrome");
|
||
}
|
||
|
||
// Chrome版本检查
|
||
if (chromeVersion > 0 && chromeVersion < 50) {
|
||
issues.push(`Chrome版本过低 (${chromeVersion}),建议升级到50+`);
|
||
suggestions.push("请在Google Play商店更新Chrome浏览器");
|
||
}
|
||
|
||
// WebView版本检查
|
||
if (webViewVersion > 0 && webViewVersion < 50) {
|
||
issues.push(`WebView版本过低 (${webViewVersion}),可能影响应用功能`);
|
||
suggestions.push("建议使用Chrome浏览器或更新系统WebView");
|
||
}
|
||
|
||
// 检测特定问题
|
||
const features = {
|
||
Promise: typeof Promise !== "undefined",
|
||
fetch: typeof fetch !== "undefined",
|
||
"Array.from": typeof Array.from !== "undefined",
|
||
"Object.assign": typeof Object.assign !== "undefined",
|
||
"String.includes": typeof String.prototype.includes !== "undefined",
|
||
"Array.includes": typeof Array.prototype.includes !== "undefined",
|
||
requestAnimationFrame: typeof requestAnimationFrame !== "undefined",
|
||
IntersectionObserver: typeof IntersectionObserver !== "undefined",
|
||
ResizeObserver: typeof ResizeObserver !== "undefined",
|
||
URLSearchParams: typeof URLSearchParams !== "undefined",
|
||
TextEncoder: typeof TextEncoder !== "undefined",
|
||
AbortController: typeof AbortController !== "undefined",
|
||
};
|
||
|
||
Object.entries(features).forEach(([feature, supported]) => {
|
||
if (!supported) {
|
||
issues.push(`${feature} 特性不支持`);
|
||
}
|
||
});
|
||
|
||
// 微信内置浏览器检测
|
||
if (ua.indexOf("MicroMessenger") > -1) {
|
||
issues.push("微信内置浏览器对某些Web特性支持有限");
|
||
suggestions.push("建议在系统浏览器中打开以获得最佳体验");
|
||
}
|
||
|
||
// QQ内置浏览器检测
|
||
if (ua.indexOf("QQ/") > -1) {
|
||
issues.push("QQ内置浏览器对某些Web特性支持有限");
|
||
suggestions.push("建议在系统浏览器中打开以获得最佳体验");
|
||
}
|
||
}
|
||
|
||
setCompatibility({
|
||
isAndroid,
|
||
androidVersion,
|
||
chromeVersion,
|
||
webViewVersion,
|
||
issues,
|
||
suggestions,
|
||
});
|
||
};
|
||
|
||
checkAndroidCompatibility();
|
||
}, []);
|
||
|
||
if (!compatibility.isAndroid || compatibility.issues.length === 0) {
|
||
return null;
|
||
}
|
||
|
||
return (
|
||
<div
|
||
style={{
|
||
position: "fixed",
|
||
top: 0,
|
||
left: 0,
|
||
right: 0,
|
||
backgroundColor: "#fff3cd",
|
||
border: "1px solid #ffeaa7",
|
||
padding: "15px",
|
||
zIndex: 9999,
|
||
textAlign: "center",
|
||
fontSize: "14px",
|
||
maxHeight: "50vh",
|
||
overflowY: "auto",
|
||
}}
|
||
>
|
||
<div
|
||
style={{ fontWeight: "bold", marginBottom: "10px", color: "#856404" }}
|
||
>
|
||
🚨 Android 兼容性警告
|
||
</div>
|
||
|
||
<div style={{ marginBottom: "8px", fontSize: "12px" }}>
|
||
系统版本: Android {compatibility.androidVersion}
|
||
{compatibility.chromeVersion > 0 &&
|
||
` | Chrome: ${compatibility.chromeVersion}`}
|
||
{compatibility.webViewVersion > 0 &&
|
||
` | WebView: ${compatibility.webViewVersion}`}
|
||
</div>
|
||
|
||
<div style={{ marginBottom: "10px" }}>
|
||
<div
|
||
style={{ fontWeight: "bold", marginBottom: "5px", color: "#856404" }}
|
||
>
|
||
检测到的问题:
|
||
</div>
|
||
<div style={{ color: "#856404", fontSize: "12px" }}>
|
||
{compatibility.issues.map((issue, index) => (
|
||
<div key={index} style={{ marginBottom: "3px" }}>
|
||
• {issue}
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
|
||
{compatibility.suggestions.length > 0 && (
|
||
<div style={{ marginBottom: "10px" }}>
|
||
<div
|
||
style={{
|
||
fontWeight: "bold",
|
||
marginBottom: "5px",
|
||
color: "#155724",
|
||
}}
|
||
>
|
||
建议解决方案:
|
||
</div>
|
||
<div style={{ color: "#155724", fontSize: "12px" }}>
|
||
{compatibility.suggestions.map((suggestion, index) => (
|
||
<div key={index} style={{ marginBottom: "3px" }}>
|
||
• {suggestion}
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
)}
|
||
|
||
<div style={{ fontSize: "11px", color: "#6c757d", marginTop: "10px" }}>
|
||
💡 应用已启用兼容模式,但建议升级系统以获得最佳体验
|
||
</div>
|
||
|
||
<button
|
||
onClick={() => {
|
||
const element = document.querySelector(
|
||
'[style*="position: fixed"][style*="top: 0"]',
|
||
) as HTMLElement;
|
||
if (element) {
|
||
element.style.display = "none";
|
||
}
|
||
}}
|
||
style={{
|
||
position: "absolute",
|
||
top: "5px",
|
||
right: "10px",
|
||
background: "none",
|
||
border: "none",
|
||
fontSize: "18px",
|
||
cursor: "pointer",
|
||
color: "#856404",
|
||
}}
|
||
>
|
||
×
|
||
</button>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default AndroidCompatibilityCheck;
|