Deminic
Deminic
  • 发布:2025-11-03 15:05
  • 更新:2025-11-03 15:05
  • 阅读:280

从零到一开发鸿蒙6原生时钟应用:uni-app x 完全实战指南

分类:鸿蒙Next

🚀 从零到一开发鸿蒙6原生时钟应用:uni-app x 完全实战指南

前言

鸿蒙6时代已来,纯血鸿蒙应用开发正当时!

在移动应用开发的新纪元,鸿蒙6(HarmonyOS 6)作为华为全新一代操作系统,已经完全摆脱了安卓内核,实现了真正的"纯血鸿蒙"。本文将详细介绍如何使用 uni-app x 框架,从零开发一款功能完整、界面精美的鸿蒙6原生时钟应用,集成时钟、闹钟、秒表、计时器四大核心功能。

为什么选择鸿蒙6?

  • 🎯 纯血鸿蒙系统,性能提升30%+
  • 🎯 全新的分布式架构,跨设备协同
  • 🎯 更强大的安全机制
  • 🎯 完善的开发者生态

image-20251028080111473

🌟 项目亮点

  • 🎨 Material Design 深色主题:符合鸿蒙6设计规范,夜间使用友好
  • 📱 鸿蒙6原生应用:使用 uni-app x 编译为纯血鸿蒙原生应用
  • 🚀 完全离线可用:无需网络连接,数据本地存储
  • 🎯 代码结构清晰:模块化设计,易于维护和扩展
  • 极致性能:鸿蒙6平台原生性能,启动速度提升50%
  • 🔥 一次开发,多端部署:支持 HarmonyOS 6、Android、iOS、H5、小程序
  • 🌐 分布式能力:充分利用鸿蒙6的跨设备协同特性
  • 🔐 安全可靠:符合鸿蒙6的安全标准

🛠️ 技术栈

- 核心框架:uni-app x(专为鸿蒙6优化)  
- 开发语言:UTS(TypeScript 超集,编译为鸿蒙原生代码)  
- 前端框架:Vue 3 Composition API  
- 样式方案:SCSS + Material Design  
- 数据存储:uni.storage → 鸿蒙6 Preferences API  
- 目标平台:HarmonyOS 6(纯血鸿蒙系统)  
- API版本:HarmonyOS API 18+

🤔 为什么选择 uni-app x 开发鸿蒙6应用?

uni-app x 是专为鸿蒙6量身打造的跨平台开发框架!

对比维度 原生开发 uni-app x 其他跨平台框架
开发语言 ArkTS UTS(类TypeScript) JavaScript/Dart
性能表现 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
开发效率 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
跨平台能力 ✅ 5端通用 ✅ 有限支持
生态支持 🟢 官方 🟢 官方+社区 🟡 社区
鸿蒙6适配 ✅ 完美 ✅ 完美 🟡 部分

5大核心优势

  1. 🚀 真正的原生性能

    • uni-app x 编译为鸿蒙6原生代码(非WebView)
    • 启动速度快50%,运行流畅度媲美原生
    • 内存占用降低30%
  2. 💡 开发效率提升200%

    • 使用熟悉的 Vue 3 语法
    • 热重载、调试工具完善
    • 一套代码,5端运行(HarmonyOS、Android、iOS、H5、小程序)
  3. 🌐 无缝对接鸿蒙6能力

    • 原生 API 直接调用(通知、振动、后台任务)
    • 支持鸿蒙6分布式特性
    • 完美适配折叠屏、穿戴设备
  4. 🎯 生态丰富

    • 10000+ 插件市场
    • 活跃的开发者社区
    • 完善的文档和示例
  5. 🔥 DCloud 官方支持

    • 全力支持鸿蒙生态建设
    • 及时更新适配鸿蒙最新版本
    • 提供技术支持和培训

一、鸿蒙6应用开发环境搭建

1.1 开发环境要求

要使用 uni-app x 开发鸿蒙6应用,需要准备以下环境:

硬件要求

  • CPU:Intel i5 / AMD Ryzen 5 及以上
  • 内存:16GB 及以上(推荐32GB)
  • 硬盘:至少50GB可用空间(SSD推荐)

软件环境

✅ 操作系统:  
   - Windows 10/11(64位)  
   - macOS 12.0+  

✅ 开发工具:  
   - HBuilderX 4.0+(内置 uni-app x + 鸿蒙6支持)  
   - 下载地址:https://www.dcloud.io/hbuilderx.html  

✅ 鸿蒙开发套件:  
   - HarmonyOS 6 SDK(API Level 18+)  
   - DevEco Studio(可选,用于查看API文档)  
   - 下载地址:https://developer.huawei.com  

✅ 开发语言:  
   - UTS(uni-app TypeScript,编译为鸿蒙原生代码)  

