更新记录

1.0.0(2026-07-16)

首次发布

新增

  • 双端网络连通探测:统一 checkReachable() API,一次调用覆盖 Android / iOS
  • HTTPS 自签名证书跳过trustAllCerts 一键放行,适配企业内网、私有化部署、IP 直连环境
  • 任意响应码即判定可达:与 uni.request 的 success/fail 语义一致,便于无缝替换
  • Android 子线程探测:网络请求在 Thread 中执行,runOnUiThread 回调切主线程,不阻塞 UI(避免 ANR)
  • iOS 同步等待 + 主线程回调DispatchSemaphore 同步等待 URLSession.dataTaskDispatchQueue.main.async 回调
  • 超时配置timeout 参数,默认 10 秒
  • 资源释放:Android finally 确保 HttpURLConnection.disconnect(),无连接泄漏
  • 回调闭环完备:成功 / 失败 / 异常 / 极端无响应均有回调,调用方不会"等不到结果"

平台兼容性

uni-app x(4.0)

Chrome Safari Android Android插件版本 iOS iOS插件版本 鸿蒙 微信小程序
× × 6.0 1.0.0 15 1.0.0 - ×

其他

多语言 暗黑模式 宽屏模式
× ×

liyq-netcheck

一行代码,检测内网服务是否在线 · 自签名证书也能精准探测

🌟 特别适合:企业内网、私有化部署、HTTPS 自签名证书、IP 直连服务的可达性检测

checkReachable 是一款基于 UTS(uni TypeScript) 的原生插件,专解决 uni.request / uni.downloadFile 无法探测自签名 HTTPS 内网服务的痛点——浏览器能访问,App 里却一直 fail。插件在网络层跳过 SSL 证书校验,任意 HTTP 响应即判定服务可达,覆盖 Android / iOS 双端。

适用场景:App 启动时检测内网服务在线状态、web-view 加载业务页前的可达性预检、服务健康检查、私有化部署环境探测、IP 直连/自签名证书服务器连通性判断……


为什么需要 liyq-netcheck?

如果你在做企业内网 App,一定遇到过这个死结:

现象 原因
内网服务浏览器能打开,App 里 uni.request 探测却一直 fail 服务用了自签名证书,App 原生网络栈(NSURLSession / HttpURLConnection)只信任系统 CA,不信任自签名 → TLS 握手失败
浏览器能访问是因为手动点了"高级 → 继续前往" 原生网络栈不会做这种交互式覆盖
manifestnsallowsarbitraryloads:true / cleartextTrafficPermitted:true 都设了还是不行 这两个配置只放宽明文 HTTP不解决 HTTPS 自签名信任
想用 uni.requestsslVerify:false uni-app x 没有这个选项

liyq-netcheck 的解决方案:在网络层用原生 UTS 插件跳过证书校验,做一次轻量 GET 探测——能收到任意 HTTP 响应(含 4xx/5xx)就说明服务在线,只有真正超时/断网才判定不可达。

import { checkReachable } from '@/uni_modules/liyq-netcheck'

checkReachable({
  url: 'https://192.168.1.100:8443/api/health',  // 内网自签名 + IP 直连
  timeout: 5000,
  success: () => { console.log('服务在线') },
  fail: (err) => { console.log('服务不可达:', err) }
})

与 liyq-down-save 的区别

两款插件都内置 trustAllCerts 机制,但定位不同,按需选用或搭配:

liyq-netcheck liyq-down-save
定位 连通性探测(轻量) 文件下载保存(重量)
做什么 判断服务是否在线 下载文件并存到系统目录
传输数据 不传不收(只看响应码) 完整下载文件内容
典型场景 App 启动检测、web-view 预检、健康检查 报表导出、附件下载、内网文件拉取

常见搭配:启动时用 netCheck 探测内网是否在线,在线后再用 down-save 下载业务文件。


平台支持

平台 支持状态 说明
Android (uni-app-x) 子线程探测,不阻塞 UI;INTERNET 权限(默认含)
iOS (uni-app-x) UTS-iOS 默认子线程 + DispatchSemaphore 同步;无额外权限
HarmonyOS 后续按需支持
H5 / 小程序 非原生场景,浏览器自有证书处理

最低版本要求:HBuilderX 3.6.8+,uni-app-x 4.0+


快速开始

安装

liyq-netcheck 从 DCloud 插件市场导入,或手动把 liyq-netcheck/ 目录放入项目的 uni_modules/

三秒上手

import { checkReachable } from '@/uni_modules/liyq-netcheck'

checkReachable({
  url: 'https://internal.company.com:8443/',
  success: () => {
    uni.showToast({ title: '服务在线' })
  },
  fail: (err) => {
    uni.showToast({ title: '服务不可达', icon: 'none' })
  }
})

API 文档

checkReachable(options)

探测目标地址的连通性(跳过 SSL 证书校验)。

参数

属性 类型 必填 默认值 说明
url string 目标地址(支持 HTTP / HTTPS,自签名证书与 IP 直连均可)
timeout number 10000 超时时间(毫秒)
success function 收到任意 HTTP 响应(含 4xx/5xx)触发,表示服务可达
fail function 连接超时 / 网络中断 / DNS 失败时触发,参数为错误描述 string

判定语义

  • success:收到任意 HTTP 状态码(200/4xx/5xx 都算)——服务进程在线、端口开放、能响应
  • fail:连接超时、网络中断、DNS 解析失败——服务不可达

