381 lines
9.5 KiB
Markdown
381 lines
9.5 KiB
Markdown
|
|
# 📝 uni-app 修改指南 - 集成 Android 设备配置检查
|
|||
|
|
|
|||
|
|
## 🎯 目标
|
|||
|
|
|
|||
|
|
让 uni-app 在启动时:
|
|||
|
|
1. 检查 Android 设备是否已配置
|
|||
|
|
2. 如果未配置 → 打开 mDNS 扫描,**阻止页面继续加载**
|
|||
|
|
3. 如果已配置 → 正常加载数据
|
|||
|
|
|
|||
|
|
## ✅ 当前代码分析
|
|||
|
|
|
|||
|
|
你的 `pages/index/index.vue` 已经有以下代码:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
async onLoad() {
|
|||
|
|
this.isPageActive = true
|
|||
|
|
|
|||
|
|
// ✅ 检查Android原生设备配置
|
|||
|
|
if (this.checkAndroidDeviceConfig()) {
|
|||
|
|
console.log('✅ 使用Android原生SDK')
|
|||
|
|
this.setupAndroidCallbacks()
|
|||
|
|
} else {
|
|||
|
|
// 🔧 自动诊断和修复设备配置冲突
|
|||
|
|
await this.diagnoseAndFixDeviceConfig()
|
|||
|
|
|
|||
|
|
// 检查是否需要设备发现
|
|||
|
|
await this.checkDeviceDiscovery()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.loadData() // ⚠️ 问题:即使设备未配置,也会继续加载
|
|||
|
|
this.loadKitchenAlarmHistory()
|
|||
|
|
this.startAlarmTimer()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔧 需要修改的地方
|
|||
|
|
|
|||
|
|
### 修改 1: 优化 `checkAndroidDeviceConfig()` 方法
|
|||
|
|
|
|||
|
|
**位置**:`pages/index/index.vue` 第 243-267 行
|
|||
|
|
|
|||
|
|
**当前代码**:
|
|||
|
|
```javascript
|
|||
|
|
checkAndroidDeviceConfig() {
|
|||
|
|
if (typeof window !== 'undefined' && window.Android && window.Android.getDeviceConfig) {
|
|||
|
|
try {
|
|||
|
|
const configStr = window.Android.getDeviceConfig()
|
|||
|
|
const config = JSON.parse(configStr)
|
|||
|
|
|
|||
|
|
if (config.configured && config.host) {
|
|||
|
|
console.log('✅ Android设备已配置:', config.host)
|
|||
|
|
this.androidDeviceConfig = config
|
|||
|
|
return true
|
|||
|
|
} else {
|
|||
|
|
console.log('❌ Android设备未配置,需要发现设备')
|
|||
|
|
this.openAndroidDeviceDiscovery() // ⚠️ 打开后立即返回
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('❌ 解析Android设备配置失败:', error)
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改为**:
|
|||
|
|
```javascript
|
|||
|
|
checkAndroidDeviceConfig() {
|
|||
|
|
// 检查是否在Android环境且有原生SDK
|
|||
|
|
if (typeof window !== 'undefined' && window.Android && window.Android.getDeviceConfig) {
|
|||
|
|
try {
|
|||
|
|
const configStr = window.Android.getDeviceConfig()
|
|||
|
|
const config = JSON.parse(configStr)
|
|||
|
|
|
|||
|
|
if (config.configured && config.host) {
|
|||
|
|
console.log('✅ Android设备已配置:', config.host)
|
|||
|
|
// 保存配置供后续使用
|
|||
|
|
this.androidDeviceConfig = config
|
|||
|
|
this.isAndroidConfigured = true // 新增:标记已配置
|
|||
|
|
return true
|
|||
|
|
} else {
|
|||
|
|
console.log('❌ Android设备未配置,需要发现设备')
|
|||
|
|
this.isAndroidConfigured = false // 新增:标记未配置
|
|||
|
|
// 打开设备发现页面
|
|||
|
|
this.openAndroidDeviceDiscovery()
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('❌ 解析Android设备配置失败:', error)
|
|||
|
|
this.isAndroidConfigured = false
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 不在Android环境,使用Web版本
|
|||
|
|
this.isAndroidConfigured = null // null表示不在Android环境
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 修改 2: 添加 `isAndroidConfigured` 数据属性
|
|||
|
|
|
|||
|
|
**位置**:`pages/index/index.vue` 的 `data()` 部分
|
|||
|
|
|
|||
|
|
**在 `data()` 中添加**:
|
|||
|
|
```javascript
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
// ... 其他数据 ...
|
|||
|
|
|
|||
|
|
// 新增:Android设备配置状态
|
|||
|
|
isAndroidConfigured: null, // null=未检查, true=已配置, false=未配置
|
|||
|
|
androidDeviceConfig: null, // Android设备配置信息
|
|||
|
|
|
|||
|
|
// ... 其他数据 ...
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 修改 3: 优化 `onLoad()` 方法
|
|||
|
|
|
|||
|
|
**位置**:`pages/index/index.vue` 第 185-206 行
|
|||
|
|
|
|||
|
|
**当前代码**:
|
|||
|
|
```javascript
|
|||
|
|
async onLoad() {
|
|||
|
|
this.isPageActive = true
|
|||
|
|
|
|||
|
|
if (this.checkAndroidDeviceConfig()) {
|
|||
|
|
console.log('✅ 使用Android原生SDK')
|
|||
|
|
this.setupAndroidCallbacks()
|
|||
|
|
} else {
|
|||
|
|
await this.diagnoseAndFixDeviceConfig()
|
|||
|
|
await this.checkDeviceDiscovery()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.loadData()
|
|||
|
|
this.loadKitchenAlarmHistory()
|
|||
|
|
this.startAlarmTimer()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改为**:
|
|||
|
|
```javascript
|
|||
|
|
async onLoad() {
|
|||
|
|
this.isPageActive = true
|
|||
|
|
|
|||
|
|
// ✅ 检查Android原生设备配置
|
|||
|
|
const isConfigured = this.checkAndroidDeviceConfig()
|
|||
|
|
|
|||
|
|
if (isConfigured) {
|
|||
|
|
// Android设备已配置,使用原生SDK
|
|||
|
|
console.log('✅ 使用Android原生SDK')
|
|||
|
|
this.setupAndroidCallbacks()
|
|||
|
|
|
|||
|
|
// 继续加载数据
|
|||
|
|
this.loadData()
|
|||
|
|
this.loadKitchenAlarmHistory()
|
|||
|
|
this.startAlarmTimer()
|
|||
|
|
} else if (this.isAndroidConfigured === false) {
|
|||
|
|
// Android设备未配置,已打开设备发现页面
|
|||
|
|
console.log('⏸️ 等待用户配置设备...')
|
|||
|
|
// ⚠️ 不加载数据,等待用户配置设备后返回
|
|||
|
|
// 用户配置完成后,会触发 onShow() 重新加载
|
|||
|
|
} else {
|
|||
|
|
// 不在Android环境,使用Web版本
|
|||
|
|
console.log('🌐 使用Web版本')
|
|||
|
|
await this.diagnoseAndFixDeviceConfig()
|
|||
|
|
await this.checkDeviceDiscovery()
|
|||
|
|
|
|||
|
|
// 继续加载数据
|
|||
|
|
this.loadData()
|
|||
|
|
this.loadKitchenAlarmHistory()
|
|||
|
|
this.startAlarmTimer()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 修改 4: 优化 `onShow()` 方法
|
|||
|
|
|
|||
|
|
**位置**:`pages/index/index.vue` 第 207-217 行
|
|||
|
|
|
|||
|
|
**当前代码**:
|
|||
|
|
```javascript
|
|||
|
|
onShow() {
|
|||
|
|
this.isPageActive = true
|
|||
|
|
this.loadData()
|
|||
|
|
this.fetchAlarmHistory(true)
|
|||
|
|
this.loadKitchenAlarmHistory()
|
|||
|
|
this.startAlarmTimer()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改为**:
|
|||
|
|
```javascript
|
|||
|
|
onShow() {
|
|||
|
|
this.isPageActive = true
|
|||
|
|
|
|||
|
|
// 如果是从设备发现页面返回,重新检查配置
|
|||
|
|
if (this.isAndroidConfigured === false && window.Android) {
|
|||
|
|
console.log('🔄 从设备发现返回,重新检查配置')
|
|||
|
|
const isConfigured = this.checkAndroidDeviceConfig()
|
|||
|
|
|
|||
|
|
if (isConfigured) {
|
|||
|
|
// 设备已配置,设置回调并加载数据
|
|||
|
|
this.setupAndroidCallbacks()
|
|||
|
|
this.loadData()
|
|||
|
|
this.loadKitchenAlarmHistory()
|
|||
|
|
this.startAlarmTimer()
|
|||
|
|
} else {
|
|||
|
|
// 仍未配置,不加载数据
|
|||
|
|
console.log('⏸️ 设备仍未配置')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
// 正常的页面显示,重新加载数据
|
|||
|
|
this.loadData()
|
|||
|
|
this.fetchAlarmHistory(true)
|
|||
|
|
this.loadKitchenAlarmHistory()
|
|||
|
|
this.startAlarmTimer()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📋 完整修改清单
|
|||
|
|
|
|||
|
|
### 1. 在 `data()` 中添加:
|
|||
|
|
```javascript
|
|||
|
|
isAndroidConfigured: null,
|
|||
|
|
androidDeviceConfig: null,
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 修改 `checkAndroidDeviceConfig()` 方法
|
|||
|
|
- 添加 `this.isAndroidConfigured` 状态标记
|
|||
|
|
- 返回前设置状态
|
|||
|
|
|
|||
|
|
### 3. 修改 `onLoad()` 方法
|
|||
|
|
- 根据 `isAndroidConfigured` 状态决定是否加载数据
|
|||
|
|
- 如果未配置,不加载数据
|
|||
|
|
|
|||
|
|
### 4. 修改 `onShow()` 方法
|
|||
|
|
- 检查是否从设备发现返回
|
|||
|
|
- 如果是,重新检查配置并加载数据
|
|||
|
|
|
|||
|
|
## 🚀 打包步骤
|
|||
|
|
|
|||
|
|
### 1. 修改代码
|
|||
|
|
|
|||
|
|
按照上面的指南修改 `pages/index/index.vue` 文件。
|
|||
|
|
|
|||
|
|
### 2. 检查修改
|
|||
|
|
|
|||
|
|
确保以下内容正确:
|
|||
|
|
- ✅ `data()` 中添加了新属性
|
|||
|
|
- ✅ `checkAndroidDeviceConfig()` 设置了状态
|
|||
|
|
- ✅ `onLoad()` 根据状态加载数据
|
|||
|
|
- ✅ `onShow()` 处理了返回逻辑
|
|||
|
|
|
|||
|
|
### 3. 打包 uni-app
|
|||
|
|
|
|||
|
|
在 HBuilderX 中:
|
|||
|
|
```
|
|||
|
|
发行 → H5-Web → 发行到H5
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
或使用命令行:
|
|||
|
|
```bash
|
|||
|
|
cd D:\XinJiaPo\Firefly_code\smart-home\smart-home-app
|
|||
|
|
npm run build:h5
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 复制文件
|
|||
|
|
|
|||
|
|
打包完成后,文件在:
|
|||
|
|
```
|
|||
|
|
D:\XinJiaPo\Firefly_code\smart-home\smart-home-app\unpackage\dist\build\h5
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
复制到 Android 项目:
|
|||
|
|
```
|
|||
|
|
复制所有文件到:
|
|||
|
|
D:\XinJiaPo\Firefly_code\smart-home\Smarthome_android\Smarthome_android\app\src\main\assets\web
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 重新 Build Android 应用
|
|||
|
|
|
|||
|
|
在 Android Studio 中:
|
|||
|
|
```
|
|||
|
|
Build → Rebuild Project
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 预期行为
|
|||
|
|
|
|||
|
|
### 首次使用(设备未配置):
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 应用启动
|
|||
|
|
↓
|
|||
|
|
2. 加载 index.vue
|
|||
|
|
↓
|
|||
|
|
3. onLoad() 执行
|
|||
|
|
↓
|
|||
|
|
4. checkAndroidDeviceConfig() → 返回 false
|
|||
|
|
↓
|
|||
|
|
5. isAndroidConfigured = false
|
|||
|
|
↓
|
|||
|
|
6. 打开 mDNS 设备发现页面
|
|||
|
|
↓
|
|||
|
|
7. ⏸️ 不加载数据,等待用户配置
|
|||
|
|
↓
|
|||
|
|
8. 用户在 mDNS 界面选择设备
|
|||
|
|
↓
|
|||
|
|
9. 设备配置保存
|
|||
|
|
↓
|
|||
|
|
10. 返回 index 页面
|
|||
|
|
↓
|
|||
|
|
11. onShow() 执行
|
|||
|
|
↓
|
|||
|
|
12. 重新检查配置 → 已配置
|
|||
|
|
↓
|
|||
|
|
13. ✅ 加载数据,显示内容
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 再次使用(设备已配置):
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 应用启动
|
|||
|
|
↓
|
|||
|
|
2. 加载 index.vue
|
|||
|
|
↓
|
|||
|
|
3. onLoad() 执行
|
|||
|
|
↓
|
|||
|
|
4. checkAndroidDeviceConfig() → 返回 true
|
|||
|
|
↓
|
|||
|
|
5. isAndroidConfigured = true
|
|||
|
|
↓
|
|||
|
|
6. 设置 Android 回调
|
|||
|
|
↓
|
|||
|
|
7. ✅ 直接加载数据,显示内容
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
1. **备份原文件**
|
|||
|
|
```bash
|
|||
|
|
复制 pages/index/index.vue 为 index.vue.backup
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **仔细检查语法**
|
|||
|
|
- 确保所有括号匹配
|
|||
|
|
- 确保逗号正确
|
|||
|
|
- 确保缩进一致
|
|||
|
|
|
|||
|
|
3. **测试打包**
|
|||
|
|
- 打包前先在浏览器中测试
|
|||
|
|
- 确保没有语法错误
|
|||
|
|
|
|||
|
|
4. **保留旧的 web 文件夹**
|
|||
|
|
```bash
|
|||
|
|
重命名 app/src/main/assets/web 为 web.backup
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔍 调试技巧
|
|||
|
|
|
|||
|
|
如果打包后有问题,在 Chrome 中调试:
|
|||
|
|
```
|
|||
|
|
chrome://inspect
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
查看 Console 日志:
|
|||
|
|
- `✅ Android设备已配置` → 配置成功
|
|||
|
|
- `❌ Android设备未配置` → 需要配置
|
|||
|
|
- `⏸️ 等待用户配置设备` → 已打开设备发现
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**准备好了吗?** 🚀
|
|||
|
|
|
|||
|
|
按照这个指南仔细修改,一次成功!
|