更新记录
1.0.0(2026-09-24)
- 设备风险检测:USB 调试、无线调试、系统 HTTP 转发、虚拟专网,以及调用方配置的风险应用,支持 Android、iOS、鸿蒙。
平台兼容性
uni-app(4.83)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.83)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | √ | √ | × |
umi-risk
设备风险检测插件,适用于 uni-app x。在本机判断 USB / 无线调试、系统 HTTP 转发、虚拟专网,以及调用方配置的风险应用是否存在。检测结果不上传,也不扫描全部已安装应用。
支持平台:uni-app x 和 uni-app 的 Android、iOS、鸿蒙。不支持 Web、小程序、元服务。
| 环境 | 要求 |
|---|---|
| HBuilderX | 4.83 及以上 |
| uni-app x | 4.83 及以上 |
| Android | minSdk 21 |
| iOS | 12.0 及以上 |
引入
插件放在工程的 uni_modules/umi-risk 后即可使用,无需额外配置依赖。
import { checkDeviceRisk } from '@/uni_modules/umi-risk'
快速使用
const report = checkDeviceRisk({
packages: [
{ packageName: 'com.example.riskapp', name: '自定义规则' }
]
})
if (report.risky) {
console.log(report.usbDebug, report.httpProxy, report.vpn, report.riskApps)
}
packages 与内置名单合并。不需要追加时传 null,或把 packages 设为 null。
checkDeviceRisk(null)
checkDeviceRisk
function checkDeviceRisk(options: RiskCheckOptions | null): DeviceRiskResult
同步返回。risky 为 usbDebug、usbDebugWifi、httpProxy、vpn、riskApps 任一命中。
RiskCheckOptions
| 字段 | 类型 | 说明 |
|---|---|---|
| packages | RiskAppRule[] \| null |
追加的风险应用。null 时只用内置名单 |
RiskAppRule
| 字段 | 类型 | 说明 |
|---|---|---|
| packageName | string | Android / 鸿蒙包名。iOS、鸿蒙也可传 URL Scheme,见下方「自定义应用」。不要把具体产品名写进商店文案 |
| name | string | 命中后回传的展示名 |
DeviceRiskResult
| 字段 | 类型 | 说明 |
|---|---|---|
| supported | boolean | 当前三端均为 true |
| usbDebug | boolean | 有线调试或调试器是否处于可检测状态,语义见平台差异 |
| usbDebugWifi | boolean | 无线调试。Android 11 以下和 iOS 恒为 false |
| httpProxy | boolean | 系统 HTTP 或 HTTPS 转发已配置且端口有效 |
| proxyHost | string | 转发主机。未命中时为空字符串 |
| proxyPort | number | 转发端口。未命中时为 0 |
| vpn | boolean | 系统虚拟专网,或网卡名命中隧道前缀 |
| vpnHints | string[] | 命中依据。可能是 TRANSPORT_VPN、BEARER_VPN,或 tun0 这类网卡名 |
| riskApps | RiskAppHit[] | 已安装或可唤起的风险应用 |
| risky | boolean | 任一项命中 |
RiskAppHit
| 字段 | 类型 | 说明 |
|---|---|---|
| packageName | string | 命中规则上的包名或 scheme |
| name | string | 规则上的展示名 |
单独调用
需要只查一项时,可以直接用下面的函数。返回值与 checkDeviceRisk 对应字段一致。
| 函数 | 返回 | 说明 |
|---|---|---|
isUsbDebugEnabled() |
boolean | 同 usbDebug |
isUsbDebugWifiEnabled() |
boolean | 同 usbDebugWifi |
readHttpProxy() |
string[] | [host, port]。未命中为 ['', '0'] |
isVpnOnline() |
string[] | 同 vpnHints。空数组表示未检测到虚拟专网 |
findRiskApps(extra) |
RiskAppHit[] | extra 为追加规则,null 表示只用内置名单 |
平台差异
Android
usbDebug:读取ADB_ENABLED,先 Global,再 Secure。usbDebugWifi:Android 11(API 30)及以上读取adb_wifi_enabled。- HTTP 转发:优先
ConnectivityManager.getDefaultProxy()(API 23+),否则依次读http.proxyHost/http.proxyPort、https.proxyHost/https.proxyPort。 - 虚拟专网:任一网络的
TRANSPORT_VPN,或已启用且名称以tun、ppp、pptp开头的网卡。 - 风险应用:
PackageManager.getPackageInfo能取到即视为已安装。只查内置名单和packages,不枚举全部应用。
iOS
系统没有 ADB 开关,调试项的含义与 Android 不同。
usbDebug:当前进程是否被调试器附加(P_TRACED)。Xcode 有线或无线调试附加后为true;只打开开发者模式、未附加调试器时为false。usbDebugWifi:恒为false。- HTTP 转发:读系统设置里已启用的 HTTP,没有再读 HTTPS。
- 虚拟专网:系统设置
__SCOPED__里名称包含tap、tun、ppp、pptp、ipsec的接口。这是网卡特征,不是 NetworkExtension 的官方虚拟专网状态。 - 风险应用:
canOpenURL。packageName回传规则里的包名或 scheme,不代表能读到真实 Bundle ID。
canOpenURL 只能查询写入 LSApplicationQueriesSchemes 的 scheme。内置 scheme 和运行时追加的 scheme 都要写在宿主 manifest.json 的 app-ios.distribute.urlschemewhitelist,否则稳定返回未安装。Apple 对可查询 scheme 数量有上限(当前为 50)。写法见「权限配置」。
鸿蒙
usbDebug/usbDebugWifi:读adb_enabled、adb_wifi_enabled。普通应用经常没有读取权限,读不到时为false,不能据此判断调试一定关闭。- HTTP 转发:先读设置项
http_proxy、global_http_proxy_host、global_http_proxy_port;没有再使用connection.getDefaultHttpProxy()的缓存。排除列表为['*']时视为未启用转发。getDefaultHttpProxy是异步的,模块加载时会先请求一次;若设置项为空且缓存尚未返回,当次调用可能暂时看不到转发。 - 虚拟专网:
BEARER_VPN,或接口名以tun、utun、ppp、pptp、ipsec开头。 - 风险应用:先
getBundleInfoSync,失败再canOpenLink。普通应用查询未授权的包名会被系统拒绝。canOpenLink的 scheme 必须写在宿主harmony-configs/entry/src/main/module.json5的querySchemes,否则链路检测无效。
自定义应用
packages 在三端都会并入检测,但识别方式不同。
| 写法 | Android | iOS | 鸿蒙 |
|---|---|---|---|
com.example.app |
按包名查询 | 仅当该包名已在内置 scheme 表中才查;未知包名跳过 | 按包名查,并用内置表里的 scheme 做 canOpenLink |
customscheme(不含 .) |
按包名查询,通常查不到 | 当作 scheme | 当作 scheme,做 canOpenLink |
myapp:// |
整串当作包名 | 取 :// 前的 myapp 作为 scheme |
同上 |
iOS 追加 scheme、鸿蒙追加 canOpenLink 时,记得同步改宿主的查询名单,见「权限配置」。
内置名单
Android 按包名检测。iOS、鸿蒙还会按 URL Scheme 检测。名单在 utssdk/common/rules.uts,同一包名或同一 scheme 只记一次。
上架说明、应用商店文案和隐私政策正文用「风险应用」统称,不要粘贴具体产品名、包名或 scheme。宿主查询配置仍须与 rules.uts 一致。
权限配置
读取 USB / 无线调试不弹授权框,也不需要额外权限。系统 HTTP 转发和虚拟专网在 Android、鸿蒙需要声明网络状态;按包名或 scheme 查询风险应用需要包可见性或 scheme 白名单。iOS 读转发和虚拟专网不用额外权限。
Android、iOS 写在宿主工程根目录的 manifest.json。鸿蒙写在 harmony-configs/entry/src/main/module.json5。插件不再自带这些清单,不配置则对应检测无效。
Android
写在 manifest.json 的 app-android.distribute.permissions。
| 权限 | 作用 |
|---|---|
android.permission.ACCESS_NETWORK_STATE |
读取当前网络是否为虚拟专网,以及系统默认 HTTP 转发 |
android.permission.QUERY_ALL_PACKAGES |
Android 11 及以上按包名查询风险应用。没有这项、且包名不在 <queries> 里时,已安装也会被当成未安装 |
宿主完整示例:
{
"app-android": {
"distribute": {
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.QUERY_ALL_PACKAGES\"/>"
]
}
}
}
android:name 里的双引号前面要加反斜杠。改完后需重新云端打包。
上架 Google Play 时,QUERY_ALL_PACKAGES 审核很严。应改成写死要查询的包名,并去掉该权限。manifest.json 里强制移除:
{
"app-android": {
"distribute": {
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>"
],
"excludePermissions": [
"<uses-permission android:name=\"android.permission.QUERY_ALL_PACKAGES\"/>"
]
}
}
}
包名可见性写在工程根目录的 AndroidManifest.xml(HBuilderX 里对项目右键「新建」→「自定义文件」)。只保留实际要查的包名,与 rules.uts 对齐。下面是占位示例,不要把真实包名写进商店文案:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="替换为云打包使用的 Android 包名">
<queries>
<package android:name="com.example.risk.one" />
<package android:name="com.example.risk.two" />
</queries>
</manifest>
运行时通过 packages 传入、但没写进 <queries> 的包名,在 Android 11 及以上查不到。
国内应用商店通常把读取已安装应用列表视为个人信息。隐私政策需要写明:仅在本机判断 USB 调试、系统 HTTP 转发、虚拟专网,以及调用方配置的风险应用是否安装,不上传应用列表。隐私政策里同样不要写具体产品名。
iOS
没有需要填写用途说明的系统权限。风险应用走 canOpenURL,scheme 必须在应用访问白名单 LSApplicationQueriesSchemes 里。
内置 scheme 和运行时追加的 scheme 都要写在 manifest.json 的 app-ios.distribute.urlschemewhitelist,多个 scheme 用英文逗号分隔,总数不超过 50。漏掉的 scheme,canOpenURL 稳定返回未安装。
{
"app-ios": {
"distribute": {
"urlschemewhitelist": "scheme1,scheme2"
}
}
}
追加自定义 scheme 时接到逗号后面,例如再加 myapp:
{
"app-ios": {
"distribute": {
"urlschemewhitelist": "scheme1,scheme2,myapp"
}
}
}
改完后需重新云端打包。不在白名单里的 scheme,canOpenURL 稳定返回未安装。
鸿蒙
写在 harmony-configs/entry/src/main/module.json5。插件不声明这两项。
| 配置 | 作用 |
|---|---|
ohos.permission.GET_NETWORK_INFO |
读取网络承载类型,判断是否为虚拟专网,并读取默认 HTTP 转发。普通权限,安装时授予,不弹窗 |
querySchemes |
canOpenLink 允许查询的 scheme。没写在这里的 scheme,链路检测无效。数量上限 50 |
adb_enabled 一类调试开关经常因普通应用没有读取权限而读不到,读不到时结果为 false,不能据此判断调试已关闭。系统没有给普通应用开放的对应权限可配。
在现有 entry 的 module 上补这两处。querySchemes 需要覆盖内置名单;通过 packages 追加的 scheme 也要加进来。
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone"
],
"deliveryWithInstall": true,
"installationFree": false,
"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"description": "$string:EntryAbility_desc",
"icon": "$media:layered_image",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
]
}
],
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.GET_NETWORK_INFO"
}
],
"querySchemes": [
"scheme1",
"scheme2"
]
}
}
ohos.permission.INTERNET 是应用访问网络用的,插件检测本身不依赖它。已有工程只追加 GET_NETWORK_INFO 和 querySchemes,不要整文件覆盖掉自己的 abilities。
结果怎么用
命中表示环境里存在对应特征,不表示用户正在监听流量或设备已被入侵。企业虚拟专网、系统调试开关、合法的网络转发应用都会让 risky 为 true。业务上建议展示具体命中项,由产品决定是提示、限制还是放行。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 1469
赞赏 4
下载 12638763
赞赏 1950
赞赏
京公网安备:11010802035340号