更新记录

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

同步返回。riskyusbDebugusbDebugWifihttpProxyvpnriskApps 任一命中。

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_VPNBEARER_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.proxyPorthttps.proxyHost / https.proxyPort
  • 虚拟专网:任一网络的 TRANSPORT_VPN,或已启用且名称以 tunppppptp 开头的网卡。
  • 风险应用:PackageManager.getPackageInfo 能取到即视为已安装。只查内置名单和 packages,不枚举全部应用。

iOS

系统没有 ADB 开关,调试项的含义与 Android 不同。

  • usbDebug:当前进程是否被调试器附加(P_TRACED)。Xcode 有线或无线调试附加后为 true;只打开开发者模式、未附加调试器时为 false
  • usbDebugWifi:恒为 false
  • HTTP 转发:读系统设置里已启用的 HTTP,没有再读 HTTPS。
  • 虚拟专网:系统设置 __SCOPED__ 里名称包含 taptunppppptpipsec 的接口。这是网卡特征,不是 NetworkExtension 的官方虚拟专网状态。
  • 风险应用:canOpenURLpackageName 回传规则里的包名或 scheme,不代表能读到真实 Bundle ID。

canOpenURL 只能查询写入 LSApplicationQueriesSchemes 的 scheme。内置 scheme 和运行时追加的 scheme 都要写在宿主 manifest.jsonapp-ios.distribute.urlschemewhitelist,否则稳定返回未安装。Apple 对可查询 scheme 数量有上限(当前为 50)。写法见「权限配置」。

鸿蒙

  • usbDebug / usbDebugWifi:读 adb_enabledadb_wifi_enabled。普通应用经常没有读取权限,读不到时为 false,不能据此判断调试一定关闭。
  • HTTP 转发:先读设置项 http_proxyglobal_http_proxy_hostglobal_http_proxy_port;没有再使用 connection.getDefaultHttpProxy() 的缓存。排除列表为 ['*'] 时视为未启用转发。getDefaultHttpProxy 是异步的,模块加载时会先请求一次;若设置项为空且缓存尚未返回,当次调用可能暂时看不到转发。
  • 虚拟专网:BEARER_VPN,或接口名以 tunutunppppptpipsec 开头。
  • 风险应用:先 getBundleInfoSync,失败再 canOpenLink。普通应用查询未授权的包名会被系统拒绝。canOpenLink 的 scheme 必须写在宿主 harmony-configs/entry/src/main/module.json5querySchemes,否则链路检测无效。

自定义应用

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.jsonapp-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.jsonapp-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_INFOquerySchemes,不要整文件覆盖掉自己的 abilities

结果怎么用

命中表示环境里存在对应特征,不表示用户正在监听流量或设备已被入侵。企业虚拟专网、系统调试开关、合法的网络转发应用都会让 riskytrue。业务上建议展示具体命中项,由产品决定是提示、限制还是放行。

隐私、权限声明

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

需由宿主配置,插件不自带清单。Android manifest.json:QUERY_ALL_PACKAGES、ACCESS_NETWORK_STATE。iOS manifest.json:urlschemewhitelist(LSApplicationQueriesSchemes)。鸿蒙 harmony-configs 的 module.json5:ohos.permission.GET_NETWORK_INFO、querySchemes。

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

仅在本机判断 USB 调试、系统 HTTP 转发、虚拟专网和调用方配置的风险应用是否安装,不上传应用列表。Android 11+ 配置包名能在运行时生效需要 QUERY_ALL_PACKAGES;上架 Google Play 时应改为 manifest queries 写死包名。国内应用商店把读取已安装应用列表视为个人信息,隐私政策需写明用途,且不要写具体产品名。

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

暂无用户评论。