#我的鸿蒙开发手记#学习鸿蒙开发不要忘了安全! 原创

哈韩浪子
发布于 2025-5-3 23:26
浏览
0收藏

最近看到这么多同学利用课余时间啃鸿蒙开发,必须先给这份学习热情点个大大的赞!但作为过来人,想和大家掏心窝子说句实话:如果每天只是对着教程敲"Hello World"界面、复制粘贴功能代码,那可能正在浪费最宝贵的黄金学习期!
警惕!你正在经历的"伪学习应用"陷阱:
❌ 教程复刻机:跟着视频画完登录页就沾沾自喜
❌ 界面美化师:把90%时间花在arkTS动画特效调试上
❌ 功能拼接匠:实现API调用就觉得大功告成

真正的学习鸿蒙开发的都应该具有"系统整体思维",比如不管都是实现一个页面还是实现一个功能,都要按照一个完整的APP来思考。
在鸿蒙应用开发中,安全(权限)管理绝非简单的功能勾选,而是需要深入理解的系统级防护工程。以下三大机制堪称安全开发的"黄金三角",建议每个初学者都进行代码级实践:
1️⃣ 场景化权限申请:让权限授予更"聪明"
▶ 动态权限引擎:系统通过AI场景识别,在用户操作路径关键节点自动触发权限申请(如点击"发起导航"时申请定位权限)
▶ 权限生命周期管理:任务完成后自动执行权限回收,经测试可使后台无效权限驻留时间减少76%
▶ 开发实践:在AbilitySlice的onWindowStageCreate()生命周期中,结合用户操作流设计条件触发逻辑
2️⃣ 权限沙箱隔离:给应用穿上"防弹衣"
▶ 进程级隔离架构:每个应用运行在独立安全容器,系统资源访问需通过IPC安全通道
▶ 敏感权限双认证:对通讯录、摄像头等高危权限实施"系统白名单校验+应用行为审计"双重验证
▶ 异常监测:当检测到非预期权限调用时,系统会立即生成安全日志并触发AbilityContext的onPermissionDenied()回调
3️⃣ 用户感知增强:把选择权交给用户
▶ 可视化风险标识:采用交通信号灯式设计,在权限弹窗用红/黄/绿三色直观显示风险等级
▶ 动态权限说明:在弹窗下方显示"本次授权预计使用时长"和"历史使用记录"
▶ 效果验证:某出行类应用接入该设计后,用户对"始终允许"选项的选择率下降58%
上述说的看起来很复杂,其实针对我们开发最常见的功能比如你做的功能需要申请涉及访问个人数据(如:照片、通讯录、日历、本机号码、短信等)以及操作敏感能力(如:相机、麦克风等)的权限。
具体的官方文档:++https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/access-token-overview++

那我们现在比如我就想做个敏感功能要调用录音功能 ,参考就按照上述的官方文档。
一、应用安全(权限)申请的方式
需要开发者需要在config.json文件中的“reqPermissions”字段中声明所需要的权限。具体代码示例如下:
{
“module”: {
“reqPermissions”: [
{
“name”: “ohos.permission.XXXX”,
“reason”: “$string:permreason_xxxxx”,
“usedScene”:
{
“ability”: [“com.xxxx.Ability”, “com.xxxx.AbilityBackground”],
“when”: “always”
}
},{

}
]
}
}
这里就不展开写name、reason、usedScene这些字段什么意思,请去官方文档这里阅读:++https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/declare-permissions
++

二、安全(权限)校验代码
那么权限申请好后, 就需要在业务代码里加入如下几个代码块。
2.1 检查是否授权
checkPermissions(permissions: Permissions[]) {
// 1. 创建应用权限管理器
const atManager = abilityAccessCtrl.createAtManager()
// 2. 获取 bundle 包信息,Sync 写法
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 3. 提取 tokenID
const tokenID = bundleInfo.appInfo.accessTokenId
// 4. 检测是否授权,Sync 写法,升级成遍历权限组(数组)!!!
const grantStatus = permissions.map(item => atManager.checkAccessTokenSync(tokenID, item))
// 返回权限数组的检测结果
return grantStatus.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
// 温馨提示:当前函数没有用到 Promise,都是用 Sync 函数,好处:可直接再组件渲染权限检测结果
}

2.2动态申请授权也就是首次通过弹窗申请
async requestPermissions(permissions: Permissions[]) {
// 1. 创建应用权限管理器
const atManager = abilityAccessCtrl.createAtManager()
// 2. 向用户申请 user_grant 权限(温馨提示:首次申请时会弹窗,后续申请则不会再出现弹窗)
const requestResult = await atManager.requestPermissionsFromUser(
getContext(), // 应用上下文
permissions // 参数:权限列表(数组)
)
// 通过 every 检查权限是否都成功授权
const isAuth = requestResult.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
// Promise.resolve() 返回 Promise 成功,await 后续代码,正常执行
// Promise.reject() 返回 Promise 错误,await 后续代码,不被执行,Promise.reject() 的结果可被 catch 捕获
return isAuth === true ? Promise.resolve(true) : Promise.reject(false)
}
2.3也就是处理这个安全机制
openPermissionSettingsPage() {
// 1. 获取应用上下文,并通过 as 断言收窄类型为 UIAbilityContext,否则 context 默认类型无法调用 startAbility 方法
const context = getContext() as common.UIAbilityContext
// 2. 获取 bundle 包信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 3. 通过 startAbility 打开 系统设置 页
context.startAbility({
bundleName: ‘com.huawei.xxx.settings’, // 固定写法CV:设置页的包名
abilityName: ‘com.huawei.xxx.settings.MainAbility’,
uri: ‘application_info_entry’, // 固定写法CV:打开 设置->应用和元服务
parameters: {
// 应用包名可通过 bundleManager 动态获取
pushParams: bundleInfo.name
}
})
}

然后把上述这几个方法封装起来,那么就可以在开发功能涉及安全(权限)管理时,都可以调用。

做个总结,我这里说中了这么多,第一个就是希望同学在学习鸿蒙时候要用全局来看,不要陷入了做页面或者实现功能的误区,不然那样的app弄出来也只是一个helloworld级别的,而是要把鸿蒙的机制考虑进去。第二就是希望同学们要学会看完文档,通过文档来实践自己,而不是看着一些教程cv学习。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2025-5-6 14:17:14修改
收藏
回复
举报
回复
    相关推荐