这与 uni.requestsuccess/fail 语义一致(uni.request 的 success 在任意状态码触发),便于无缝替换。


使用示例

1. App 启动检测内网服务

checkReachable({
  url: 'https://10.0.0.88:1001/api/ping',
  timeout: 5000,
  success: () => {
    // 服务在线,进入业务页
    uni.redirectTo({ url: '/pages/index/index' })
  },
  fail: () => {
    // 服务不可达,提示连接 VPN 或内网
    uni.showModal({
      title: '无法连接服务',
      content: '请确认已连接企业内网或 VPN',
      showCancel: false
    })
  }
})

2. web-view 加载前的可达性预检

避免 web-view 直接加载不可达地址导致白屏等待:

checkReachable({
  url: 'https://internal.company.com/mobile/',
  timeout: 8000,
  success: () => {
    // 服务在线,加载 web-view
    viewCfg.state = true
  },
  fail: () => {
    // 服务不可达,展示错误页 + 重试
    viewCfg.state = false
    viewCfg.loading = false
  }
})

3. 服务健康检查轮询

const healthCheck = () => {
  checkReachable({
    url: 'https://api.internal.com/health',
    timeout: 3000,
    success: () => console.log('✅ 服务正常'),
    fail: (err) => console.error('❌ 服务异常:', err)
  })
}
setInterval(healthCheck, 60000)  // 每分钟检测一次

各平台实现机制

Android

  • 子线程探测:网络请求在 Thread 中执行,不阻塞 UI 线程,避免 ANR
  • 回调切主线程:通过 runOnUiThread 回到主线程触发 success/fail
  • 证书跳过hybrid.kt 注入自定义 SSLContext + TrustAllManager + HostnameVerifier(与 liyq-down-save 同源,经实战验证)
  • 资源释放finally 确保 HttpURLConnection.disconnect(),无连接泄漏

iOS

  • 子线程同步:UTS-iOS 方法默认在子线程执行,DispatchSemaphore 同步等待 URLSession.dataTask 回调
  • 回调切主线程DispatchQueue.main.async 确保回调在主线程
  • 证书跳过URLSessionDelegate 实现 urlSession(_:didReceive:completionHandler:),返回 .useCredential 接受自签名证书
  • 兜底完备:dataTask 无响应/异常/超时均有 fail 回调,不会让调用方"等不到结果"

技术特性

trustAllCerts 证书跳过

通过原生层跳过 HTTPS 证书校验,完整覆盖企业内网、私有化部署、IP 直连、自签名证书场景:

平台 旁路机制
Android 自定义 SSLContext + X509TrustManager(hybrid.kt 原生 Kotlin 混编)+ HostnameVerifier
iOS URLSessionDelegateurlSession(_:didReceive:completionHandler:) 返回 .useCredential

⚠️ 安全提醒trustAllCerts 跳过全部 HTTPS 证书校验,仅限可信内网环境使用。公网请求请用 uni.request(系统默认校验)。本插件设计上只做 GET 连通探测、不传输敏感数据,风险可控。

为什么任意响应码都算可达?

checkReachable 的语义是"服务是否在线",不是"接口是否正常"。一个返回 500 的服务,其进程依然在运行、端口依然开放、能响应请求——从"连通性"角度它是可达的。这与 uni.requestsuccess(任意状态码触发)语义一致,便于无缝替换原有探测逻辑。

不阻塞 UI

  • Android:原生 Thread 子线程 + runOnUiThread 回调,主线程零阻塞
  • iOS:UTS-iOS 默认子线程 + DispatchSemaphore + DispatchQueue.main.async

常见问题

Q: 为什么不直接用 uni.request + sslVerify?

uni-app x 的 uni.request 没有 sslVerify 选项,且底层走系统网络栈,无法跳过自签名证书校验。这是系统级限制,非配置可解决。

Q: trustAllCerts 安全吗?

trustAllCerts 跳过证书校验,仅限可信内网环境。本插件只做 GET 连通探测、不传 body/headers/敏感数据,风险面极小。公网服务请用 uni.request

Q: 能探测非 HTTP 服务(如 TCP/数据库端口)吗?

当前版本专注 HTTP/HTTPS 连通探测。若需裸 TCP 端口探测,可反馈需求评估。

Q: Android 探测会卡 UI 吗?

不会。 Android 端网络请求在 Thread 子线程执行,回调通过 runOnUiThread 切回主线程,全程不阻塞 UI。

Q: 如何反馈 Bug 或提需求?

请通过 DCloud 插件市场「问答反馈」联系作者,通常 24 小时内响应。


版本更新

详见 changelog.md

售后与支持

  • Bug 修复:购买后终身享受 Bug 修复更新
  • 使用咨询:通过插件市场「问答反馈」,24 小时内响应
  • 功能建议:欢迎提交需求,高优先级功能将在后续版本实现

授权许可

版本 价格 授权范围
标准版 ¥9.9 编译产物,可在任意数量个人/企业项目中使用
源码版 ¥99.0 完整源码,可自由修改、二次开发、定制功能

授权说明:购买即授权在任意数量项目中使用。源码版可自由修改与二次开发。禁止转售、重新分发或上传至其他插件市场。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android 需 INTERNET 权限(uni-app x 默认包含);iOS 无需任何额外权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件仅做 HTTP GET 连通探测,不采集、不上传任何用户数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。