诗酒趁闲
诗酒趁闲
  • 发布:2025-11-19 21:30
  • 更新:2025-11-19 22:14
  • 阅读:1013

【鸿蒙征文】重拾儿时趣味的古诗 App 的开发过程记录

分类:鸿蒙Next

一款无广告重拾儿时趣味的古诗 App 的开发过程记录

一、🌈缘起:让古诗 “活” 起来,而非躺在角落🌈

做这款 App 的初衷,藏在三个真实需求里:
一次偶然的寻找碰上鸿蒙的星光闪烁:翻找学生时代的语文诗词,想重拾那份诗词氛围时,书本早已不见踪影,此时便想在手机上寻找这类APP,市面古诗 App 要么广告扎堆,要么功能枯燥,实在感受不到当年的那种氛围;
身边朋友想重拾古诗,却缺合适的背诵工具,也没有专属交流渠道(总不能天天在朋友圈发古诗);
古诗的意境与字词之美,不该只靠 “死记硬背”—— 结合互动、朗读、释义,让大家 “懂了再背”,才是真正的文化传承。
所以核心需求很明确:做一款 “不枯燥、能互动、够纯粹” 的古诗工具。既要满足学习需求,又要兼顾趣味性,还得适配鸿蒙系统(毕竟鸿蒙用户越来越多,生态也日趋完善)。

二、💡技术选型:为啥 “锁死” UniAPP?💡

选技术栈时纠结了 3 天,最终敲定 UniAPP,全靠 “实用主义”:
排除鸿蒙原生开发:适配鸿蒙虽丝滑,但单人开发要重新学原生语法,还无法兼顾其他平台,效率太低;
排除其他跨平台框架:要么对鸿蒙适配不完善,要么插件生态薄弱,像诗词朗读、音频上传等功能得手动造轮子;

选择 UniAPP 的核心原因:
跨平台省心:一套代码可打包鸿蒙 App,后续扩展安卓、iOS 版本无需重构,对个人开发者极度友好;

  • 鸿蒙适配 “自带 buff”:HBuilderX 提供现成打包模板和专属适配插件,不用手动修改大量配置;
  • 生态够全:uniCloud 云开发、音频组件、数据库插件,刚好满足古诗存储、朗读上传、接龙匹配等核心需求;
  • 学习成本低:有微信小程序开发基础,UniAPP 的 Vue 语法无缝衔接,1 周就能上手。
    简单说:用 UniAPP 开发鸿蒙,就像 “站在巨人肩膀上”—— 不用从零学鸿蒙原生,又能享受鸿蒙系统特性,对非专业开发者太友好了!

三、⚠️踩坑实录:鸿蒙适配那些 “磨人的小妖精”⚠️

开发前以为 “跨平台 = 一路顺畅”,结果真正适配鸿蒙时,还是踩了不少坑,分享 3 个最印象深刻的:

权限申请:鸿蒙的 “规矩” 和其他平台不一样
做朗读广场时,需要调用手机麦克风录音、存储音频文件。一开始直接复用了其他平台的权限代码,结果在鸿蒙上直接报错 —— 录音功能打不开!

  • 坑点:鸿蒙的 “媒体权限” 需要单独申请,而且必须配置ohos.permission.READ_MEDIA和ohos.permission.WRITE_MEDIA,还得在代码里动态弹窗说明 “为啥要要权限”(比如 “需要录音才能上传你的朗读作品”),光说 “需要权限” 会被系统拒绝;而且必须在鸿蒙的AGC后台进行同步申请该权限,因为该权限属于受限权限;而且!!!如果是使用的鸿蒙自家的隐私托管服务,必须要在隐私托管服务中同步该权限的声明
  • 解决:使用uts插件配置权限;然后在AGC后台同步申请该受限权限通过率直接 100%。
    // #ifdef APP-HARMONY  
    import "@/uni_modules/harmony-permissions"  
    // #endif 
 {  
  "module": {  
    "name": "uni_modules__harmony_permissions",  
    "type": "har",  
    "deviceTypes": [  
      "default",  
      "tablet",  
      "2in1"  
    ],  
    "requestPermissions": [  
      {  
        "name": "ohos.permission.INTERNET"  
      },{  
        "name": "ohos.permission.WRITE_MEDIA",  
        "reason": "$string:media_desc",  
        "usedScene": {"when": "inuse"}  
      },{  
        "name": "ohos.permission.READ_MEDIA",  
        "reason": "$string:media_desc",  
        "usedScene": {"when": "inuse"}  
      }  
    ]  
  }  
}

