HarmonyOS鸿蒙Next中如何实现成就系统?解锁条件检测和通知

HarmonyOS鸿蒙Next中如何实现成就系统?解锁条件检测和通知 学习应用需要实现成就系统,当用户达成特定条件时自动解锁成就并通知用户。

3 回复

原理解析

成就系统核心逻辑:

  1. 定义成就列表和解锁条件
  2. 在关键操作后检查是否满足解锁条件
  3. 解锁新成就时通知用户
  4. 持久化已解锁的成就

解决步骤

步骤1:定义成就接口和列表

export interface Achievement {
  id: string;
  name: string;
  description: string;
  icon: string;
  condition: string;
  unlockedAt?: number;
}
export const ACHIEVEMENT_DEFINITIONS: Achievement[] = [
  { id: 'first_browse', name: '初次翻阅', description: '翻阅第一条内容', icon: '🎯', condition: '翻阅1条内容' },
  { id: 'browse_10', name: '学习新手', description: '翻阅10条内容', icon: '📖', condition: '翻阅10条内容' },
  { id: 'browse_50', name: '勤奋学员', description: '翻阅50条内容', icon: '📚', condition: '翻阅50条内容' },
  { id: 'browse_100', name: '百条达人', description: '翻阅100条内容', icon: '🏆', condition: '翻阅100条内容' },
  { id: 'streak_3', name: '三天坚持', description: '连续打卡3天', icon: '🔥', condition: '连续学习3天' },
  { id: 'streak_7', name: '一周坚持', description: '连续打卡7天', icon: '💪', condition: '连续学习7天' },
  { id: 'quiz_first', name: '首次测验', description: '完成第一次测验', icon: '✏️', condition: '完成1次测验' },
  { id: 'quiz_perfect', name: '满分达人', description: '测验获得满分', icon: '💯', condition: '测验得分100%' },
  { id: 'favorite_10', name: '收藏爱好者', description: '收藏10条内容', icon: '⭐', condition: '收藏10条内容' },
  { id: 'note_5', name: '笔记达人', description: '写5条笔记', icon: '📒', condition: '写5条笔记' }
];

步骤2:解锁成就方法

export async function unlockAchievement(achievementId: string): Promise<boolean> {
  if (!store) return false;
  try {
    const achievements = await getAchievements();
    const exists = achievements.some(a => a.id === achievementId);
    
    if (!exists) {
      const definition = ACHIEVEMENT_DEFINITIONS.find(d => d.id === achievementId);
      if (definition) {
        const newAchievement: Achievement = {
          ...definition,
          unlockedAt: Date.now()
        };
        achievements.push(newAchievement);
        await safeWrite(KEY_ACHIEVEMENTS, JSON.stringify(achievements));
        
        // 显示解锁通知
        promptAction.showToast({
          message: `🎉 解锁成就:${definition.name}`,
          duration: 2000
        });
        return true;
      }
    }
    return false;
  } catch (error) {
    return false;
  }
}

步骤3:检查并解锁成就

export async function checkAndUnlockAchievements(): Promise<void> {
  // 获取各项统计数据
  const browseStats = await getBrowseStats();
  const streakDays = await getStreakDays();
  const quizStats = await getQuizStats();
  const favorites = await getFavorites();
  const notes = await getNotes();
  
  // 检查浏览相关成就
  if (browseStats.total >= 1) await unlockAchievement('first_browse');
  if (browseStats.total >= 10) await unlockAchievement('browse_10');
  if (browseStats.total >= 50) await unlockAchievement('browse_50');
  if (browseStats.total >= 100) await unlockAchievement('browse_100');
  
  // 检查连续打卡成就
  if (streakDays >= 3) await unlockAchievement('streak_3');
  if (streakDays >= 7) await unlockAchievement('streak_7');
  
  // 检查测验成就
  if (quizStats.total >= 1) await unlockAchievement('quiz_first');
  if (quizStats.bestScore === 100) await unlockAchievement('quiz_perfect');
  
  // 检查收藏和笔记成就
  if (favorites.length >= 10) await unlockAchievement('favorite_10');
  if (notes.length >= 5) await unlockAchievement('note_5');
}

