iOS 组件开发教程——手把手轻松实现灵动岛

2024-01-04 18:20

本文主要是介绍iOS 组件开发教程——手把手轻松实现灵动岛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、先在项目里创建一个Widget Target

2.

2、一定要勾选 Include live Activity,然后输入名称,点击完成既可。

在这里插入图片描述

3、在 Info.plist 文件中声明开启,打开 Info.plist 文件添加 NSSupportsLiveActivities,并将其布尔值设置为 YES。

4、我们创建一个IMAttributes,

struct IMAttributes: ActivityAttributes {public typealias IMStatus = ContentStatepublic struct ContentState: Codable, Hashable {var callName: Stringvar imageStr : Stringvar callingTimer: ClosedRange<Date>}var callName: Stringvar imageStr : Stringvar callingTimer: ClosedRange<Date>
}

5、灵动岛界面配置

struct IMActivityWidget: Widget {var body: some WidgetConfiguration {ActivityConfiguration(for: IMAttributes.self) { context in// 创建显示在锁定屏幕上的演示,并在不支持动态岛的设备的主屏幕上作为横幅。// 展示锁屏页面的 UI} dynamicIsland: { context in// 创建显示在动态岛中的内容。DynamicIsland {//这里创建拓展内容(长按灵动岛)DynamicIslandExpandedRegion(.leading) {Label(context.state.callName, systemImage: "person").font(.caption).padding()}DynamicIslandExpandedRegion(.trailing) {Label {Text(timerInterval: context.state.callingTimer, countsDown: false).multilineTextAlignment(.trailing).frame(width: 50).monospacedDigit().font(.caption2)} icon: {Image(systemName: "timer")}.font(.title2)}DynamicIslandExpandedRegion(.center) {Text("\(context.state.callName) 正在通话中...").lineLimit(1).font(.caption).foregroundColor(.secondary)}}//下面是紧凑展示内容区(只展示一个时的视图)compactLeading: {Label {Text(context.state.callName)} icon: {Image(systemName: "person")}.font(.caption2)} compactTrailing: {Text(timerInterval: context.state.callingTimer, countsDown: true).multilineTextAlignment(.center).frame(width: 40).font(.caption2)}//当多个Live Activities处于活动时,展示此处极小视图minimal: {VStack(alignment: .center) {Image(systemName: "person")}}.keylineTint(.accentColor)}}
}

6、在需要的地方启动的地方调用,下面是启动灵动岛的代码

        let imAttributes = IMAttributes(callName: "wqd", imageStr:"¥99", callingTimer: Date()...Date().addingTimeInterval(0))//初始化动态数据let initialContentState = IMAttributes.IMStatus(callName: name, imageStr: "ia.imageStr", callingTimer: Date()...Date().addingTimeInterval(0))do {//启用灵动岛//灵动岛只支持Iphone,areActivitiesEnabled用来判断设备是否支持,即便是不支持的设备,依旧可以提供不支持的样式展示if #available(iOS 16.1, *) {if ActivityAuthorizationInfo().areActivitiesEnabled == true{}} else {// Fallback on earlier versions}let deliveryActivity = try Activity<IMAttributes>.request(attributes: imAttributes,contentState: initialContentState,pushType: nil)//判断启动成功后,获取推送令牌 ,发送给服务器,用于远程推送Live Activities更新//不是每次启动都会成功,当已经存在多个Live activity时会出现启动失败的情况if deliveryActivity.activityState == .active{_ = deliveryActivity.pushToken}
//            deliveryActivity.pushTokenUpdates //监听token变化print("Current activity id -> \(deliveryActivity.id)")} catch (let error) {print("Error info -> \(error.localizedDescription)")}
6.此处只有一个灵动岛,当一个项目有多个灵动岛时,需要判断更新对应的activityfunc update(name:String) {Task {let updatedDeliveryStatus = IMAttributes.IMStatus(callName: name, imageStr: "ia.imageStr", callingTimer: Date()...Date().addingTimeInterval(0))for activity in Activity<IMAttributes>.activities{await activity.update(using: updatedDeliveryStatus)}}}

7、停止灵动岛

func stop() {Task {for activity in Activity<IMAttributes>.activities{await activity.end(dismissalPolicy: .immediate)}}
}

相关推荐:

更多技术文章:https://www.imgeek.net/

这篇关于iOS 组件开发教程——手把手轻松实现灵动岛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570178

相关文章

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放

SpringMVC前后端传值的几种实现方式

《SpringMVC前后端传值的几种实现方式》本文主要介绍了SpringMVC前后端传值的方式实现,包括使用HttpServletRequest、HttpSession、Model和ModelAndV... 目录一、从Controller层到JSP界面1、使用HttpServletRequest的方式2、使

树莓派启动python的实现方法

《树莓派启动python的实现方法》本文主要介绍了树莓派启动python的实现方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、RASPBerry系统设置二、使用sandroidsh连接上开发板Raspberry Pi三、运

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、