——以"灵犀安全"反诈 App 系统通知监听模块为例
一、背景
随着移动应用功能不断复杂化,单纯依靠跨端框架已经无法满足所有业务需求。
例如:
在"灵犀安全"反诈 App 中,需要实现:
- 监听系统通知;
- 获取其他应用通知内容;
- 后台持续运行;
- 调用 Android 系统级 API;
- 获取剪贴板变化;
- 使用系统级服务。
但是 UniApp 默认运行环境只能访问封装后的跨端 API。
例如:
uni.request()
uni.showToast()
uni.navigateTo()
这些接口无法直接访问:
Android Framework
NotificationManager
NotificationListenerService
ClipboardManager
Service
因此需要引入:
UTS 原生插件机制,实现跨端框架与 Android 原生能力之间的桥接。
二、为什么选择 UniApp + UTS?
目前移动端开发主要有几种方案:
| 方案 | 优势 | 不足 |
|---|---|---|
| 原生 Android | 性能最高 | 开发成本高 |
| Flutter | 跨平台强 | 系统能力扩展复杂 |
| React Native | 生态丰富 | 原生桥接成本高 |
| UniApp | 开发效率高 | 系统能力有限 |
"灵犀安全"项目选择:
UniApp + UTS + Kotlin
原因:
1. 保留跨平台开发效率
UI:
Vue语法
↓
uvue页面
快速完成:
- 首页
- 风险展示
- 守护列表
- 设置页面
2. 原生能力可扩展
通过UTS:
JavaScript
↓
UTS
↓
Kotlin
↓
Android API
实现:
跨端开发效率
+
原生系统能力
三、整体架构设计
"灵犀安全"中的通知监听架构:
用户界面
index.uvue
|
|
UTS Plugin
notificationGuard
|
|
Kotlin Native Layer
|
|
NotificationListenerService
|
|
Android System
分为三层:
第一层:业务层
负责:
- 展示风险状态
- 开关控制
- 用户交互
技术:
Vue3
+
uvue
+
UniApp
第二层:桥接层
负责:
- JS调用Native
- 参数转换
- 方法暴露
技术:
UTS Plugin
第三层:系统层
负责:
- 获取通知
- 系统监听
- 后台运行
技术:
Kotlin
Android SDK
四、UTS插件基本原理
传统Web调用原生:
JavaScript
无法直接访问
↓
Android API
UTS提供:
JS接口
↓
自动编译
↓
Native代码
例如:
前端调用:
notificationGuard.start()
UTS转换:
调用 Kotlin 方法
↓
执行 Android 代码
五、创建 notificationGuard 插件
目录结构:
uni_modules
└── notificationGuard
├── interface.uts
├── package.json
└── utssdk
└── app-android
├── index.uts
└── NotificationService.kt
六、封装 Android 原生接口
1. 定义UTS接口
interface.uts:
export interface NotificationGuard {
start():void
stop():void
getStatus():boolean
}
作用:
定义前端可以调用的方法。
七、Android原生实现
创建:
NotificationService.kt
示例:
package notificationGuard
object NotificationManager {
private var enabled=false
fun start(){
enabled=true
}
fun stop(){
enabled=false
}
fun status():Boolean{
return enabled
}
}
八、前端调用Native能力
页面:
index.uvue
import {
notificationGuard
}
from "@/uni_modules/notificationGuard"
function enableMonitor(){
notificationGuard.start()
}
用户点击:
开启安全防护
↓
调用UTS
↓
启动Android监听
九、NotificationListenerService集成
真正监听通知:
class MyNotificationListenerService :
NotificationListenerService(){
override fun onNotificationPosted(
sbn:StatusBarNotification
){
val packageName =
sbn.packageName
val notification =
sbn.notification
val extras =
notification.extras
val text =
extras.getString(
Notification.EXTRA_TEXT
)
}
}
十、数据回传设计
监听到:
微信通知:
您的账户异常,请点击链接处理
Native层:
↓
封装:
{
"app":
"WeChat",
"title":
"微信",
"content":
"您的账户异常,请点击链接处理"
}
↓
发送给:
UniApp
↓
提交:
RAG分析接口
十一、UTS与Native通信问题
实际开发中遇到几个关键问题。
问题1:类型转换
UTS不是完整JavaScript。
例如:
错误:
let data:any={}
可能导致:
Type mismatch
解决:
明确类型:
interface NotifyData{
content:string
source:string
}
问题2:Android API兼容
例如:
部分API:
Build.VERSION.SDK_INT
需要判断:
if(
Build.VERSION.SDK_INT >= 26
){
}
避免低版本崩溃。
问题3:生命周期管理
Service:
可能因为:
- 系统回收
- App退出
- 内存不足
导致停止。
因此需要:
Service生命周期监听
+
状态恢复机制
十二、为什么不用纯UniApp实现?
很多开发者会疑问:
UniApp不是可以打包Android吗?为什么还需要原生?
原因:
UniApp只能控制:
App内部逻辑
例如:
可以做到:页面、网络请求、数据展示
但是无法直接控制:
系统通知
系统服务
后台监听
其他App事件
这些属于:
Android Framework能力
必须通过Native扩展。
十三、项目中的完整调用链
以诈骗短信为例:
诈骗短信到达
|
↓
Android通知系统
|
↓
NotificationListenerService
|
↓
UTS插件
|
↓
UniApp
|
↓
POST /fraud-detect/analyzeContent
|
↓
RAG分析
|
↓
WebSocket返回
|
↓
风险弹窗
十四、技术价值分析
通过:
UniApp
+
UTS
+
Android Native
实现:
1. 跨平台效率
大量业务代码:
使用Vue完成。
2. 原生能力突破
获得:
- 系统通知监听
- 后台服务
- 系统权限
- 硬件能力
3. 更适合AI安全应用
AI安全类应用通常需要:
感知层
↓
智能分析层
↓
决策层
其中:
感知层:
依赖大量系统能力。
UTS成为:
跨端框架连接系统能力的重要桥梁。
十五、总结
在"灵犀安全"项目中,通过:
UniApp
+
UTS插件
+
Kotlin Native
+
Android Framework
构建了一套跨端 + 原生融合架构。
相比传统跨端应用:
只能完成:
页面展示
业务交互
该方案进一步实现:
系统级事件感知
后台实时监听
AI安全分析
主动风险预警
证明了:
跨端框架并不意味着牺牲系统能力,通过合理设计 Native Bridge,可以同时兼顾开发效率与底层能力。