【2】Swift Dynamic Island开发

文章目录

灵动岛(Dynamic Island)和实时活动(Live Activities)是 iPhone 为了便于用户在退出APP时,仍然能随时关注进行中的活动、高频操作的组件。其中:

  • 灵动岛是,当用户退出当前App后,仍然在手机前置镜头附近展示的信息/状态,有小岛(minimal )大岛(compact )两种展示状态。
  • 实时活动是,在锁屏界面保持实时更新的信息卡片,其展示优先级高于通知。

先新建一个实时活动组件

  1. 新建APP项目

    新建一个Swift APP项目,在 Info.plist 中加入一个新的条目 Supports Live Activities (或者使用原始Key: NSSupportsLiveActivities), 并且设置为 YES, 告诉系统你的 App 需要使用 Live Activity 的权限。 否则调用 API 的时候会直接报错(最新版本的 Xcode 才能找到这个选项)。

  2. 创建实时活动组件项目。

    然后创建一个实时活动组件、按照 File -> New -> Target打开标签卡,搜索Widget Extension

  1. 创建后的目录结构如下

  2. LiveActivityWidgetLiveActivit.swift文件的Target Membership 勾选上我们的 App 项目,这样做 App 代码中就可以引用到 Widget 中的内容 。

  3. 现在就可以运行起来了。(但是此时可能你的灵动岛没任何反应,锁屏的实时界面没任何内容,这个是正常的,因为还没有增加启动灵动岛的代码呢,)

熟悉下实时活动的代码

  1. LiveActivityWidgetLiveActivit.swift文件中,定义了两个结构体WidgetAttributesWidgetLiveActivityWidgetAttributes定义的是Dynamic IsIand的数据结构,WidgetLiveActivity定义了组件的View。
Swift 复制代码
struct LiveActivityWidgetAttributes: ActivityAttributes {
    public struct ContentState: Codable, Hashable {
        // Dynamic stateful properties about your activity go here!
        var emoji: String
    }

    // Fixed non-changing properties about your activity go here!
    var name: String
}

struct LiveActivityWidgetLiveActivity: Widget {
											   
}
  1. 启动Live Activity,
    我们需要一个位置,启动实时活动组件,在 App 主项目中,引入 ActivityKit ,然后调用它的Activity.request方法:
Swift 复制代码
//
//  ViewController.swift
//  LiveActivity
//
//  Created by yu tian on 2024/7/31.
//

import UIKit
import ActivityKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let state = LiveActivityWidgetAttributes.ContentState(emoji: "😀");
        let attr = LiveActivityWidgetAttributes(name: "hello")
        
        do {
            try Activity.request(attributes: attr, contentState: state);
        }catch {
            print("err\(error)")
        }
    }
}

现在编译代码,就可以运行我们的组件了。

UI代码解析

灵动岛的UI结构如下:

灵动岛的UI代码均在WidgetLiveActivity结构中,想要实现功能,在对应的View中修改即可。

Swift 复制代码
// 配置UI,共计需要设计出 4 个 UI,且全都需要实现
struct LiveActivityWidgetLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: LiveActivityWidgetAttributes.self) { context in
            // 锁屏UI,出现在所有设备上 - 第一个UI
            // 不支持灵动岛的未锁屏的设备上,显示为 banner UI
            // 两个都使用同一个View组件,在这里配置
            // 系统使用默认的文本颜色和最适合锁定屏幕的实时活动背景色
            VStack {
                Text("Your \(context.state.driverName) is on the way!")
            }
            .activityBackgroundTint(Color.cyan)  // 修改背景颜色
            .activitySystemActionForegroundColor(Color.black)  //  修改文本颜色
        } dynamicIsland: { context in
            // 灵动岛UI
            DynamicIsland {
                // 展开后的UI - 第二个UI
                // 需要组合不同的区域
                DynamicIslandExpandedRegion(.leading) {
                    // 展开后的前面
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    // 展开后的后面
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.center) {
                    // 展开后的中间
                    Text("Center")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    // 展开后的底部
                    Text("Bottom")
                }
            } compactLeading: {
                // 紧凑样式的左边 - 第三个UI(左)
                Text("L")
            } compactTrailing: {
                // 紧凑样式的右边 - 第三个UI(右)
                Text("T")
            } minimal: {
                // 当有多个 Live Activity时,灵动岛显示成circular minimal 样式 - 第四个UI
                Text("Min")
            }
            .widgetURL(URL(string: "tianyiyi://ViewController"))  // 点击跳转到指定页面
            .keylineTint(Color.red)
        }
    }
} 

待完善:

相关推荐
x864 分钟前
Go 1.27 正式发布:泛型方法、encoding/json/v2、后量子签名 ML-DSA 与 SIMD
开发语言·golang
时代分流16 分钟前
云手机推荐2026:安卓全能、批量挂机、原生iOS全覆盖
android·ios·智能手机
杨丰玮41818 分钟前
暑假Java知识点回顾:类与对象知识总结
java·开发语言
Patrick在香港25 分钟前
Python asyncio vs 多线程 vs 多进程——同一份 HKOpenDataClient 实测 5/30/100 endpoint,谁是真的银弹
开发语言·python
牛油果子哥q28 分钟前
C++异常处理万字详解:try-throw-catch机制、栈展开、标准异常体系、自定义异常、工程规范、内存泄漏避坑
开发语言·jvm·c++
Metaphor69229 分钟前
使用 Python 设置 Excel 文件属性
开发语言·python·excel
艾莉丝努力练剑36 分钟前
【AI大模型接入SDK】C++日志体系与spdlog封装的理论部分
开发语言·c++·ide·人工智能·学习·面试·trae
dear_bi_MyOnly39 分钟前
C语言控制语句与循环逻辑精讲
c语言·开发语言·学习·分类
Dovis(誓平步青云)41 分钟前
心情日记的安全编辑流程:输入校验、删除确认与状态回收
android·运维·服务器·开发语言·windows·安全
落魄大学生之流水线上谋生计1 小时前
Python Literal[] 类型提示详解
开发语言·python