smart-home/smart-home-app/utils/permissionChecker.js
2026-02-26 09:16:34 +08:00

323 lines
7.5 KiB
JavaScript

/**
* 权限检查和引导工具
* 专门用于检查Android设备的网络和位置权限
*/
/**
* 检查网络相关权限
*/
export async function checkNetworkPermissions() {
console.log('🔍 开始检查网络权限...')
const permissionStatus = {
location: null,
wifi: null,
network: null,
recommendations: []
}
try {
// 检查位置权限
permissionStatus.location = await checkLocationPermission()
// 检查WiFi信息获取能力
permissionStatus.wifi = await checkWifiInfoAccess()
// 检查网络连接状态
permissionStatus.network = await checkNetworkAccess()
// 生成权限建议
permissionStatus.recommendations = generatePermissionRecommendations(permissionStatus)
} catch (error) {
console.error('❌ 权限检查异常:', error)
permissionStatus.error = error
}
return permissionStatus
}
/**
* 检查位置权限
*/
async function checkLocationPermission() {
try {
const result = await new Promise((resolve) => {
uni.getLocation({
type: 'wgs84',
success: (res) => {
console.log('✅ 位置权限正常')
resolve({
granted: true,
message: '位置权限已授权'
})
},
fail: (err) => {
console.log('❌ 位置权限被拒绝:', err.errMsg)
resolve({
granted: false,
message: err.errMsg,
error: err
})
}
})
})
return result
} catch (error) {
return {
granted: false,
message: '位置权限检查失败',
error
}
}
}
/**
* 检查WiFi信息获取能力
*/
async function checkWifiInfoAccess() {
try {
const result = await new Promise((resolve) => {
uni.getConnectedWifi({
success: (res) => {
console.log('✅ WiFi信息获取正常:', res.SSID)
resolve({
accessible: true,
ssid: res.SSID,
bssid: res.BSSID,
message: `已连接WiFi: ${res.SSID}`
})
},
fail: (err) => {
console.log('❌ WiFi信息获取失败:', err.errMsg)
resolve({
accessible: false,
message: err.errMsg,
error: err
})
}
})
})
return result
} catch (error) {
return {
accessible: false,
message: 'WiFi信息检查失败',
error
}
}
}
/**
* 检查网络连接状态
*/
async function checkNetworkAccess() {
try {
const networkType = await uni.getNetworkType()
console.log(`📶 网络类型: ${networkType.networkType}`)
console.log(`🔗 连接状态: ${networkType.isConnected ? '已连接' : '未连接'}`)
// 测试实际网络连接
const internetTest = await testInternetConnection()
return {
type: networkType.networkType,
connected: networkType.isConnected,
internetAccess: internetTest.success,
message: `网络: ${networkType.networkType}, 连接: ${networkType.isConnected ? '是' : '否'}, 互联网: ${internetTest.success ? '正常' : '异常'}`
}
} catch (error) {
return {
type: 'unknown',
connected: false,
internetAccess: false,
message: '网络状态检查失败',
error
}
}
}
/**
* 测试互联网连接
*/
async function testInternetConnection() {
try {
const result = await new Promise((resolve) => {
uni.request({
url: 'https://www.baidu.com',
method: 'HEAD',
timeout: 3000,
success: () => {
resolve({ success: true })
},
fail: (err) => {
resolve({ success: false, error: err.errMsg })
}
})
})
return result
} catch (error) {
return { success: false, error: error.message }
}
}
/**
* 生成权限建议
*/
function generatePermissionRecommendations(status) {
const recommendations = []
// 位置权限建议
if (!status.location?.granted) {
recommendations.push({
type: 'location',
priority: 'high',
title: '需要开启位置权限',
description: 'Android 13+获取WiFi信息必须有位置权限',
actions: [
'打开手机设置 → 应用管理 → StillSense',
'点击权限管理 → 位置信息',
'选择"仅在使用中允许"'
]
})
}
// WiFi信息访问建议
if (!status.wifi?.accessible) {
recommendations.push({
type: 'wifi',
priority: 'high',
title: '无法获取WiFi信息',
description: '可能被小米手机的隐私保护限制',
actions: [
'打开设置 → 隐私保护 → 权限管理',
'找到局域网访问 → StillSense → 允许',
'关闭"局域网设备防追踪"功能'
]
})
}
// 网络连接建议
if (!status.network?.internetAccess) {
recommendations.push({
type: 'network',
priority: 'medium',
title: '网络连接异常',
description: '无法访问互联网,可能影响局域网功能',
actions: [
'检查WiFi连接是否正常',
'尝试重新连接WiFi',
'检查是否需要WiFi认证'
]
})
}
// 小米手机特殊建议
const systemInfo = uni.getSystemInfoSync()
if (systemInfo.brand?.toLowerCase().includes('xiaomi') ||
systemInfo.brand?.toLowerCase().includes('redmi')) {
recommendations.push({
type: 'xiaomi',
priority: 'high',
title: '小米手机特殊设置',
description: '小米MIUI需要额外的权限设置',
actions: [
'设置 → 省电与电池 → 关闭省电模式',
'或将APP添加到省电白名单',
'设置 → 隐私保护 → 防追踪 → 关闭局域网设备防追踪'
]
})
}
return recommendations
}
/**
* 显示权限设置指南
*/
export function showPermissionGuide(recommendations) {
if (recommendations.length === 0) {
uni.showToast({
title: '权限检查通过',
icon: 'success'
})
return
}
// 构建指南内容
let guideContent = '📱 权限设置指南:\n\n'
recommendations.forEach((rec, index) => {
guideContent += `${index + 1}. ${rec.title}\n`
guideContent += `${rec.description}\n`
if (rec.actions.length > 0) {
guideContent += '操作步骤:\n'
rec.actions.forEach(action => {
guideContent += `${action}\n`
})
}
guideContent += '\n'
})
uni.showModal({
title: '权限设置指南',
content: guideContent,
confirmText: '我知道了',
success: (res) => {
if (res.confirm) {
console.log('📋 权限设置指南已显示')
}
}
})
}
/**
* 一键权限检查和指导
*/
export async function runPermissionDiagnosis() {
console.log('🔍 开始权限诊断...')
uni.showLoading({ title: '检查权限中...' })
try {
const status = await checkNetworkPermissions()
uni.hideLoading()
console.log('📋 权限检查结果:', status)
if (status.recommendations.length > 0) {
showPermissionGuide(status.recommendations)
} else {
uni.showToast({
title: '权限设置正常',
icon: 'success'
})
}
return status
} catch (error) {
uni.hideLoading()
console.error('❌ 权限诊断异常:', error)
uni.showToast({
title: '权限检查失败',
icon: 'none'
})
return null
}
}
export default {
checkNetworkPermissions,
showPermissionGuide,
runPermissionDiagnosis
}