鸿蒙应用开发实战【93】— 实战短信批量导入完整流程

鸿蒙应用开发实战【93】— 实战短信批量导入完整流程
鸿蒙应用开发实战【93】— 实战短信批量导入完整流程本文是「号码助手全栈开发系列」第 93 篇持续更新中…开源社区https://openharmonycrossplatform.csdn.net前言短信批量导入是号码助手最具实用价值的功能之一用户复制一条或多条包含验证码/注册通知的短信系统自动识别出平台名和手机号让用户一键创建应用绑定。本篇剖析从文本解析到入库的完整实现。本篇涵盖SmsParser 智能解析算法、Platform Keywords 匹配策略、PasteImportPage 候选列表 UI、剪贴板读取ohos.pasteboard、候选采纳/忽略流程、跨表数据写入。一、整体架构剪贴板/手动输入 │ ▼ SmsParser.parse(text) ← 智能解析引擎 │ ▼ ParseResult[] ← 识别结果平台名 手机号 │ ▼ PasteImportPage UI ← 候选列表展示待确认/已采纳/已忽略 │ ├── 采纳 → AppBindingDao.create() SmsCandidateDao.create() │ └── 忽略 → SmsCandidateDao.create(已忽略)二、智能解析引擎 SmsParser文件features/sms/SmsParser.ets2.1 解析输出/** 单条解析候选结果 */exportinterfaceParseResult{platform:string// 识别到的平台/应用名称phone:string// 识别到的手机号raw:string// 原始输入文本片段}2.2 平台关键词库部分内置 60 个已知平台关键词按行业分组、长词优先constPLATFORM_KEYWORDS:string[][// 银行长词优先招商银行,工商银行,建设银行,农业银行,中国银行,交通银行,浦发银行,中信银行,光大银行,民生银行,平安银行,广发银行,// 支付 / 金融支付宝,微信支付,云闪付,数字人民币,// 电商拼多多,天猫,淘宝,京东,唯品会,小红书,得物,闲鱼,// 外卖餐饮饿了么,美团外卖,美团,// 出行滴滴出行,哈啰出行,滴滴,// 社交微博,抖音,快手,QQ,// 内容娱乐哔哩哔哩,B站,爱奇艺,优酷视频,腾讯视频,// 办公钉钉,飞书,企业微信,腾讯会议,// ...微信// 放在最后避免微信支付被提前匹配]2.3 长词优先策略for(constkwofPLATFORM_KEYWORDS){if(trimmed.includes(kw)){// 避免已被更长词包含的短词letsubsumedfalsefor(constalreadyofmatched){if(already.includes(kw)){subsumedtruebreak}}if(!subsumed){platformSet.push(kw)matched.add(kw)}}}例如文本中包含携程旅行匹配到携程旅行后就不会再单独匹配携程。2.4 手机号提取constPHONE_PATTERN(1[3-9]\\d{9})// 中国大陆手机号constphoneRegnewRegExp(PHONE_PATTERN,g)2.5 组合策略if(平台名手机号){// 笛卡尔积每个平台名 × 每个手机号for(constplatformofplatformSet)for(constphoneofphoneSet)results.push({platform,phone,raw})}elseif(只有平台名){// 只有平台名}elseif(只有手机号){// 只有手机号}三、PasteImportPage 页面实现文件pages/PasteImportPage.ets3.1 剪贴板读取privateasyncreadClipboard():Promisevoid{try{constboardpasteboard.getSystemPasteboard()constdataawaitboard.getData()consttextdata.getPrimaryText()if(texttext.length0){this.smsTexttext promptAction.showToast({message:已读取剪贴板内容})}}catch(e){hilog.error(0x0000,App,readClipboard failed:: %{public}s,JSON.stringify(e))promptAction.showToast({message:无法读取剪贴板请手动粘贴})}}3.2 解析触发privatedoParse():void{this.parsingtrueconstresultsSmsParser.parse(this.smsText)this.candidatesresults.map((r,idx)({key:candidate_${Date.now()}_${idx},platform:r.platform,phone:r.phone,status:待确认,raw:r.raw}))this.hasParseAttemptedtruethis.parsingfalse}3.3 采纳一条候选核心写入privateasyncadoptCandidate(key:string):Promisevoid{constitemthis.candidates.find(cc.keykey)if(!item||item.status!待确认)returntry{constnowDate.now()// 写入 app_bindings 表awaitAppBindingDao.create({app_name:item.platform,icon_key:ICON_COLORS[Math.floor(Math.random()*ICON_COLORS.length)],category:APP,card_id:selectedCardId,status:使用中,remark:来自短信识别手机号${item.phone},source:短信识别,created_at:now,updated_at:now})// 写入 sms_candidates 表持久化识别记录awaitSmsCandidateDao.create({raw_text:item.raw,matched_platform:item.platform,matched_phone:item.phone,status:已采纳,created_at:now})// 更新 UI 状态item.status已采纳promptAction.showToast({message:已添加${item.platform}})}catch(e){hilog.error(0x0000,App,adoptCandidate failed:: %{public}s,JSON.stringify(e))}}3.4 忽略一条候选privateasyncignoreCandidate(key:string):Promisevoid{awaitSmsCandidateDao.create({raw_text:item.raw,matched_platform:item.platform,matched_phone:item.phone,status:已忽略,created_at:Date.now()})item.status已忽略}四、数据写入路径采纳候选 ├── AppBindingDao.create() → app_bindings 表 │ app_name: 支付宝 │ card_id: 1 │ status: 使用中 │ source: 短信识别 └── SmsCandidateDao.create() → sms_candidates 表 raw_text: 【支付宝】验证码 1234... matched_platform: 支付宝 status: 已采纳五、实际解析演示输入文本【支付宝】验证码 123456您正在登录如非本人操作请忽略。 【招商银行】您的验证码是 654321请勿泄露。 【美团外卖】订单已送达如有问题请联系 400-888-8888解析结果平台名手机号处理支付宝—✅ 可采纳招商银行—✅ 可采纳美团外卖—✅ 可采纳注意上述短信中没有手机号只有平台名。如果文本包含「手机号 13800138000 正在注册 拼多多」则会同时识别平台名和手机号。六、卡号选择循环// 通过 ActionMenu 让用户选择绑定到哪个卡号constresultawaitpromptAction.showActionMenu({title:选择绑定卡号,buttons:this.cards.map(c({text:${c.label}·${c.phone_number},color:AppColors.TEXT}))})this.selectedCardIndexresult.index小结模块核心类/函数职责文件位置解析引擎SmsParser.parse()关键词匹配 正则提取features/sms/SmsParser.ets页面PasteImportPage输入 → 解析 → 候选 → 确认pages/PasteImportPage.ets剪贴板pasteboard.getSystemPasteboard()读取系统剪贴板ohos.pasteboardAppBindingDaocreate()写入应用绑定features/data/AppBindingDao.etsSmsCandidateDaocreate()持久化识别记录features/data/SmsCandidateDao.ets图标颜色ICON_COLORS随机分配图标颜色AppColors.ets如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS pasteboard APIhttps://developer.huawei.com/consumer/cn/doc/harmonyos-references/pasteboardHarmonyOS 官方文档https://developer.huawei.com/consumer/cn/doc/HarmonyOS hilog文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references/hilogHarmonyOS testinghttps://developer.huawei.com/consumer/cn/doc/harmonyos-guides/unit-testHarmonyOS 安全与权限https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-overview