步骤4:在关键操作后调用检查

// 浏览内容后
export async function recordBrowse(...): Promise<boolean> {
  // ... 保存浏览记录
  await checkAndUnlockAchievements();
  return true;
}

// 完成测验后
async finishQuiz(): Promise<void> {
  await saveQuizRecord(record);
  await checkAndUnlockAchievements();
}

效果图

用户完成操作 → 检查成就条件 → 满足条件 → 解锁成就 → Toast通知"🎉 解锁成就:xxx"

更多关于HarmonyOS鸿蒙Next中如何实现成就系统?解锁条件检测和通知的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,可通过AbilityKit框架实现成就系统。使用分布式数据管理存储成就状态,通过分布式任务调度检测解锁条件。状态变化时,使用通知服务触发系统通知。具体涉及FormKit创建成就卡片,NotificationKit发送成就解锁提醒。

在HarmonyOS Next中实现成就系统,主要涉及解锁条件检测和成就通知两大模块。以下是核心实现思路和关键API:

1. 成就数据管理与存储

  • 使用[@ohos](/user/ohos).data.relationalStore(关系型数据库)或[@ohos](/user/ohos).data.preferences(首选项)持久化存储成就状态(如未解锁/已解锁、解锁时间)。
  • 建议数据库表结构包含:成就ID、成就名称、描述、图标资源、解锁条件类型、当前进度、状态等字段。

2. 解锁条件实时检测

  • 主动触发检测:在用户完成关键操作(如学习时长累计、章节完成、答题正确率达标)后,调用业务逻辑更新成就进度。
  • 被动状态监听:利用Ability生命周期回调、UI状态变化或[@ohos](/user/ohos).app.ability.common中的事件订阅,监听应用状态变化。
  • 进度计算:在检测到条件相关事件时,查询当前成就进度,计算是否满足解锁阈值。例如:
    // 示例:更新学习时长成就进度
    async updateStudyTimeAchievement(duration: number) {
      const achievement = await this.getAchievementFromDB('achievement_study_time');
      achievement.currentProgress += duration;
      if (achievement.currentProgress >= achievement.unlockThreshold && !achievement.unlocked) {
        await this.unlockAchievement(achievement.id);
      }
    }
    

3. 成就解锁与通知

  • 解锁触发:当条件满足时,更新数据库成就状态为“已解锁”,并记录解锁时间。
  • 即时通知:使用[@ohos](/user/ohos).notificationManager发送即时通知:
    import notificationManager from '[@ohos](/user/ohos).notificationManager';
    
    async sendAchievementNotification(achievement: Achievement) {
      const notificationRequest: notificationManager.NotificationRequest = {
        content: {
          title: '成就解锁!',
          text: `恭喜获得「${achievement.name}」:${achievement.description}`,
          // 可设置成就图标等
        },
        id: achievement.id // 使用成就ID作为通知ID避免重复
      };
      await notificationManager.publish(notificationRequest);
    }
    
  • 应用内提示:可结合[@ohos](/user/ohos).arkui.advanced.Components(如Dialog或自定义弹窗)在UI层展示成就解锁动效。

4. 状态同步与防重复

  • 使用数据库事务确保成就状态更新的原子性。
  • 通过成就状态标志位(如unlocked)和通知记录,避免重复解锁和重复通知。

5. 扩展建议

  • 条件抽象:可设计通用的“条件检测器”接口,便于扩展多种成就类型(如连续登录、社交互动)。
  • 云同步:若支持多设备,通过[@ohos](/user/ohos).data.distributedData实现成就状态跨设备同步。

此方案通过本地数据管理、事件驱动检测和系统通知服务,即可实现轻量高效的成就系统。注意合理规划检测频率以平衡性能与实时性。

回到顶部