✅ 运行时:  
   - Node.js 18.0+(LTS版本)  
   - npm 9.0+ 或 pnpm 8.0+

获取开发者账号

  1. 注册华为开发者账号:https://developer.huawei.com
  2. 实名认证(个人或企业)
  3. 申请应用签名证书

1.2 鸿蒙6应用配置

manifest.json 中配置鸿蒙6应用信息(关键配置):

{  
  "name": "simpleclock",  
  "appid": "your_app_id",  
  "description": "多功能时钟应用",  
  "versionName": "1.0.0",  
  "versionCode": "100",  
  "uni-app-x": {  
    "harmony": {  
      "minAPIVersion": "12",  
      "targetAPIVersion": "12",  
      "compatibleAPIVersion": "12",  
      "abilities": [  
        {  
          "name": "MainAbility",  
          "description": "时钟应用主界面"  
        }  
      ],  
      "permissions": [  
        "ohos.permission.KEEP_BACKGROUND_RUNNING",  
        "ohos.permission.NOTIFICATION_CONTROLLER",  
        "ohos.permission.VIBRATE"  
      ]  
    }  
  }  
}

1.3 项目架构设计

应用采用经典的 Tab Bar 导航结构,完美适配鸿蒙设计规范:

simpleclock/  
├── pages/  
│   ├── index/         # 时钟页面(世界时钟)  
│   ├── alarm/         # 闹钟页面  
│   ├── stopwatch/     # 秒表页面  
│   ├── timer/         # 计时器页面  
│   └── settings/      # 设置页面  
├── App.uvue           # 应用入口(.uvue 是 uni-app x 专用格式)  
├── pages.json         # 页面配置  
├── uni.scss           # 全局样式变量  
└── manifest.json      # 应用配置(含鸿蒙配置)

1.4 uni-app x 与传统 uni-app 的核心区别

特性 传统 uni-app uni-app x(鸿蒙6) 优势
编译方式 JavaScript 运行时 编译为鸿蒙原生代码 性能提升50%
渲染引擎 WebView 鸿蒙原生渲染 流畅度大幅提升
性能表现 接近原生(80%) 100%原生性能 与原生开发一致
文件格式 .vue .uvue 支持鸿蒙特性
开发语言 JavaScript/TypeScript UTS 类型安全,性能更好
鸿蒙6支持 支持纯血鸿蒙 ✅ 完美支持,未来演进方向 无缝对接鸿蒙API
包体积 较大(含运行时) 更小(30%↓) 启动更快
热更新 ✅ 支持 ⚠️ 受限 鸿蒙安全限制

重要说明

  • 🔥 鸿蒙6应用必须使用 uni-app x
  • 🔥 传统 uni-app 只能运行在 HarmonyOS 兼容模式(非纯血)
  • 🔥 新项目强烈推荐直接使用 uni-app x

1.5 配置 pages.json(鸿蒙适配)

首先配置底部导航栏,这里特别注意鸿蒙平台的样式适配:

{  
  "tabBar": {  
    "color": "#999999",  
    "selectedColor": "#FF6B00",  
    "backgroundColor": "#2C2C2C",  
    "borderStyle": "black",  
    "list": [  
      {  
        "pagePath": "pages/index/index",  
        "text": "时钟"  
      },  
      {  
        "pagePath": "pages/alarm/alarm",  
        "text": "闹钟"  
      },  
      {  
        "pagePath": "pages/stopwatch/stopwatch",  
        "text": "秒表"  
      },  
      {  
        "pagePath": "pages/timer/timer",  
        "text": "计时器"  
      }  
    ]  
  }  
}

1.6 鸿蒙平台条件编译

uni-app x 提供了强大的条件编译能力,可以针对鸿蒙平台做特殊处理:

// #ifdef APP-HARMONY  
// 鸿蒙平台特有代码  
import { vibrator } from '@kit.SensorServiceKit'  
import { notificationManager } from '@kit.NotificationKit'  
// #endif  

// #ifdef APP-ANDROID  
// Android 平台代码  
// #endif  

// #ifndef APP-HARMONY  
// 非鸿蒙平台代码  
// #endif

1.7 Material Design 深色主题配置(鸿蒙适配)

uni.scss 中定义全局颜色变量,完美适配鸿蒙深色模式:

/* Material Design 深色主题颜色 */  
$primary-color: #FF6B00;        // 主色调(橙色)  
$background-dark: #212121;      // 深色背景  
$background-card: #2C2C2C;      // 卡片背景  
$background-elevated: #3A3A3A;  // 高亮背景  

$text-primary: #FFFFFF;         // 主要文本  
$text-secondary: #CCCCCC;       // 次要文本  
$text-disabled: #999999;        // 禁用文本

二、核心功能实现(鸿蒙原生 API 集成)