服务卡片适配:桌面卡片让古诗 “触手可及”
鸿蒙的桌面卡片是个大亮点,我想做个 “每日一句” 卡片,用户不用打开 App,桌面就能看到古诗。

  • 坑点:UniAPP 打包鸿蒙应用时,卡片的尺寸适配很麻烦,比如 3x2、2x2 的卡片布局会错乱,而且卡片数据刷新需要和主 App 同步;
  • 解决:用 UniAPP 提供的uni-app x编译模式(专门优化鸿蒙适配),卡片布局用flex弹性盒,固定宽高比;数据同步用uniCloud实时数据库,主 App 更新 “每日一句” 后,卡片自动刷新,不用用户手动操作 —— 现在不少用户说 “每天解锁手机先看一眼古诗,感觉很治愈”。

音频播放:后台播放老是 “断档”
朗读广场的核心是 “听别人读古诗”,但一开始用户反馈 “退到后台就停了”,体验很差。

  • 坑点:鸿蒙对后台音频播放有严格限制,普通的audio组件在后台会被系统暂停;
  • 解决:集成了鸿蒙的AVPlayer SDK(UniAPP 可以直接调用鸿蒙原生 SDK),在manifest.json里配置 “后台音频权限”,同时用 UniAPP 的onBackground生命周期监听,退后台时自动切换到鸿蒙原生播放器,现在后台播放能稳定运行,用户还能边听古诗边刷微信~

四、📦功能落地:每个模块都是 “心头好”📦

结合古诗的核心需求,几个功能模块都是 “边踩坑边优化” 出来的,挑 3 个重点说:

  1. 背一背:用 “艾宾浩斯曲线” 让背诵不费脑
    一开始只是简单做了 “列表 + 背诵打卡”,但用户反馈 “背了就忘”。后来用 UniAPP 的storage存储用户背诵记录,结合艾宾浩斯遗忘曲线,在对应时间点推送提醒(比如第 1 天、第 3 天、第 7 天),还加了 “遮字默写” 功能 —— 点击诗句能隐藏关键字,像考试一样检验效果。

    • 小技巧:用 UniAPP 的uni.createPushMessage调用鸿蒙的通知权限,提醒文案特意用古诗意境,比如 “床前明月光,今天该复习啦~”,比干巴巴的 “请背诵” 更讨喜。
      <view class="poem-content">  
      <block v-if="poemStore.showFullContent">  
        <text v-for="(line, idx) in poemStore.currentPoem.content" :key="idx" class="full-line">{{ line }}</text>  
      </block>  
      <block v-else>  
        <text v-for="(line, idx) in poemStore.currentPoem.content" :key="idx" class="hide-line">□□□□□□□</text>  
      </block>  
      </view>  
      <button class="toggle-btn" @click="poemStore.toggleFullContent">  
      {{ poemStore.showFullContent ? '切换到背诵模式' : '查看完整诗句' }}  
      </button>
      <script setup lang="ts">  
      import { usePoemStore } from '@/stores/poemStore';  
      import { useRouter } from 'vue-router';  
      const poemStore = usePoemStore();  
      const router = useRouter();  
      const goBack = () => {  
      router.back();  
      };  
      const handleCollect = () => {  
      if (poemStore.currentPoem) {  
      poemStore.toggleCollect(poemStore.currentPoem.id);  
      }  
      };  
      </script>
  2. 诗词 / 成语接龙:云开发让匹配更流畅
    接龙功能需要实时匹配用户输入的诗句 / 成语,还要校验是否正确、有没有重复。一开始用本地数据库,结果数据量太大(收录了 2 万 + 古诗、1 万 + 成语),App 启动变慢。

    export interface Poem {  
    id: number;  
    title: string; // 诗名  
    author: string; // 作者(含朝代)  
    content: string[]; // 诗句数组  
    category: string; // 分类(如山水、边塞)  
    isCollected: boolean; // 是否收藏  
    }
    • 优化:改用uniCloud云开发,把诗词库、成语库存到云端,用云函数做匹配校验(比如输入 “举头望明月”,云函数自动查询以 “月” 开头的诗句),App 端只负责展示和输入,启动速度从 3 秒降到 1 秒,接龙延迟也几乎感知不到。
  3. 主题颜色:贴合古风的 “颜值小心思”
    考虑到用户可能在不同场景使用(比如晚上背古诗要护眼),做了 3 种古风主题:黛青(默认)、朱砂(暖调)、月白(护眼)。

    • 实现:用 UniAPP 的vuex管理主题状态,结合鸿蒙的 “系统深色模式”,用户切换系统主题时,App 自动适配对应的古风配色 —— 比如系统开深色模式,App 自动切月白主题,字体加粗,保护视力。
      import { defineStore } from 'pinia';  
      import { Poem } from '@/types/poem';  
      const mockPoems: Poem[] = [  
      {  
      id: 1,  
      title: '望庐山瀑布',  
      author: '唐·李白',  
      content: ['日照香炉生紫烟', '遥看瀑布挂前川', '飞流直下三千尺', '疑是银河落九天'],  
      category: '山水',  
      isCollected: false  
      },  
      {  
      id: 2,  
      title: '静夜思',  
      author: '唐·李白',  
      content: ['床前明月光', '疑是地上霜', '举头望明月', '低头思故乡'],  
      category: '思乡',  
      isCollected: false  
      },  
      {  
      id: 3,  
      title: '春晓',  
      author: '唐·孟浩然',  
      content: ['春眠不觉晓', '处处闻啼鸟', '夜来风雨声', '花落知多少'],  
      category: '春景',  
      isCollected: false  
      }  
      ];  
      export const usePoemStore = defineStore('poem', {  
      state: () => ({  
      poems: mockPoems as Poem[], // 古诗列表  
      currentPoem: null as Poem | null, // 当前选中古诗  
      showFullContent: false // 详情页是否显示完整诗句(背诵模式控制)  
      }),  
      actions: {  
      // 选中古诗  
      selectPoem(poemId: number) {  
      this.currentPoem = this.poems.find(poem => poem.id === poemId) || null;  
      this.showFullContent = false; // 进入背诵模式,默认隐藏完整诗句  
      },  
      // 切换收藏状态  
      toggleCollect(poemId: number) {  
      const poem = this.poems.find(poem => poem.id === poemId);  
      if (poem) poem.isCollected = !poem.isCollected;  
      },  
      // 切换完整诗句显示(背诵/查看模式)  
      toggleFullContent() {  
      this.showFullContent = !this.showFullContent;  
      }  
      }  
      });

