铃-铃-铃!从你食谱 app 中的倒计时器到你旅行规划 app 中的闹钟,ios 和 ipados 26 中的 alarmkit 框架可将计时器和闹钟引入到锁定屏幕、灵动岛等其他地方。了解如何使用 app intents 框架来创建和管理你 app 的闹钟,自定闹钟的实时活动,并提供自定提醒操作。为了充分从这个视频中获益,建议你先观看 wwdc23 讲座“了解 activitykit”。

视频封面
视频地址

此文章由AI生成,可能存在错误,如有问题,请联系djs66256@163.com

全面解析 iOS AlarmKit 框架:从基础应用到高级定制

iOS 和 iPadOS 26 中引入的 AlarmKit 框架为开发者提供了一套完整的闹钟功能实现方案。该框架不仅支持基础闹钟功能,还能与系统深度整合,在锁定屏幕、灵动岛等界面展示丰富的交互体验。本文将系统性地介绍 AlarmKit 的各项功能特性、实现方式以及最佳实践。

AlarmKit 框架概述

AlarmKit 是 iOS 系统提供的一个专业闹钟管理框架,它能够实现以下核心功能:

  • 创建基于固定时间或重复模式的闹钟提醒
  • 支持倒计时功能,包括预警倒计时和后续倒计时间隔
  • 突破系统静音模式和专注模式的显著提醒
  • 与实时活动(Live Activities)深度整合,在锁定屏幕、灵动岛和待机模式下展示自定义界面
  • 提供可定制的提示音和交互按钮

闹钟触发时会显示包含自定义标题和应用名称的提醒界面,用户可选择关闭或使用小睡功能延迟处理。此外,闹钟还支持在配对的 Apple Watch 上同步展示。

授权与权限配置

在使用 AlarmKit 前,应用必须获取用户授权。授权配置包含以下关键步骤:

  1. 在 Info.plist 中添加 NSAlarmKitUsageDescription 键,说明闹钟的使用场景
  2. 使用 AlarmManager 的 requestAuthorization API 手动请求授权
  3. 在调度闹钟前检查 authorizationState 状态

授权状态检查示例

import AlarmKit

func checkAuthorization() {
  switch AlarmManager.shared.authorizationState {
    case .notDetermined:
      // 手动请求授权
    case .authorized:
      // 继续调度闹钟
    case .denied:
      // 提示用户未获授权
  }
}

用户授权状态分为三种:未决定(notDetermined)、已授权(authorized)和被拒绝(denied)。开发者应在应用界面清晰处理各种状态,特别是被拒绝状态时应明确告知用户无法设置闹钟。

闹钟创建与配置

创建闹钟需要配置多个核心要素,包括倒计时时长、日程设置、界面定制等。

倒计时配置

AlarmKit 支持设置预警倒计时和后续倒计时两个阶段:

倒计时配置示例

import AlarmKit

func scheduleAlarm() {
  let countdownDuration = Alarm.CountdownDuration(preAlert: (10 * 60), postAlert: (5 * 60))
}

此配置表示10分钟预警倒计时和5分钟后续倒计时。首次调度时会显示预警倒计时界面,结束后触发提醒界面。若用户选择小睡,则会再次显示后续倒计时界面。

日程设置

AlarmKit 提供两种日程设置模式:

  1. 固定日程:指定未来某个绝对时间,不受时区变化影响

固定日程示例

import AlarmKit

func scheduleAlarm() {
  let keynoteDateComponents = DateComponents(
    calendar: .current,
    year: 2025,
    month: 6,
    day: 9,
    hour: 9,
    minute: 41)
  let keynoteDate = Calendar.current.date(from: keynoteDateComponents)!
  let scheduleFixed = Alarm.Schedule.fixed(keynoteDate)
}
  1. 相对日程:包含每日时间和周重复模式,自动适应时区变化

相对日程示例

import AlarmKit

func scheduleAlarm() {
  let time = Alarm.Schedule.Relative.Time(hour: 7, minute: 0)
  let recurrence = Alarm.Schedule.Relative.Recurrence.weekly([.monday, .wednesday, .friday])
  let schedule = Alarm.Schedule.Relative(time: time, repeats: recurrence)
}

界面定制与实时活动

AlarmKit 支持高度自定义的界面展示,包括提醒界面和倒计时界面。开发者可以通过实时活动(Live Activities)在锁定屏幕、灵动岛和待机模式下展示丰富内容。

实时活动配置示例

import AlarmKit
import ActivityKit
import WidgetKit

struct AlarmLiveActivity: Widget {
  var body: some WidgetConfiguration {
    ActivityConfiguration(for: AlarmAttributes<CookingData>.self) { context in
      switch context.state.mode {
        case .countdown: countdownView(context)
        case .paused: pausedView(context)
        case .alert: alertView(context)
      }
    } dynamicIsland: { context in
      DynamicIsland {
        // 展开区域视图
      } compactLeading: { compactLeadingView(context) }
      // 其他紧凑视图
    }
  }
}

高级功能与最佳实践

自定义动作处理

通过 App Intent 框架,开发者可以为闹钟按钮添加自定义动作:

自定义按钮动作示例

import AlarmKit
import AppIntents

func scheduleAlarm() async throws {
    let openButton = AlarmButton(text: "打开", textColor: .white, systemImageName: "arrow.right.circle.fill")
    let alertPresentation = AlarmPresentation.Alert(..., secondaryButtonBehavior: .custom)
    let secondaryIntent = OpenInApp(alarmID: id.uuidString)
}

public struct OpenInApp: LiveActivityIntent {
    public static var openAppWhenRun = true
    @Parameter public var alarmID: String
}

提示音定制

AlarmKit 支持使用系统预置或自定义的提示音:

提示音配置示例

let sound = AlertConfiguration.AlertSound.named("Chime")
let alarmConfiguration = AlarmConfiguration(..., sound: sound)

生命周期管理

AlarmManager 提供完整的闹钟生命周期管理API,包括:

  • 调度新闹钟
  • 取消已有闹钟
  • 暂停/恢复闹钟
  • 查询当前闹钟状态

应用场景与限制

AlarmKit 最适合以下场景:

  • 精确倒计时应用(如烹饪计时器)
  • 规律性提醒(如起床闹钟)
  • 需要突破静音模式的紧急提醒

但不建议用于替代关键通知或时效性通知。开发者应保持提醒界面简洁明了,实时活动应包含剩余时间、关闭和暂停/继续按钮等核心元素。

总结

AlarmKit 框架为 iOS 应用提供了强大的闹钟功能实现方案。通过合理配置授权、精心设计界面和充分利用实时活动,开发者可以为用户创造丰富而实用的闹钟体验。建议结合 App Intents 和 ActivityKit 框架,实现更高级的定制功能。

相关视频和文档资源可帮助开发者更深入地了解和应用 AlarmKit 框架。