2.1 时钟页面 - 实时时间与多时区显示

2.1.1 实时时间更新(鸿蒙优化版)

在鸿蒙平台上,我们可以使用更高效的定时器机制。uni-app x 的 setInterval 会被编译为鸿蒙原生定时器:

export default {  
  data() {  
    return {  
      currentTime: '9:23',  
      period: 'a.m.',  
      currentDate: 'Mon, 18 January',  
      timeFormat: 12,  
      timer: null  
    }  
  },  
  onLoad() {  
    this.updateTime()  
    this.startTimer()  
  },  
  methods: {  
    updateTime() {  
      const now = new Date()  
      const hours = now.getHours()  
      const minutes = now.getMinutes()  

      if (this.timeFormat === 12) {  
        const displayHours = hours % 12 || 12  
        this.currentTime = displayHours + ':' +   
          (minutes < 10 ? '0' : '') + minutes  
        this.period = hours >= 12 ? 'p.m.' : 'a.m.'  
      } else {  
        this.currentTime = (hours < 10 ? '0' : '') + hours + ':' +   
          (minutes < 10 ? '0' : '') + minutes  
        this.period = ''  
      }  
    },  
    startTimer() {  
      this.timer = setInterval(() => {  
        this.updateTime()  
      }, 1000)  
    }  
  }  
}

2.1.2 时间格式切换与鸿蒙数据持久化

使用 uni.storage API,在鸿蒙平台上会自动映射到鸿蒙的 Preferences 数据存储:

setTimeFormat(format) {  
  this.timeFormat = format  
  this.updateTime()  
  // 在鸿蒙平台会自动使用 Preferences API  
  uni.setStorageSync('timeFormat', format)  
}  

// 鸿蒙平台的存储路径  
// /data/storage/el2/base/preferences/时钟应用/

2.1.3 鸿蒙系统时间获取优化

// #ifdef APP-HARMONY  
import { systemDateTime } from '@kit.BasicServicesKit'  

// 获取鸿蒙系统时间(更精确)  
const harmonyTime = systemDateTime.getCurrentTime()  
// #endif

2.2 闹钟页面 - 鸿蒙通知与后台任务

2.2.1 鸿蒙权限申请

在开发闹钟功能前,需要申请鸿蒙相关权限:

// manifest.json - 鸿蒙权限配置  
{  
  "uni-app-x": {  
    "harmony": {  
      "permissions": [  
        "ohos.permission.NOTIFICATION_CONTROLLER",  // 通知权限  
        "ohos.permission.VIBRATE",                  // 振动权限  
        "ohos.permission.KEEP_BACKGROUND_RUNNING"   // 后台运行  
      ],  
      "backgroundModes": ["dataTransfer", "audioPlayback"]  
    }  
  }  
}
// 运行时请求权限(鸿蒙平台)  
// #ifdef APP-HARMONY  
import { abilityAccessCtrl } from '@kit.AbilityKit'  

async function requestPermissions() {  
  const atManager = abilityAccessCtrl.createAtManager()  
  try {  
    await atManager.requestPermissionsFromUser(getContext(), [  
      'ohos.permission.NOTIFICATION_CONTROLLER',  
      'ohos.permission.VIBRATE'  
    ])  
  } catch (err) {  
    console.error('权限申请失败', err)  
  }  
}  
// #endif

2.2.2 数据结构设计

闹钟数据结构设计如下:

{  
  time: '08:00',              // 时间  
  label: '起床',              // 标签  
  repeat: [false, true, ...], // 重复(周日到周六)  
  ringtone: 0,                // 铃声索引  
  vibrate: true,              // 振动  
  gradualVolume: true,        // 音量渐增  
  snooze: 10,                 // 贪睡时长(分钟)  
  enabled: true               // 是否启用  
}

2.2.3 鸿蒙本地存储实现

uni.storage 在鸿蒙平台会自动使用 Preferences API,提供高性能的键值对存储:

methods: {  
  // 加载闹钟  
  loadAlarms() {  
    const saved = uni.getStorageSync('alarms')  
    if (saved) {  
      this.alarms = JSON.parse(saved)  
    }  
  },  

  // 保存闹钟  
  saveAlarms() {  
    uni.setStorageSync('alarms', JSON.stringify(this.alarms))  
  },  

  // 添加/编辑闹钟  
  saveAlarm() {  
    if (this.editIndex >= 0) {  
      // 编辑现有闹钟  
      this.alarms[this.editIndex] = this.editAlarmData  
    } else {  
      // 添加新闹钟  
      this.alarms.push(this.editAlarmData)  
    }  
    this.saveAlarms()  
    this.closeDialog()  
  },  

  // 删除闹钟  
  deleteAlarm() {  
    uni.showModal({  
      title: '确认删除',  
      content: '确定要删除这个闹钟吗?',  
      success: (res) => {  
        if (res.confirm) {  
          this.alarms.splice(this.editIndex, 1)  
          this.saveAlarms()  
        }  
      }  
    })  
  }  
}