五、✅ 后续功能想法 ✅

  • “想要更多主题颜色”→ 新增 “竹绿”“藤黄” 2 种配色;
  • “朗读广场想给作品点赞”→ 加了点赞功能,用uniCloud存储互动数据;
  • “背古诗想有奖励”→ 做了 “背诵勋章”,集齐 5 个勋章能解锁古诗插画壁纸。

虽然还未成功上架市场,但在开发中寻找用户体验过程中,最让我感动的是一条评论:“我家娃以前不爱背古诗,现在每天打卡接龙,还会给同学分享自己的朗读作品,谢谢开发者让传统文化变有趣~” 这种时候,觉得熬夜改 bug、反复适配都值了!

六、🌟星光不负:技术与文化的双向奔赴🌟

从一开始的 “想做个古诗工具”,到现在的 “让自己更了解古诗并爱上它”,用 UniAPP 开发鸿蒙 App 的这 3 个月,不仅让我摸清了跨平台开发的套路,更懂了 “技术是为需求服务”—— 不是堆功能,而是让应用真正有用起来、用得爽。
回头看,选择 UniAPP 是最正确的决定:它让我不用纠结原生语法,能把更多精力放在 “怎么让古诗更有趣” 上;而鸿蒙的开放能力(云开发、云调试、HarmonyOS SDK、云测试)等,又让 App 的体验更上一层楼。就像古诗里说的 “行则将至”,技术之路没有捷径,但只要朝着目标一步步走,星光总会照亮前路。
接下来,我还想加 AR 功能(用鸿蒙的 AR SDK,扫描实景生成古诗意境)、古诗合唱(朗读广场支持多人合拍),让传统文化通过技术 “活” 起来、“火” 起来。如果你也在做 UniAPP + 鸿蒙开发,或者对古诗 App 有更多想法,欢迎一起交流~ 毕竟,码向未来的路上,有人同行更精彩!

18 关注 分享
字节漫游 DCloud_CHB CodeCrafter 唐家三少 青衫行者 邵懒人 DCloud_UNI_CHB DCloud_云服务_moyang dcbottle3 人生ing 阿岳 威龙 用户2919468 刘星 用户2936489 DCloud_云服务_JRP 知青 byx666

要回复文章请先登录注册

字节漫游

字节漫游

mark
2025-11-19 22:14