【OpenHarmony/HarmonyOs 】学习 App 如何做轻量化数据安全与隐私保护

教育类 App 面向学生用户,隐私保护不能后置。学习数据看似普通,其实包含年级、学习习惯、错题、正确率、薄弱知识点等敏感信息。本文结合 政治视界 项目,讲解学习 App 如何用“少申请权限、本地保存、边界清晰”的方式做好轻量化数据安全 🔐

一、少申请权限

当前项目 module.json5 没有声明相机、定位、通讯录、麦克风等高敏权限:

{
  "module": {
    "deviceTypes": ["phone", "tablet"],
    "abilities": [
      {
        "name": "EntryAbility",
        "exported": true
      }
    ]
  }
}

对一个本地政治学习工具来说,题库、闪卡、笔记、报告都不需要这些权限。能不申请就不申请,是最有效的隐私保护。

二、数据本地保存

项目使用 Preferences 保存学习数据:

const PREFERENCES_NAME = 'zhengzhi_prefs';

async init(context: common.UIAbilityContext): Promise<void> {
  this.prefs = await preferences.getPreferences(context, PREFERENCES_NAME);
}

本地保存的好处是:

  • 不需要上传用户学习行为;
  • 离线可用;
  • 数据边界清楚;
  • 用户更容易信任。

三、业务数据集中管理

所有学习数据通过 DataManager 管理:

const STUDY_STATS_KEY = 'study_stats';
const WRONG_QUESTIONS_KEY = 'wrong_questions';
const STUDY_SESSIONS_KEY = 'study_sessions';
const PROFILE_KEY = 'user_profile';
const SETTINGS_KEY = 'app_settings';

集中管理有利于后续实现:

  • 清空学习数据;
  • 导出学习报告;
  • 关闭错题记录;
  • 隐私设置页;
  • 数据备份。

四、避免默认 AI 识图

学习 App 可能会想加入“拍照识题”,但这类能力涉及图片和个人环境信息。建议默认关闭,用户主动触发时再申请权限,并说明用途:

用于拍摄题目并识别文字,不会在未确认前保存或上传图片。

当前政治视界没有默认接入 AI 识图,这是比较稳妥的设计。后续如果加入,也应该优先端侧处理。

五、错题数据也要保护

错题包含用户薄弱知识点:

export interface WrongQuestion {
  questionId: number;
  userAnswer: string | string[];
  correctAnswer: string | string[];
  category: string;
  grade: string;
  wrongCount: number;
}

这些数据不应该默认分享或上传。即使做学习报告,也应该由用户主动导出。

六、初始化可靠性

数据保护还包括不丢数据。项目在页面加载前初始化 Preferences:

void storageManager.init(this.context).then(() => {
  windowStage.loadContent('pages/Index', appLocalStorage, (err) => {
    if (err.code) {
      return;
    }
  });
});

这样可以避免页面先读取导致空数据覆盖真实数据。

七、隐私设置建议

后续可以增加“隐私与数据”页面:

  • 查看本地保存了哪些数据;
  • 清空错题;
  • 清空学习记录;
  • 导出学习报告;
  • 关闭学习画像;
  • AI 识图默认关闭说明;
  • 权限使用说明。

八、实现流程总结

不声明无关权限
  ↓
Preferences 本地保存
  ↓
DataManager 集中管理
  ↓
用户主动触发导出/清空
  ↓
AI 能力默认关闭

九、结语

学习 App 的隐私保护不是写一份协议就结束了,而是体现在架构设计中。政治视界当前选择了本地数据、低权限、集中管理的方案,非常适合教育工具的早期版本。

对学生用户来说,可信比炫技更重要。真正好的学习 App,应该帮助用户成长,而不是过度收集用户数据 🛡️

十、具体可以增加哪些隐私功能

在当前项目基础上,可以新增一个“隐私与数据”页面,入口放在 ProfilePage 的设置区域。页面可以包含这些操作:

学习数据概览:展示本地保存了哪些数据
清空错题:只删除 wrong_questions
清空学习记录:删除 study_sessions 和 study_stats
重置每日目标:恢复默认 daily_goal
导出学习报告:用户主动生成文本或图片
AI 识图说明:默认关闭,未来用户主动启用

由于 DataManager 已经把 key 集中定义,删除某类数据时可以比较精确,不需要清空所有 Preferences。

十一、清空数据的实现思路

StorageManager 已经提供了删除方法:

delete(key: string): void {
  if (!this.prefs) {
    return;
  }
  try {
    this.prefs.deleteSync(key);
    this.prefs.flush();
  } catch (e) {
    console.error('Failed to delete: ' + JSON.stringify(e));
  }
}

后续可以在 DataManager 中封装业务方法:

clearWrongQuestions()
clearStudySessions()
resetStudyStats()
clearProfile()

页面只调用这些方法,不直接传 key。这样可以避免误删不该删除的数据。

十二、权限申请的产品流程

如果未来加入拍照识题,建议流程是:

用户点击“拍照识题”
  ↓
展示用途说明
  ↓
申请相机权限
  ↓
拍照后先展示预览
  ↓
用户确认后才识别
  ↓
识别结果可删除

这个流程比 App 启动时直接要权限更友好。尤其是教育场景,用户应该清楚知道每一次敏感能力为什么被使用。

十三、本地学习画像也要可关闭

错题推荐、学习报告、成就系统都会形成学习画像。即使这些数据只在本地,也建议给用户一个开关:

开启:根据错题和学习记录生成复习建议
关闭:只保留基础答题记录,不生成画像标签

这样用户对自己的数据更有控制感。隐私保护做到这一步,产品信任度会明显提升。

img

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