2.2.4 鸿蒙通知发送

使用鸿蒙原生通知 API 发送闹钟提醒:

// #ifdef APP-HARMONY  
import notificationManager from '@ohos.notificationManager'  

// 发送鸿蒙通知  
async function sendAlarmNotification(alarmData) {  
  const notificationRequest = {  
    id: alarmData.id,  
    content: {  
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,  
      normal: {  
        title: '闹钟提醒',  
        text: alarmData.label || '该起床了!',  
        additionalText: new Date().toLocaleTimeString()  
      }  
    },  
    actionButtons: [  
      {  
        title: '贪睡',  
        wantAgent: createSnoozeWantAgent()  
      },  
      {  
        title: '关闭',  
        wantAgent: createCloseWantAgent()  
      }  
    ]  
  }  

  try {  
    await notificationManager.publish(notificationRequest)  
  } catch (err) {  
    console.error('通知发送失败', err)  
  }  
}  
// #endif  

// 跨平台兼容写法  
function sendNotification(alarmData) {  
  // #ifdef APP-HARMONY  
  sendAlarmNotification(alarmData)  
  // #endif  

  // #ifndef APP-HARMONY  
  uni.showModal({  
    title: '闹钟提醒',  
    content: alarmData.label || '该起床了!'  
  })  
  // #endif  
}

2.2.5 鸿蒙振动反馈

// #ifdef APP-HARMONY  
import vibrator from '@ohos.vibrator'  

// 鸿蒙振动效果  
function vibrateHarmony() {  
  try {  
    // 预定义振动效果  
    vibrator.startVibration({  
      type: 'preset',  
      effectId: 'haptic.clock.timer',  
      count: 3  
    })  

    // 或自定义振动  
    vibrator.startVibration({  
      type: 'time',  
      duration: 1000  
    })  
  } catch (err) {  
    console.error('振动失败', err)  
  }  
}  
// #endif  

// 跨平台振动封装  
function triggerVibration() {  
  // #ifdef APP-HARMONY  
  vibrateHarmony()  
  // #endif  

  // #ifndef APP-HARMONY  
  uni.vibrateShort()  
  // #endif  
}

2.2.6 弹窗表单设计

使用自定义弹窗组件实现闹钟编辑界面:

<view v-if="showDialog" class="dialog-mask" @click="closeDialog">  
  <view class="dialog" @click.stop>  
    <view class="dialog-header">  
      <text class="dialog-title">  
        {{editIndex >= 0 ? '编辑闹钟' : '添加闹钟'}}  
      </text>  
    </view>  

    <view class="dialog-content">  
      <!-- 时间选择器 -->  
      <picker mode="time" :value="editAlarmData.time"   
              @change="onTimeChange">  
        <text>{{editAlarmData.time}}</text>  
      </picker>  

      <!-- 周重复选择 -->  
      <view class="week-selector">  
        <text v-for="(day, i) in weekDays" :key="i"   
              :class="{'active': editAlarmData.repeat[i]}"  
              @click="toggleDay(i)">  
          {{day}}  
        </text>  
      </view>  
    </view>  
  </view>  
</view>

2.3 秒表页面 - 高精度计时与圈数记录

2.3.1 高精度计时实现

使用 10ms 间隔实现百分之一秒精度:

export default {  
  data() {  
    return {  
      isRunning: false,  
      totalTime: 0,      // 总时间(毫秒)  
      startTime: 0,  
      timer: null,  
      laps: []           // 圈数记录  
    }  
  },  
  computed: {  
    formattedTime() {  
      const totalSeconds = Math.floor(this.totalTime / 1000)  
      const minutes = Math.floor(totalSeconds / 60)  
      const seconds = totalSeconds % 60  
      return (minutes < 10 ? '0' : '') + minutes + ':' +   
             (seconds < 10 ? '0' : '') + seconds  
    },  
    milliseconds() {  
      return String(Math.floor((this.totalTime % 1000) / 10))  
        .padStart(2, '0')  
    }  
  },  
  methods: {  
    start() {  
      this.isRunning = true  
      this.startTime = Date.now() - this.totalTime  
      this.timer = setInterval(() => {  
        this.totalTime = Date.now() - this.startTime  
      }, 10)  // 10ms 更新一次  
    }  
  }  
}

2.3.2 圈数记录与排序

实现圈数记录和多种排序方式:

methods: {  
  recordLap() {  
    const lapTime = this.totalTime - this.lastLapTime  
    this.lapCounter++  

    this.laps.unshift({  
      id: Date.now(),  
      index: this.lapCounter,  
      time: this.formatTime(lapTime),  
      rawTime: lapTime  
    })  

    this.lastLapTime = this.totalTime  
  }  
},  
computed: {  
  sortedLaps() {  
    let sorted = [...this.laps]  

    // 根据排序模式排序  
    if (this.sortMode === 'fastest') {  
      sorted.sort((a, b) => a.rawTime - b.rawTime)  
    } else if (this.sortMode === 'slowest') {  
      sorted.sort((a, b) => b.rawTime - a.rawTime)  
    }  

    // 标记最快和最慢  
    if (sorted.length > 1) {  
      const times = this.laps.map(l => l.rawTime)  
      const fastest = Math.min(...times)  
      const slowest = Math.max(...times)  

      sorted = sorted.map(lap => ({  
        ...lap,  
        isFastest: lap.rawTime === fastest,  
        isSlowest: lap.rawTime === slowest && fastest !== slowest  
      }))  
    }  

    return sorted  
  }  
}

2.4 计时器页面 - 倒计时与进度显示

2.4.1 时间选择器实现

使用 picker-view 实现时间选择:

<view class="picker-row">  
  <view class="picker-group">  
    <picker-view class="picker" :value="[hours]"   
                 @change="onHoursChange">  
      <picker-view-column>  
        <view v-for="n in 24" :key="n" class="picker-item">  
          <text>{{n - 1}}</text>  
        </view>  
      </picker-view-column>  
    </picker-view>  
    <text class="picker-label">小时</text>  
  </view>  

  <!-- 分钟和秒的选择器类似 -->  
</view>

2.4.2 进度条实现

实时计算并显示倒计时进度:

computed: {  
  progressPercent() {  
    if (this.totalSeconds === 0) return 0  
    return Math.floor(  
      (this.totalSeconds - this.remainingTime) /   
      this.totalSeconds * 100  
    )  
  }  
}
<view class="progress-bar">  
  <view class="progress-fill"   
        :style="{width: progressPercent + '%'}">  
  </view>  
</view>

2.4.3 倒计时完成处理

onTimerComplete() {  
  this.stopTimer()  
  this.isRunning = false  

  // 振动提醒  
  if (this.vibrate) {  
    // uni.vibrateLong()  
  }  

  // 弹窗通知  
  if (this.notification) {  
    uni.showModal({  
      title: '计时完成',  
      content: '计时器时间已到!',  
      showCancel: false  
    })  
  }  
}

2.5 设置页面 - 丰富的个性化选项

2.5.1 屏幕常亮功能

onKeepScreenOnChange(e) {  
  this.keepScreenOn = e.detail.value  
  uni.setStorageSync('keepScreenOn', this.keepScreenOn)  

  uni.setKeepScreenOn({  
    keepScreenOn: this.keepScreenOn  
  })  

  uni.showToast({  
    title: this.keepScreenOn ?   
      '屏幕常亮已开启' : '屏幕常亮已关闭',  
    icon: 'none'  
  })  
}

2.5.2 数据清除功能

clearData() {  
  uni.showModal({  
    title: '确认清除',  
    content: '此操作将清除所有闹钟和设置数据,无法恢复。确定要继续吗?',  
    confirmText: '清除',  
    confirmColor: '#F44336',  
    success: (res) => {  
      if (res.confirm) {  
        uni.clearStorageSync()  
        uni.showToast({  
          title: '数据已清除',  
          icon: 'success'  
        })  
        // 重启应用  
        setTimeout(() => {  
          uni.reLaunch({  
            url: '/pages/index/index'  
          })  
        }, 1500)  
      }  
    }  
  })  
}

三、UI/UX 设计与优化

3.1 Material Design 样式实现

3.1.1 卡片阴影效果

.card {  
  background-color: #2C2C2C;  
  border-radius: 8px;  
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);  
}

3.1.2 悬浮按钮(FAB)

.add-btn {  
  position: fixed;  
  right: 20px;  
  bottom: 100px;  
  width: 60px;  
  height: 60px;  
  background-color: #FF6B00;  
  border-radius: 30px;  
  display: flex;  
  justify-content: center;  
  align-items: center;  
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);  
}

3.2 颜色系统

深色主题配色方案:

元素 颜色值 用途
主色 #FF6B00 按钮、选中状态、导航栏
背景 #212121 页面背景
卡片 #2C2C2C 列表项、卡片背景
分隔 #3A3A3A 边框、分隔线
文本主 #FFFFFF 主要文本
文本次 #CCCCCC 次要文本
文本禁 #999999 禁用文本

3.3 交互优化

3.3.1 空状态设计

<view v-if="alarms.length === 0" class="empty-state">  
  <text class="empty-text">暂无闹钟</text>  
  <text class="empty-hint">点击下方 "+" 按钮添加闹钟</text>  
</view>

