HarmonyOS ArkWeb 开发完整指南(上篇):Hybrid 应用鸿蒙化与 JSBridge
适用版本:HarmonyOS NEXT(纯血鸿蒙),ArkTS + ArkWeb,目标:把传统 Web/H5 项目迁移为鸿蒙 Hybrid 应用,掌握 JSBridge 双向通信原理、封装、踩坑。
一、ArkWeb 基础概念
1.1 什么是 ArkWeb
ArkWeb 是鸿蒙系统提供的 Web 组件,替代 Android WebView /iOS WKWebView,用于在鸿蒙应用内加载 H5 页面,实现 Hybrid 混合开发。 由两部分组成:
- Web 内核:Chromium 内核,负责渲染 HTML/CSS/JS;
- ArkWeb 框架层:ArkTS API,提供页面加载、缓存、权限、JSBridge、事件监听等能力。
重点:HarmonyOS NEXT 没有安卓兼容层,旧安卓 WebView 方案完全不可用,必须使用 ArkWeb。
1.2 Hybrid 应用鸿蒙化能解决什么
- 复用现有 H5 业务代码,减少多端重复开发;
- H5 调用鸿蒙原生能力(摄像头、文件、蓝牙、本地存储、通知);
- 原生 ArkTS 调用 H5 内 JS 方法;
- 原生控制 Web 页面生命周期、加载进度、拦截请求。
1.3 环境准备
- DevEco Studio(对应 NEXT SDK)
- 工程模板:Empty Activity(ArkTS)
- module.json5 配置网络权限(加载远程网页)
json
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
二、ArkWeb 快速上手:最简单 Web 页面
2.1 引入组件与基础使用
typescript
运行
import { ArkWeb, WebController } from '@ohos/arkweb';
import { hilog } from '@ohos/hilog';
@Entry
@Component
struct WebPageDemo {
// Web控制器,核心对象,用于控制ArkWeb
controller: WebController = new WebController();
build() {
Column() {
ArkWeb({
controller: this.controller,
// 加载本地H5或者远程url
src: $rawfile("index.html")
// src: "https://xxx.com/h5"
})
.width('100%')
.height('100%')
// 页面加载完成回调
.onPageFinish(() => {
hilog.info(0x0001, "ArkWeb", "页面加载完成");
})
// 加载进度回调
.onProgressChange((progress: number) => {
hilog.info(0x0001, "ArkWeb", `加载进度:${progress}`);
})
}
}
}
$rawfile:存放本地静态 H5 资源,路径entry/src/main/resources/rawfile/index.html- WebController:核心控制器,执行 JS、页面前进后退、清除缓存等。
2.2 常用基础能力
typescript
运行
// 页面后退
this.controller.backward();
// 页面前进
this.controller.forward();
// 刷新页面
this.controller.reload();
// 停止加载
this.controller.stop();
// 执行JS脚本(原生调用H5 JS)
this.controller.runJavaScript("alert('来自原生的调用')");
三、JSBridge 核心原理(重中之重)
JSBridge 的本质:H5 JS <=> 鸿蒙 ArkTS 的双向通信通道
H5 的 JS 运行在 Web 内核线程;ArkTS 运行在鸿蒙 UI 主线程,两者隔离,不能直接互相调用。
通信两条链路:
- H5 → 鸿蒙原生:H5 JS 发送消息,ArkWeb 拦截,ArkTS 接收并执行原生逻辑;
- 鸿蒙原生 → H5:ArkTS 通过
runJavaScript调用 H5 全局 JS 函数,传递回调数据。
和安卓 JSBridge 思路一致,但 API 完全不同:ArkWeb 使用
registerJavaScriptProxy注册原生对象给 H5。
3.1 registerJavaScriptProxy 核心 API
作用:把 ArkTS 对象注入到 H5 的 window 对象,H5 可以直接调用这个对象的方法。
⚠️ 重要限制:
- 必须在
src加载页面之前注册;- 注册的方法只支持参数为基础类型(string/number/boolean),不支持直接传复杂对象 / 函数;
- H5 不能直接传递回调函数给原生,需要用回调 id 机制。
3.1.1 ArkTS:注册原生桥对象
typescript
运行
// 定义桥对象,暴露给H5
class NativeBridge {
// 原生能力:获取设备信息
getDeviceInfo(callbackId: string) {
const res = JSON.stringify({
deviceType: "HarmonyOS NEXT",
platform: "arkweb"
})
// 调用H5的全局回调方法,回传结果
webController.runJavaScript(`window._JSBridgeCallback("${callbackId}", ${res})`)
}
showToast(msg: string, callbackId: string) {
hilog.info(0x0001, "JSBridge", `H5调用toast:${msg}`);
webController.runJavaScript(`window._JSBridgeCallback("${callbackId}", {"code":0,"msg":"success"})`)
}
}
// 在组件内
@Entry
@Component
struct BridgeDemo {
controller: WebController = new WebController();
bridge: NativeBridge = new NativeBridge();
aboutToAppear() {
// 注册对象:H5 window.nativeBridge
this.controller.registerJavaScriptProxy(this.bridge, "nativeBridge", ["getDeviceInfo", "showToast"]);
// 开启JS能力
this.controller.setJavaScriptEnabled(true);
}
build() {
ArkWeb({
controller: this.controller,
src: $rawfile("index.html")
})
.width('100%').height('100%')
}
}
3.1.2 H5 端 index.html JSBridge 封装
html
预览
<!DOCTYPE html>
<html>
<body>
<button onclick="callNativeToast()">调用原生Toast</button>
<script>
// 保存回调池
const callbackMap = {};
let callbackId = 1;
// 全局回调入口,原生调用这个方法回传数据
window._JSBridgeCallback = function (cbId, data) {
const fn = callbackMap[cbId];
if (fn) {
fn(data);
delete callbackMap[cbId];
}
}
// H5封装调用原生方法
function nativeInvoke(method, params) {
return new Promise((resolve) => {
const id = callbackId++;
callbackMap[id] = resolve;
// 调用注入的nativeBridge对象方法
window.nativeBridge[method](id, JSON.stringify(params));
})
}
// 测试调用原生
async function callNativeToast() {
const result = await nativeInvoke("showToast", {msg:"Hello ArkWeb JSBridge"});
console.log("原生返回", result);
}
// 获取设备信息
async function getDevice() {
const info = await nativeInvoke("getDeviceInfo", {});
console.log("设备信息", info);
}
</script>
</body>
</html>
3.2 通信流程拆解
- ArkTS 在页面加载前
registerJavaScriptProxy,把nativeBridge挂载到 H5 window; - H5 调用
nativeBridge.showToast(callbackId); - ArkTS 的
showToast方法被触发,执行原生业务; - 原生通过
runJavaScript执行 H5 全局回调函数_JSBridgeCallback,带上 callbackId 和结果; - H5 根据 callbackId 找到 Promise resolve,拿到返回数据。
为什么不能直接传回调函数? H5 传入的 function 无法序列化传递到 ArkTS,鸿蒙 ArkWeb 不支持跨线程传递函数对象,所以业界统一用 callbackId 方案。
四、JSBridge 通用封装(推荐工程化方案)
上面是最简 Demo,工程中需要统一封装:
- 统一消息体结构:
{method, params, callbackId} - 增加超时机制,防止回调丢失
- 增加错误码、异常捕获
- 统一日志打印便于调试
消息协议约定
json
{
"method": "showToast",
"params": {"msg": "xxx"},
"callbackId": "cb_1001"
}
五、ArkWeb 重要配置项 & 安全注意事项
5.1 Web 常用配置
typescript
运行
// 开启JS
this.controller.setJavaScriptEnabled(true);
// 是否允许访问文件
this.controller.setAllowFileAccess(false);
// 是否允许JS打开新窗口
this.controller.setJavaScriptCanOpenWindowsAutomatically(false);
// 缓存模式
this.controller.setCacheMode(CacheMode.DEFAULT);
5.2 安全红线(Hybrid 重点)
- 不要随便注入大量原生对象,H5 页面如果不可信,会造成安全风险;
- 远程 H5 页面必须校验域名白名单,不要无限制开放原生能力;
registerJavaScriptProxy暴露的方法必须做参数校验,防止注入攻击;- 禁止在 JSBridge 中传递敏感信息(密码、密钥);
- 拦截页面跳转
onUrlLoadIntercept,防止跳转到恶意网页。
typescript
运行
// 拦截url跳转示例
.onUrlLoadIntercept((event) => {
const url = event.url;
// 白名单校验
if (!url.startsWith("https://xxx.com")) {
return true; // true 拦截本次加载
}
return false;
})
六、常见坑点(上篇踩坑汇总)
- ❌ 页面加载之后才调用
registerJavaScriptProxy→ 注入失败,H5 拿不到 nativeBridge;
✅ 必须在加载 src 之前注册。
- ❌ H5 直接传递 Object 给原生方法 → ArkWeb 无法解析;
✅ H5 把对象 JSON.stringify,原生内部再 JSON.parse。
- ❌ runJavaScript 脚本语法错误,没有捕获异常 → 静默失败;
✅ 增加 try-catch,hilog 打印 JS 执行异常。
- ❌ 快速连续调用原生,callbackId 重复;
✅ 使用自增唯一 id。
- ❌ 页面销毁时,WebController 没有销毁,内存泄漏;
✅ aboutToDisappear 调用 controller.destroy ()
typescript
运行
aboutToDisappear() {
this.controller.destroy();
}
七、上篇小结 & 下篇预告
本篇完成:
- ArkWeb 组件基础使用;
- Hybrid 鸿蒙化迁移思路;
- JSBridge 双向通信原理 + 完整可运行 Demo;
- 安全规范与高频踩坑。
下篇内容预告
- ArkWeb 本地静态资源部署、资源拦截(替代 WebView shouldInterceptRequest)
- Cookie、LocalStorage、会话同步方案
- 文件上传 / 下载、图片选择 JSBridge 封装
- Web 性能优化:预加载、缓存策略
- 调试手段:DevTools 远程调试 H5 页面
- 完整工程级 JSBridge 开源封装库
https://gitee.com/skysoft2593/mqhc/blob/master/VyZzk_nQI4.md
https://gitee.com/skysoft2593/mqhc/blob/master/76eEK_uurs.md
https://gitee.com/skysoft2593/mqhc/blob/master/XJLNn_YPgA.md
https://gitee.com/skysoft2593/mqhc/blob/master/WtAkF_fgEd.md
https://gitee.com/skysoft2593/mqhc/blob/master/Nsa9d_pcn4.md
https://gitee.com/skysoft2593/mqhc/blob/master/MzMa0_XnHu.md
https://gitee.com/skysoft2593/mqhc/blob/master/4Wrhi_JL6O.md
https://gitee.com/skysoft2593/mqhc/blob/master/E09mf_qS5i.md
https://gitee.com/skysoft2593/mqhc/blob/master/Mct2U_vzTh.md
https://gitee.com/skysoft2593/mqhc/blob/master/zFArw_SygU.md
https://gitee.com/skysoft2593/mqhc/blob/master/GHZcp_1QpW.md
https://gitee.com/skysoft2593/mqhc/blob/master/nNcq1_B37V.md
https://gitee.com/skysoft2593/mqhc/blob/master/mZzU6_tdE9.md
https://gitee.com/skysoft2593/mqhc/blob/master/7cP1A_ZHqT.md
https://gitee.com/skysoft2593/mqhc/blob/master/fnigZ_cfqu.md
https://gitee.com/skysoft2593/mqhc/blob/master/QFocE_pR3B.md
https://gitee.com/skysoft2593/mqhc/blob/master/oLoHE_aKJj.md
https://gitee.com/skysoft2593/mqhc/blob/master/N2Cj4_cWq9.md
https://gitee.com/skysoft2593/mqhc/blob/master/57iKK_5vWO.md
https://gitee.com/skysoft2593/mqhc/blob/master/CUtng_5m5X.md
https://gitee.com/skysoft2593/mqhc/blob/master/qGoP5_aOVl.md
https://gitee.com/skysoft2593/mqhc/blob/master/2WIQ5_CLdM.md
https://gitee.com/skysoft2593/mqhc/blob/master/86ISL_J5ik.md
https://gitee.com/skysoft2593/mqhc/blob/master/xyLII_7rHK.md
https://gitee.com/skysoft2593/mqhc/blob/master/i1FbO_dMxN.md
https://gitee.com/skysoft2593/mqhc/blob/master/rHvTy_qdUN.md
https://gitee.com/skysoft2593/mqhc/blob/master/Uf89Z_tKo2.md
https://gitee.com/skysoft2593/mqhc/blob/master/mBENC_RCGs.md
https://gitee.com/skysoft2593/mqhc/blob/master/CGYSq_JFTE.md
https://gitee.com/skysoft2593/mqhc/blob/master/chEcf_Ou8O.md
https://gitee.com/skysoft2593/mqhc/blob/master/GT0YA_LTce.md
https://gitee.com/skysoft2593/mqhc/blob/master/RCSFq_gV3A.md
https://gitee.com/skysoft2593/mqhc/blob/master/kwjJK_A4Bo.md
https://gitee.com/skysoft2593/mqhc/blob/master/QDrMn_Pb1l.md
https://gitee.com/skysoft2593/mqhc/blob/master/SXFgW_ioOx.md
https://gitee.com/skysoft2593/mqhc/blob/master/VDyc6_BbKo.md
https://gitee.com/skysoft2593/mqhc/blob/master/ZObHD_gri7.md
https://gitee.com/skysoft2593/mqhc/blob/master/6H5VY_yKlE.md
https://gitee.com/skysoft2593/mqhc/blob/master/jTjjL_L5Bc.md
https://gitee.com/skysoft2593/mqhc/blob/master/yliS3_ePp9.md
https://gitee.com/skysoft2593/mqhc/blob/master/0pdQp_kmnG.md
https://gitee.com/skysoft2593/mqhc/blob/master/6FnyD_xJxc.md
https://gitee.com/skysoft2593/mqhc/blob/master/ywRYt_MFgP.md
https://gitee.com/skysoft2593/mqhc/blob/master/8mM3i_9WAX.md
https://gitee.com/skysoft2593/mqhc/blob/master/z1A8I_DBdB.md
https://gitee.com/skysoft2593/mqhc/blob/master/8i3XE_xTY6.md
https://gitee.com/skysoft2593/mqhc/blob/master/96TtM_ts45.md
https://gitee.com/skysoft2593/mqhc/blob/master/yxBcq_WKXK.md
https://gitee.com/skysoft2593/mqhc/blob/master/3AnKd_cw7M.md
https://gitee.com/skysoft2593/mqhc/blob/master/beTvf_07Ku.md
https://gitee.com/skysoft2593/mqhc/blob/master/N1ZJJ_1i8j.md
https://gitee.com/skysoft2593/mqhc/blob/master/c5OkS_PvaO.md
https://gitee.com/skysoft2593/mqhc/blob/master/6aiVL_pHUS.md
https://gitee.com/skysoft2593/mqhc/blob/master/vhKbe_CIGO.md
https://gitee.com/skysoft2593/mqhc/blob/master/1wdLj_0ciZ.md
https://gitee.com/skysoft2593/mqhc/blob/master/yv9lj_mjwF.md
https://gitee.com/skysoft2593/mqhc/blob/master/Lw8zj_K95d.md
https://gitee.com/skysoft2593/mqhc/blob/master/jDIjB_TIbm.md
https://gitee.com/skysoft2593/mqhc/blob/master/fwTbE_UDBi.md
https://gitee.com/skysoft2593/mqhc/blob/master/tdtNA_1lu5.md
https://gitee.com/skysoft2593/mqhc/blob/master/fI7ym_kSLi.md
https://gitee.com/skysoft2593/mqhc/blob/master/RJT39_WH1j.md
https://gitee.com/skysoft2593/mqhc/blob/master/dd2g5_MNDc.md
https://gitee.com/skysoft2593/mqhc/blob/master/JfpeU_bwjl.md
https://gitee.com/skysoft2593/mqhc/blob/master/JkZF5_QVs5.md
https://gitee.com/skysoft2593/mqhc/blob/master/m8zwi_pMPv.md
https://gitee.com/skysoft2593/mqhc/blob/master/BagvI_wrVr.md
https://gitee.com/skysoft2593/mqhc/blob/master/4b886_j6Bj.md
https://gitee.com/skysoft2593/mqhc/blob/master/I84ND_mz0Q.md
https://gitee.com/skysoft2593/mqhc/blob/master/rJYpw_M5UV.md
https://gitee.com/skysoft2593/mqhc/blob/master/tqjPO_42UD.md
https://gitee.com/skysoft2593/mqhc/blob/master/Kelpe_ERJN.md
https://gitee.com/skysoft2593/mqhc/blob/master/byMCx_lsKi.md
https://gitee.com/skysoft2593/mqhc/blob/master/zUA8O_O3d2.md
https://gitee.com/skysoft2593/mqhc/blob/master/JcRRp_FRwm.md
https://gitee.com/skysoft2593/mqhc/blob/master/hu6pa_32td.md
https://gitee.com/skysoft2593/mqhc/blob/master/IvBnH_c7Ul.md
https://gitee.com/skysoft2593/mqhc/blob/master/tqBTU_cNJx.md
https://gitee.com/skysoft2593/mqhc/blob/master/TmHNC_UY3a.md
https://gitee.com/skysoft2593/mqhc/blob/master/9fFEW_0hvr.md
https://gitee.com/skysoft2593/mqhc/blob/master/RBapf_ZjjN.md
https://gitee.com/skysoft2593/mqhc/blob/master/8hlX2_CkhF.md
https://gitee.com/skysoft2593/mqhc/blob/master/rWzNl_bTNa.md
https://gitee.com/skysoft2593/mqhc/blob/master/GCrB9_KTxk.md
https://gitee.com/skysoft2593/mqhc/blob/master/xyBc4_HD5x.md
https://gitee.com/skysoft2593/mqhc/blob/master/vQm2b_0Y32.md
https://gitee.com/skysoft2593/mqhc/blob/master/cgtNQ_QZWx.md
https://gitee.com/skysoft2593/mqhc/blob/master/dMBth_d0UY.md
https://gitee.com/skysoft2593/mqhc/blob/master/J3hOR_FUvJ.md
https://gitee.com/skysoft2593/mqhc/blob/master/xtnNn_WFp9.md
https://gitee.com/skysoft2593/mqhc/blob/master/FHtvH_ndmg.md
https://gitee.com/skysoft2593/mqhc/blob/master/2Wbv8_W3YM.md
https://gitee.com/skysoft2593/mqhc/blob/master/SyD5Z_S4I7.md
https://gitee.com/skysoft2593/mqhc/blob/master/0XmWv_YlXB.md
https://gitee.com/skysoft2593/mqhc/blob/master/TBDCb_8HsA.md
https://gitee.com/skysoft2593/mqhc/blob/master/3iKcU_iMnM.md
https://gitee.com/skysoft2593/mqhc/blob/master/21iPq_mYRW.md
https://gitee.com/skysoft2593/mqhc/blob/master/er9ee_7R7J.md
https://gitee.com/skysoft2593/mqhc/blob/master/M4vxA_5OY4.md
https://gitee.com/skysoft2593/mqhc/blob/master/dyau6_bVjw.md
https://gitee.com/skysoft2593/mqhc/blob/master/0mD3D_v3jr.md
https://gitee.com/skysoft2593/mqhc/blob/master/vTyzS_hEm2.md
https://gitee.com/skysoft2593/mqhc/blob/master/tyUVv_IDP0.md
https://gitee.com/skysoft2593/mqhc/blob/master/5lgKu_gy6N.md
https://gitee.com/skysoft2593/mqhc/blob/master/hhj2y_Hid0.md
https://gitee.com/skysoft2593/mqhc/blob/master/8mpaX_z1B1.md
https://gitee.com/skysoft2593/mqhc/blob/master/IbWRE_9Rza.md
https://gitee.com/skysoft2593/mqhc/blob/master/jFN6H_hyLy.md
https://gitee.com/skysoft2593/mqhc/blob/master/FLK0p_wauI.md
https://gitee.com/skysoft2593/mqhc/blob/master/2ewbn_XA3T.md
https://gitee.com/skysoft2593/mqhc/blob/master/gb6wC_YvOb.md
https://gitee.com/skysoft2593/mqhc/blob/master/m6FLs_eUl4.md
https://gitee.com/skysoft2593/mqhc/blob/master/ALWYP_TaVo.md
https://gitee.com/skysoft2593/mqhc/blob/master/ODxCi_bQHX.md
https://gitee.com/skysoft2593/mqhc/blob/master/ZNvzH_zB3a.md
https://gitee.com/skysoft2593/mqhc/blob/master/DYMXV_TfYu.md
https://gitee.com/skysoft2593/mqhc/blob/master/Tq6FP_qZ6C.md
https://gitee.com/skysoft2593/mqhc/blob/master/475F9_8HAA.md
https://gitee.com/skysoft2593/mqhc/blob/master/chewO_29LN.md
https://gitee.com/skysoft2593/mqhc/blob/master/oe4QV_DVRu.md
https://gitee.com/skysoft2593/mqhc/blob/master/hQQNc_raQh.md
https://gitee.com/skysoft2593/mqhc/blob/master/nxEbI_4vLu.md
https://gitee.com/skysoft2593/mqhc/blob/master/ET5wA_EikI.md
https://gitee.com/skysoft2593/mqhc/blob/master/XKWDw_2444.md
https://gitee.com/skysoft2593/mqhc/blob/master/QC0KI_4MiG.md
https://gitee.com/skysoft2593/mqhc/blob/master/G4DLl_2Qny.md
https://gitee.com/skysoft2593/mqhc/blob/master/k6bqQ_1sz1.md
https://gitee.com/skysoft2593/mqhc/blob/master/a5XTM_BHdL.md
https://gitee.com/skysoft2593/mqhc/blob/master/8X2zg_CFSk.md
https://gitee.com/skysoft2593/mqhc/blob/master/aB4Ik_G4Uy.md
https://gitee.com/skysoft2593/mqhc/blob/master/LYVSb_XIBx.md
https://gitee.com/skysoft2593/mqhc/blob/master/u3yfI_tMAx.md
https://gitee.com/skysoft2593/mqhc/blob/master/aNkB7_wknQ.md
https://gitee.com/skysoft2593/mqhc/blob/master/4zKKP_w5PF.md
https://gitee.com/skysoft2593/mqhc/blob/master/ImcE4_oC0c.md
https://gitee.com/skysoft2593/mqhc/blob/master/HWMeA_lBHu.md
https://gitee.com/skysoft2593/mqhc/blob/master/4MeRu_ASJp.md
https://gitee.com/skysoft2593/mqhc/blob/master/rgr5k_qBl0.md
https://gitee.com/skysoft2593/mqhc/blob/master/FTeAR_wnh6.md
https://gitee.com/skysoft2593/mqhc/blob/master/P7SsZ_Q1qy.md
https://gitee.com/skysoft2593/mqhc/blob/master/BVIJQ_sBcJ.md
https://gitee.com/skysoft2593/mqhc/blob/master/0bBDj_R7tH.md
https://gitee.com/skysoft2593/mqhc/blob/master/ad6bf_bS4q.md
https://gitee.com/skysoft2593/mqhc/blob/master/WJoPu_CLLz.md
https://gitee.com/skysoft2593/mqhc/blob/master/JhX4L_GHTz.md
https://gitee.com/skysoft2593/mqhc/blob/master/Opu8s_SBOq.md
https://gitee.com/skysoft2593/mqhc/blob/master/0ZxKb_Pd1o.md
https://gitee.com/skysoft2593/mqhc/blob/master/oMIBg_156q.md
https://gitee.com/skysoft2593/mqhc/blob/master/xInzx_4W1x.md
https://gitee.com/skysoft2593/mqhc/blob/master/bQLjQ_Csg3.md
https://gitee.com/skysoft2593/mqhc/blob/master/hHbDr_z9c2.md
https://gitee.com/skysoft2593/mqhc/blob/master/LoEdN_kS1D.md
https://gitee.com/skysoft2593/mqhc/blob/master/5hD30_KD0w.md
https://gitee.com/skysoft2593/mqhc/blob/master/Q21WM_3roS.md
https://gitee.com/skysoft2593/mqhc/blob/master/nllpe_IqYY.md
https://gitee.com/skysoft2593/mqhc/blob/master/egytn_r27D.md
https://gitee.com/skysoft2593/mqhc/blob/master/2BOOO_Dz3x.md
https://gitee.com/skysoft2593/mqhc/blob/master/MFiz8_TJwb.md
https://gitee.com/skysoft2593/mqhc/blob/master/12oPI_zW4f.md
https://gitee.com/skysoft2593/mqhc/blob/master/Fs6DO_DavO.md
https://gitee.com/skysoft2593/mqhc/blob/master/11r9f_TEKj.md
https://gitee.com/skysoft2593/mqhc/blob/master/uZA50_O8UW.md
https://gitee.com/skysoft2593/mqhc/blob/master/E1cGN_D2K6.md
https://gitee.com/skysoft2593/mqhc/blob/master/p0FzR_6SWg.md
https://gitee.com/skysoft2593/mqhc/blob/master/KmYkW_aQIi.md
https://gitee.com/skysoft2593/mqhc/blob/master/hF9mA_GnBH.md
https://gitee.com/skysoft2593/mqhc/blob/master/JDOB5_zXH3.md
https://gitee.com/skysoft2593/mqhc/blob/master/KPnGS_RCMN.md
https://gitee.com/skysoft2593/mqhc/blob/master/7Bf1w_0pg6.md
https://gitee.com/skysoft2593/mqhc/blob/master/bNt2n_o2yx.md
https://gitee.com/skysoft2593/mqhc/blob/master/wQRkh_rgP2.md
https://gitee.com/skysoft2593/mqhc/blob/master/wfZhL_VmN1.md
https://gitee.com/skysoft2593/mqhc/blob/master/9SDl6_t12L.md
https://gitee.com/skysoft2593/mqhc/blob/master/c6KEV_TzPk.md
https://gitee.com/skysoft2593/mqhc/blob/master/Zrl06_HpPE.md
https://gitee.com/skysoft2593/mqhc/blob/master/GcRjQ_oP0C.md
https://gitee.com/skysoft2593/mqhc/blob/master/SN9LU_uehL.md
https://gitee.com/skysoft2593/mqhc/blob/master/0WCDF_VJLs.md
https://gitee.com/skysoft2593/mqhc/blob/master/NZVjZ_cPKf.md
https://gitee.com/skysoft2593/mqhc/blob/master/0FYwb_HEfq.md
https://gitee.com/skysoft2593/mqhc/blob/master/2FKoQ_c40D.md
https://gitee.com/skysoft2593/mqhc/blob/master/V5rXL_3f7v.md
https://gitee.com/skysoft2593/mqhc/blob/master/YTOqr_IUu1.md
https://gitee.com/skysoft2593/mqhc/blob/master/ou8tm_ZM1C.md
https://gitee.com/skysoft2593/mqhc/blob/master/FY4nj_qQaF.md
https://gitee.com/skysoft2593/mqhc/blob/master/27wVp_aPTl.md
https://gitee.com/skysoft2593/mqhc/blob/master/mYH7k_V0Pp.md
https://gitee.com/skysoft2593/mqhc/blob/master/k1rnW_ok2i.md
https://gitee.com/skysoft2593/mqhc/blob/master/PHuPS_3KQs.md
https://gitee.com/skysoft2593/mqhc/blob/master/j6VkV_wnlf.md
https://gitee.com/skysoft2593/mqhc/blob/master/KUlH9_3JHb.md
https://gitee.com/skysoft2593/mqhc/blob/master/lzwLK_0rBW.md
https://gitee.com/skysoft2593/mqhc/blob/master/iOHgn_pAkM.md
https://gitee.com/skysoft2593/mqhc/blob/master/0wTe7_3Iaa.md
https://gitee.com/skysoft2593/mqhc/blob/master/Gy91J_wXkB.md
https://gitee.com/skysoft2593/mqhc/blob/master/AzoXT_qzau.md
https://gitee.com/skysoft2593/mqhc/blob/master/It53l_QFLI.md
https://gitee.com/skysoft2593/mqhc/blob/master/fhasw_6M7C.md
https://gitee.com/skysoft2593/mqhc/blob/master/qcIzP_RDYS.md
https://gitee.com/skysoft2593/mqhc/blob/master/OYUsX_VnEw.md
更多推荐

所有评论(0)