EasyApp

锁屏小组件

了解如何在 EasyAppSwiftUI 中实现锁屏小组件

简介

EasyAppWidget 锁屏小组件使用 WidgetKit 提供的 AccessoryWidget 家族,覆盖圆形、矩形与行内三种形态。本文将介绍锁屏视图的布局、数据来源以及如何扩展更多状态展示。

组件类型

  • 圆形 (AccessoryCircularWidgetView) 使用 Link 打开 easyapp://microphone 深链,适合用于单一图标入口。
  • 矩形 (AccessoryRectangularWidgetView) 展示 Emoji、品牌文本与当前时间,适合传达即时状态或进度。
  • 行内 (AccessoryInlineWidgetView) 在时间文字旁显示简洁状态行,便于锁屏顶部快速阅览。

这些视图都定义在 EasyAppSwiftUI/EasyAppWidget/WidgetsComponents/AccessoryWidgetViews.swift 中,可根据需求修改排版与文案。

数据来源

  • 三种锁屏视图共用 SimpleEntry 数据结构,来源于 Provider.timeline
  • Emoji 取自 ConfigurationAppIntent.favoriteEmoji,时间采用 TimelineEntry.date,确保展示内容与桌面小组件保持同步。

关键代码片段

struct AccessoryCircularWidgetView: View {
    let entry: SimpleEntry

    var body: some View {
        Link(
            destination: URL(string: "easyapp://microphone?path=microphone")!,
            label: {
                Image(systemName: "microphone.fill")
                    .font(.system(size: 20, weight: .medium))
                    .foregroundStyle(.blue)
            })
    }
}
  • 修改 destination URL 即可替换为其他应用内功能。
  • 若需要展示文本,可在 Link 内嵌 VStackHStack 结构,但要保持视觉简洁。
struct AccessoryRectangularWidgetView: View {
    let entry: SimpleEntry

    var body: some View {
        HStack(spacing: 8) {
            Text(entry.configuration.favoriteEmoji)
                .font(.system(size: 24))

            VStack(alignment: .leading, spacing: 2) {
                Text("EasyApp")
                    .font(.system(.caption2, design: .rounded))
                    .fontWeight(.semibold)
                    .foregroundStyle(.primary)

                Text(entry.date, style: .time)
                    .font(.system(.subheadline, design: .rounded))
                    .fontWeight(.bold)
                    .foregroundStyle(.secondary)
            }
        }
        .padding(.horizontal, 8)
    }
}
  • 调整 VStack 内容可以增加状态文本或指标,例如“下一场会议 10:30”。
  • 对齐方式和间距直接影响锁屏展示效果,建议使用 spacingpadding 控制紧凑布局。
struct AccessoryInlineWidgetView: View {
    let entry: SimpleEntry

    var body: some View {
        HStack(spacing: 4) {
            Text(entry.configuration.favoriteEmoji)
                .font(.system(size: 16))

            Text("EasyApp")
                .font(.system(.caption, design: .rounded))
                .fontWeight(.medium)

            Text("•")
                .foregroundStyle(.secondary)

            Text(entry.date, style: .time)
                .font(.system(.caption, design: .rounded))
                .fontWeight(.medium)
        }
    }
}
  • 行内视图文字较多时,请使用 lineLimit(1) 保持单行显示。
  • 若要添加实时状态,可将时间替换为 Text(entry.configuration.customStatus) 等字段。

使用与配置

  1. 确保 EasyAppWidget.swift.supportedFamilies 包含 .accessoryCircular.accessoryRectangular.accessoryInline
  2. 在系统锁屏编辑界面添加相应的组件:
    • 圆形:适用于左上角/右上角状态位。
    • 矩形:适用于锁屏下方的宽条区域。
    • 行内:替换默认时间文字旁的简洁描述。
  3. 编辑 ConfigurationAppIntent 参数即可自定义 Emoji 或状态文本。

设计注意事项

  • 优先使用系统颜色 .primary.secondary,避免锁屏在不同背景下出现对比度问题。
  • 保持布局简洁,避免过多按钮或复杂交互,锁屏仅允许轻触打开应用。
  • 修改字体/字号时,请遵循 WidgetKit 锁屏组件的尺寸限制,防止文本被裁切。

常见问题

  • 未显示锁屏组件:确认在主应用的 Info.plist 中已启用 Widget Extension,并重新安装。
  • 点击无响应:检查自定义 URL Scheme 是否配置正确,或使用 WidgetCenter.shared.reloadAllTimelines() 强制刷新后再试。
  • 文案被截断:缩短显示文本,或在 AccessoryRectangularWidgetView 中使用 lineLimitminimumScaleFactor
  • 暗色下对比度低:改用 .foregroundStyle(.primary) 或自定义更亮的系统颜色。

更多锁屏布局示例可在 AccessoryWidgetViews.swift 底部的 #Preview 中预览,分别针对三种尺寸进行调试。

Last updated on