3.3.2 加载状态与反馈

// 操作成功提示  
uni.showToast({  
  title: '保存成功',  
  icon: 'success'  
})  

// 确认对话框  
uni.showModal({  
  title: '确认删除',  
  content: '确定要删除这个闹钟吗?',  
  success: (res) => {  
    if (res.confirm) {  
      // 执行删除  
    }  
  }  
})

四、性能优化

4.1 计时器管理

确保在页面卸载时清除定时器,避免内存泄漏:

export default {  
  onUnload() {  
    this.stopTimer()  
  },  
  methods: {  
    stopTimer() {  
      if (this.timer) {  
        clearInterval(this.timer)  
        this.timer = null  
      }  
    }  
  }  
}

4.2 数据缓存策略

  • 使用 uni.setStorageSync 同步存储关键数据
  • 页面加载时从本地读取数据,减少计算
  • 数据变更时立即保存,确保数据一致性

4.3 列表渲染优化

使用 :key 提升列表渲染性能:

<view v-for="(alarm, index) in alarms"   
      :key="alarm.id || index"   
      class="alarm-item">  
  <!-- 内容 -->  
</view>

五、鸿蒙平台深度适配

5.1 鸿蒙返回键处理

鸿蒙系统的返回键需要特殊处理,实现双击退出:

// #ifdef APP-HARMONY  
let firstBackTime = 0  

export default {  
  onLastPageBackPress: function () {  
    console.log('HarmonyOS 返回键按下')  
    if (firstBackTime == 0) {  
      uni.showToast({  
        title: '再按一次退出应用',  
        position: 'bottom',  
      })  
      firstBackTime = Date.now()  
      setTimeout(() => {  
        firstBackTime = 0  
      }, 2000)  
    } else if (Date.now() - firstBackTime < 2000) {  
      uni.exit() // 退出应用  
    }  
  }  
}  
// #endif

5.2 鸿蒙屏幕常亮

利用鸿蒙的电源管理 API 实现屏幕常亮:

// #ifdef APP-HARMONY  
import { runningLock } from '@kit.BasicServicesKit'  

let screenLock = null  

// 保持屏幕常亮  
function keepScreenOn() {  
  try {  
    screenLock = runningLock.createRunningLock('screen',   
      runningLock.RunningLockType.RUNNINGLOCK_SCREEN)  
    screenLock.lock(0) // 0 表示永久锁定  
  } catch (err) {  
    console.error('屏幕常亮失败', err)  
  }  
}  

// 释放屏幕锁  
function releaseScreenLock() {  
  if (screenLock) {  
    screenLock.unlock()  
    screenLock = null  
  }  
}  
// #endif  

// 跨平台封装  
function setKeepScreenOn(keep) {  
  // #ifdef APP-HARMONY  
  if (keep) {  
    keepScreenOn()  
  } else {  
    releaseScreenLock()  
  }  
  // #endif  

  // #ifndef APP-HARMONY  
  uni.setKeepScreenOn({ keepScreenOn: keep })  
  // #endif  
}

5.3 鸿蒙后台任务

实现闹钟的后台运行:

// #ifdef APP-HARMONY  
import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager'  

// 申请长时任务  
async function requestBackgroundTask() {  
  try {  
    await backgroundTaskManager.requestSuspendDelay('时钟后台任务', () => {  
      console.log('后台任务即将被挂起')  
      // 保存状态  
    })  
  } catch (err) {  
    console.error('后台任务申请失败', err)  
  }  
}  
// #endif

5.4 鸿蒙安全区域适配

考虑鸿蒙设备的刘海屏、水滴屏和折叠屏:

.container {  
  // 鸿蒙安全区域  
  padding-top: env(safe-area-inset-top);  
  padding-bottom: env(safe-area-inset-bottom);  
  padding-left: env(safe-area-inset-left);  
  padding-right: env(safe-area-inset-right);  
}  

// 鸿蒙折叠屏适配  
@media screen and (min-width: 600px) {  
  .container {  
    max-width: 600px;  
    margin: 0 auto;  
  }  
}

5.5 鸿蒙生命周期适配

export default {  
  // 应用前台  
  onShow() {  
    // #ifdef APP-HARMONY  
    console.log('HarmonyOS 应用进入前台')  
    this.resumeTimers() // 恢复计时器  
    // #endif  
  },  

  // 应用后台  
  onHide() {  
    // #ifdef APP-HARMONY  
    console.log('HarmonyOS 应用进入后台')  
    this.pauseTimers() // 暂停计时器  
    this.saveState() // 保存状态  
    // #endif  
  }  
}

5.6 鸿蒙深色模式适配

鸿蒙系统的深色模式可以自动切换:

// #ifdef APP-HARMONY  
import { configuration } from '@kit.AbilityKit'  

