281 lines
7.2 KiB
Markdown
281 lines
7.2 KiB
Markdown
|
|
# 存客宝 - UniApp 套壳应用
|
|||
|
|
|
|||
|
|
这是一个基于 UniApp 开发的安卓套壳应用,主要功能是作为内置浏览器加载目标网站,并提供完整的组件通信功能。
|
|||
|
|
|
|||
|
|
## 🚀 主要特性
|
|||
|
|
|
|||
|
|
- **全屏 WebView** - 无边框、无导航栏的全屏显示
|
|||
|
|
- **双向通信** - UniApp 与网页之间的完整消息通信
|
|||
|
|
- **无缝体验** - 用户无法察觉这是一个套壳应用
|
|||
|
|
- **错误处理** - 完善的加载失败和网络错误处理
|
|||
|
|
- **备用地址** - 支持主地址失败时自动切换到备用地址
|
|||
|
|
- **调试模式** - 可选的调试信息显示
|
|||
|
|
|
|||
|
|
## 📱 应用配置
|
|||
|
|
|
|||
|
|
### 1. 修改目标网站
|
|||
|
|
|
|||
|
|
在 `config.js` 文件中修改目标网站地址:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
webConfig: {
|
|||
|
|
// 主要目标网站URL(请替换为您的实际网站)
|
|||
|
|
mainUrl: 'https://your-target-website.com',
|
|||
|
|
|
|||
|
|
// 备用网站URL(如果主网站无法访问)
|
|||
|
|
fallbackUrl: 'https://backup-website.com',
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 应用设置
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
appConfig: {
|
|||
|
|
// 应用名称
|
|||
|
|
appName: '存客宝',
|
|||
|
|
|
|||
|
|
// 应用版本
|
|||
|
|
version: '1.0.0',
|
|||
|
|
|
|||
|
|
// 是否显示加载动画
|
|||
|
|
showLoading: true,
|
|||
|
|
|
|||
|
|
// 加载超时时间(毫秒)
|
|||
|
|
loadingTimeout: 10000,
|
|||
|
|
|
|||
|
|
// 是否启用调试模式
|
|||
|
|
debug: false
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔄 通信功能
|
|||
|
|
|
|||
|
|
### UniApp 向网页发送消息
|
|||
|
|
|
|||
|
|
网页可以通过以下方式接收来自 UniApp 的消息:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 监听来自 UniApp 的消息
|
|||
|
|
window.addEventListener("uniAppMessage", function (event) {
|
|||
|
|
const message = event.detail;
|
|||
|
|
console.log("收到 UniApp 消息:", message);
|
|||
|
|
|
|||
|
|
switch (message.type) {
|
|||
|
|
case "userInfo":
|
|||
|
|
// 处理用户信息
|
|||
|
|
console.log("用户信息:", message.data);
|
|||
|
|
break;
|
|||
|
|
case "deviceInfo":
|
|||
|
|
// 处理设备信息
|
|||
|
|
console.log("设备信息:", message.data);
|
|||
|
|
break;
|
|||
|
|
case "shareResult":
|
|||
|
|
// 处理分享结果
|
|||
|
|
console.log("分享结果:", message.data);
|
|||
|
|
break;
|
|||
|
|
case "paymentResult":
|
|||
|
|
// 处理支付结果
|
|||
|
|
console.log("支付结果:", message.data);
|
|||
|
|
break;
|
|||
|
|
case "confirmResult":
|
|||
|
|
// 处理确认结果
|
|||
|
|
console.log("确认结果:", message.data);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 网页向 UniApp 发送消息
|
|||
|
|
|
|||
|
|
网页可以通过 `window.uniAppBridge` 对象与 UniApp 通信:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 检查桥接是否可用
|
|||
|
|
if (window.uniAppBridge) {
|
|||
|
|
// 获取用户信息
|
|||
|
|
window.uniAppBridge.getUserInfo();
|
|||
|
|
|
|||
|
|
// 获取设备信息
|
|||
|
|
window.uniAppBridge.getDeviceInfo();
|
|||
|
|
|
|||
|
|
// 显示 Toast
|
|||
|
|
window.uniAppBridge.showToast("操作成功!", 2000);
|
|||
|
|
|
|||
|
|
// 显示 Alert
|
|||
|
|
window.uniAppBridge.showAlert("提示", "这是一个提示信息");
|
|||
|
|
|
|||
|
|
// 显示 Confirm
|
|||
|
|
window.uniAppBridge.showConfirm("确认", "确定要执行此操作吗?");
|
|||
|
|
|
|||
|
|
// 分享
|
|||
|
|
window.uniAppBridge.share({
|
|||
|
|
url: "https://example.com",
|
|||
|
|
title: "分享标题",
|
|||
|
|
summary: "分享描述",
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 支付
|
|||
|
|
window.uniAppBridge.payment({
|
|||
|
|
amount: 100,
|
|||
|
|
orderId: "order123",
|
|||
|
|
description: "商品描述",
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 发送自定义消息
|
|||
|
|
window.uniAppBridge.postMessage("customType", {
|
|||
|
|
key: "value",
|
|||
|
|
data: "custom data",
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🛠️ 开发指南
|
|||
|
|
|
|||
|
|
### 1. 环境准备
|
|||
|
|
|
|||
|
|
确保已安装 HBuilderX 并配置好 UniApp 开发环境。
|
|||
|
|
|
|||
|
|
### 2. 修改配置
|
|||
|
|
|
|||
|
|
1. 打开 `config.js` 文件
|
|||
|
|
2. 修改 `mainUrl` 为您的目标网站地址
|
|||
|
|
3. 根据需要修改其他配置项
|
|||
|
|
|
|||
|
|
### 3. 编译打包
|
|||
|
|
|
|||
|
|
1. 在 HBuilderX 中打开项目
|
|||
|
|
2. 选择 "发行" -> "原生 App-云打包"
|
|||
|
|
3. 选择 Android 平台
|
|||
|
|
4. 配置应用图标和签名信息
|
|||
|
|
5. 点击打包
|
|||
|
|
|
|||
|
|
### 4. 测试通信功能
|
|||
|
|
|
|||
|
|
在目标网站中添加以下测试代码:
|
|||
|
|
|
|||
|
|
```html
|
|||
|
|
<!DOCTYPE html>
|
|||
|
|
<html>
|
|||
|
|
<head>
|
|||
|
|
<title>测试页面</title>
|
|||
|
|
</head>
|
|||
|
|
<body>
|
|||
|
|
<h1>UniApp 套壳应用测试</h1>
|
|||
|
|
|
|||
|
|
<button onclick="testCommunication()">测试通信</button>
|
|||
|
|
<button onclick="getUserInfo()">获取用户信息</button>
|
|||
|
|
<button onclick="getDeviceInfo()">获取设备信息</button>
|
|||
|
|
<button onclick="showToast()">显示 Toast</button>
|
|||
|
|
|
|||
|
|
<div id="result"></div>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
// 监听来自 UniApp 的消息
|
|||
|
|
window.addEventListener("uniAppMessage", function (event) {
|
|||
|
|
const message = event.detail;
|
|||
|
|
document.getElementById("result").innerHTML =
|
|||
|
|
"<p>收到消息: " + JSON.stringify(message) + "</p>";
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
function testCommunication() {
|
|||
|
|
if (window.uniAppBridge) {
|
|||
|
|
window.uniAppBridge.postMessage("test", {
|
|||
|
|
message: "Hello from Web!",
|
|||
|
|
timestamp: Date.now(),
|
|||
|
|
});
|
|||
|
|
} else {
|
|||
|
|
alert("桥接未初始化");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getUserInfo() {
|
|||
|
|
if (window.uniAppBridge) {
|
|||
|
|
window.uniAppBridge.getUserInfo();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getDeviceInfo() {
|
|||
|
|
if (window.uniAppBridge) {
|
|||
|
|
window.uniAppBridge.getDeviceInfo();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function showToast() {
|
|||
|
|
if (window.uniAppBridge) {
|
|||
|
|
window.uniAppBridge.showToast("这是一个测试 Toast");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
</body>
|
|||
|
|
</html>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📋 消息类型说明
|
|||
|
|
|
|||
|
|
### 从网页到 UniApp
|
|||
|
|
|
|||
|
|
| 消息类型 | 说明 | 参数 |
|
|||
|
|
| --------------- | ------------ | -------------------------------- |
|
|||
|
|
| `getUserInfo` | 获取用户信息 | 无 |
|
|||
|
|
| `getDeviceInfo` | 获取设备信息 | 无 |
|
|||
|
|
| `toast` | 显示 Toast | `{message, duration}` |
|
|||
|
|
| `alert` | 显示 Alert | `{title, content}` |
|
|||
|
|
| `confirm` | 显示 Confirm | `{title, content}` |
|
|||
|
|
| `share` | 分享功能 | `{url, title, summary}` |
|
|||
|
|
| `payment` | 支付功能 | `{amount, orderId, description}` |
|
|||
|
|
| `navigate` | 页面导航 | `{url}` |
|
|||
|
|
|
|||
|
|
### 从 UniApp 到网页
|
|||
|
|
|
|||
|
|
| 消息类型 | 说明 | 数据 |
|
|||
|
|
| --------------- | -------- | --------------------- |
|
|||
|
|
| `userInfo` | 用户信息 | 用户数据对象 |
|
|||
|
|
| `deviceInfo` | 设备信息 | 设备数据对象 |
|
|||
|
|
| `shareResult` | 分享结果 | `{success, error?}` |
|
|||
|
|
| `paymentResult` | 支付结果 | `{success, orderId?}` |
|
|||
|
|
| `confirmResult` | 确认结果 | `{confirmed}` |
|
|||
|
|
|
|||
|
|
## 🔧 自定义功能
|
|||
|
|
|
|||
|
|
### 添加新的消息类型
|
|||
|
|
|
|||
|
|
1. 在 `config.js` 中添加新的消息类型:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
messageTypes: {
|
|||
|
|
// ... 现有类型
|
|||
|
|
CUSTOM_ACTION: "customAction";
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. 在 `index.vue` 中添加处理逻辑:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
case this.config.communication.messageTypes.CUSTOM_ACTION:
|
|||
|
|
this.handleCustomAction(data);
|
|||
|
|
break;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. 实现处理方法:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
handleCustomAction(data) {
|
|||
|
|
// 处理自定义操作
|
|||
|
|
console.log('自定义操作:', data);
|
|||
|
|
// 返回结果给网页
|
|||
|
|
this.sendToIframe('customActionResult', { success: true });
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚨 注意事项
|
|||
|
|
|
|||
|
|
1. **网络安全** - 确保目标网站使用 HTTPS 协议
|
|||
|
|
2. **权限配置** - 在 `manifest.json` 中配置必要的网络权限
|
|||
|
|
3. **兼容性** - 测试不同 Android 版本的兼容性
|
|||
|
|
4. **性能优化** - 避免频繁的消息通信,影响性能
|
|||
|
|
5. **错误处理** - 完善错误处理机制,提升用户体验
|
|||
|
|
|
|||
|
|
## 📞 技术支持
|
|||
|
|
|
|||
|
|
如有问题或需要技术支持,请联系开发团队。
|