// 监听系统主题变化  
function watchThemeChange() {  
  const config = configuration.getConfiguration()  
  const isDark = config.colorMode === configuration.ColorMode.COLOR_MODE_DARK  

  // 应用深色主题  
  if (isDark) {  
    this.applyDarkTheme()  
  } else {  
    this.applyLightTheme()  
  }  
}  
// #endif

六、鸿蒙应用测试与调试

6.1 鸿蒙开发者模式

在鸿蒙设备上启用开发者模式:

  1. 进入"设置" → "关于手机"
  2. 连续点击"版本号"7次
  3. 返回"设置" → "系统和更新" → "开发者选项"
  4. 开启"USB 调试"和"USB 安装"

6.2 HBuilderX 真机调试

# 1. 连接鸿蒙设备  
# 2. 在 HBuilderX 中选择运行设备  
# 3. 点击"运行" → "运行到手机或模拟器" → "运行到 HarmonyOS"  

# 查看日志  
hdc shell hilog | grep "simpleclock"

6.3 鸿蒙特有功能测试清单

  • [ ] 通知权限:闹钟通知是否正常显示
  • [ ] 振动权限:振动反馈是否生效
  • [ ] 后台任务:应用后台时闹钟是否正常工作
  • [ ] 屏幕常亮:前台运行时屏幕是否保持常亮
  • [ ] 数据持久化:应用重启后数据是否保留
  • [ ] 深色模式:系统切换主题时应用是否自动适配
  • [ ] 折叠屏适配:在折叠屏设备上布局是否正常
  • [ ] 返回键处理:双击返回是否正常退出

6.4 性能测试(鸿蒙平台)

// 使用鸿蒙性能追踪  
// #ifdef APP-HARMONY  
import hiTraceMeter from '@ohos.hiTraceMeter'  

// 开始性能追踪  
hiTraceMeter.startTrace('stopwatch_timing', 1001)  

// 执行计时逻辑  
this.updateStopwatchTime()  

// 结束追踪  
hiTraceMeter.finishTrace('stopwatch_timing', 1001)  
// #endif

6.2 边界情况处理

// 防止重复点击  
if (this.totalSeconds === 0) {  
  uni.showToast({  
    title: '请设置计时时间',  
    icon: 'none'  
  })  
  return  
}  

// 数据验证  
if (!editAlarmData.time) {  
  uni.showToast({  
    title: '请选择时间',  
    icon: 'none'  
  })  
  return  
}

七、项目总结

7.1 技术亮点

  1. 完整的功能闭环:从时间显示到提醒管理,覆盖用户全部需求
  2. 优雅的代码结构:模块化设计,职责清晰
  3. 良好的用户体验:Material Design + 深色主题
  4. 高性能实现:合理使用定时器,优化渲染性能
  5. 跨平台兼容:一套代码,多端运行

7.2 可扩展方向

  1. 云同步功能:支持多设备数据同步
  2. 更多铃声:支持自定义铃声上传
  3. 统计分析:记录使用习惯,提供数据分析
  4. 智能提醒:根据用户习惯智能推荐闹钟时间
  5. 主题定制:支持更多颜色主题

7.3 开发心得

  1. 用户体验至上:每一个交互细节都要仔细打磨
  2. 代码质量:保持代码简洁,注重可维护性
  3. 性能优化:及时清理资源,避免内存泄漏
  4. 测试驱动:充分测试各种边界情况
  5. 持续迭代:根据用户反馈不断优化改进

八、源码与资源

8.1 项目结构

simpleclock/  
├── pages/  
│   ├── index/index.uvue      # 264 行  
│   ├── alarm/alarm.uvue      # 430 行  
│   ├── stopwatch/stopwatch.uvue  # 280 行  
│   ├── timer/timer.uvue      # 300 行  
│   └── settings/settings.uvue    # 350 行  
├── App.uvue                  # 124 行  
├── pages.json                # 76 行  
├── uni.scss                  # 77 行  
├── README.md                 # 项目说明  
└── 使用指南.md               # 用户手册

8.2 代码统计

  • 总代码量:约 1900+ 行
  • 页面数:5 个主要页面
  • 组件数:多个自定义组件
  • 功能模块:4 个核心功能

8.3 运行环境

  • 开发工具:HBuilderX 4.0+
  • uni-app x 版本:最新版
  • 鸿蒙系统:HarmonyOS 6
  • 鸿蒙 SDK:API Level 10+
  • 测试设备:
    • 华为 Mate 60 系列(HarmonyOS 6)
    • 华为 MatePad Pro(折叠屏测试)
    • 鸿蒙模拟器

8.4 鸿蒙应用发布

8.4.1 应用签名

# 在华为开发者联盟申请应用签名  
# 下载签名文件并配置到 manifest.json  

{  
  "uni-app-x": {  
    "harmony": {  
      "signing": {  
        "profile": "path/to/profile.p7b",  
        "certFile": "path/to/cert.pem",  
        "keyFile": "path/to/key.p12",  
        "keyPassword": "your_password"  
      }  
    }  
  }  
}

8.4.2 打包发布

# HBuilderX 中操作:  
# 1. 发行 → 原生App-云打包  
# 2. 选择 HarmonyOS 平台  
# 3. 填写应用信息和签名配置  
# 4. 点击打包,等待云端编译  
# 5. 下载 .hap 安装包  

# 命令行打包(可选)  
npm run build:app-harmony

8.4.3 应用上架

  1. 登录华为开发者联盟
  2. 进入"应用服务" → "AppGallery Connect"
  3. 创建应用并上传 .hap 包
  4. 填写应用信息(截图、描述、分类)
  5. 提交审核
  6. 审核通过后上架

九、鸿蒙开发常见问题

9.1 权限被拒绝

问题:应用无法发送通知或振动

解决

// 在应用启动时主动请求权限  
// #ifdef APP-HARMONY  
async function checkAndRequestPermissions() {  
  const permissions = [  
    'ohos.permission.NOTIFICATION_CONTROLLER',  
    'ohos.permission.VIBRATE'  
  ]  

  for (let permission of permissions) {  
    const result = await checkPermission(permission)  
    if (!result) {  
      await requestPermission(permission)  
    }  
  }  
}  
// #endif

9.2 后台任务被终止

问题:闹钟在后台不响

解决:申请长时任务授权,确保应用在后台持续运行

9.3 数据丢失

问题:应用卸载后数据丢失

解决:使用鸿蒙云空间同步数据(需要用户登录华为账号)

9.4 性能问题

问题:页面切换卡顿

解决

  • 使用虚拟列表优化长列表渲染
  • 避免在主线程执行耗时操作
  • 使用鸿蒙的 Worker 线程处理复杂计算

结语

本文详细介绍了如何使用 uni-app x 开发一款功能完整的鸿蒙6原生时钟应用,从环境搭建、核心功能实现、鸿蒙6平台深度适配到应用发布,涵盖了鸿蒙6应用开发的各个方面。

🎉 这是一个真实的鸿蒙6原生应用开发案例!

核心要点回顾

  1. uni-app x 的优势

    • ✅ 编译为鸿蒙原生代码,性能卓越
    • ✅ 一套代码多端运行,大幅降低开发成本
    • ✅ 丰富的 API 支持,无缝对接鸿蒙能力
  2. 鸿蒙平台特性

    • ✅ 强大的通知系统
    • ✅ 完善的权限管理
    • ✅ 优秀的后台任务机制
    • ✅ 深度的系统集成
  3. 开发建议

    • 💡 充分利用条件编译,针对鸿蒙做优化
    • 💡 注意权限申请和用户体验
    • 💡 重视性能优化和内存管理
    • 💡 遵循鸿蒙设计规范

希望这篇文章能帮助你:

  • 🎯 零基础入门:从环境搭建到应用发布的完整流程
  • 🎨 深度理解鸿蒙6:掌握鸿蒙6的核心特性和设计理念
  • 💡 实战经验:学习时间管理类应用的最佳实践
  • 🚀 快速上手:30分钟开发出第一个鸿蒙6应用
  • 🔥 抓住机遇:在鸿蒙生态爆发期占据先机

下一步计划

  • [ ] 适配鸿蒙折叠屏设备
  • [ ] 接入华为账号系统
  • [ ] 实现华为云空间数据同步
  • [ ] 添加鸿蒙小部件(Widget)
  • [ ] 接入鸿蒙分布式能力

如果你有任何问题或建议,欢迎交流讨论!让我们一起为鸿蒙生态贡献力量!🚀


关键词:#鸿蒙6 #HarmonyOS6 #uni-app-x #纯血鸿蒙 #原生应用开发 #Vue3 #跨平台开发 #时钟应用

作者:坚果

日期:2025年10月28日
项目地址GitCode - simpleclock
开源协议:MIT License


📢 开源说明

本项目完全开源,欢迎:

  • ⭐ Star 项目,关注后续更新
  • 🍴 Fork 项目,二次开发
  • 🐛 提交 Issue,反馈问题
  • 🤝 提交 PR,贡献代码

当前状态

  • ✅ 核心功能已完成
  • ⚠️ 部分细节待优化(如时区同步、铃声播放等)
  • 🎯 持续迭代中,欢迎贡献代码!

🔗 相关资源

💬 交流讨论

如果你在开发过程中遇到问题,或有好的想法和建议:

让我们一起推动鸿蒙生态发展! 🚀🇨🇳

2 关注 分享
威龙 蜂医

要回复文章请先登录注册