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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之四大引擎、建库建表以及账号管理

目录 一. 数据库存储引擎 1.1 存储引擎查看 1.2 InnoDB 1.3 MyISAM 1.4 MEMORY 1.5 ARCHIVE 二. 数据库管理 2.1 元数据库简介 2.2 元数据库分类 2.3 数据库的增删改查及使用&#xff1a; 2.4 MySQL库的权限 三. 数据表管理 3.1 三大范式 3.2 基本数据类型 3.2.1 优化原则 3…

这个方法可以让你把图片无损放大

随着数字技术的不断发展&#xff0c;照片无损放大已经成为了摄影领域中的一项重要技术。照片无损放大能够让摄影师在不损失细节和画质的情况下&#xff0c;将照片放大到更大的尺寸&#xff0c;从而让观众能够更加清晰地欣赏到照片中的每一个细节。 今天推荐的这款软件主要是通…

Mysql隔离级别MVCC多版本并发控制机制

欢迎大家关注我的微信公众号&#xff1a; 传送门&#xff1a;Mysql事务原理与优化 目录 概述 undo日志版本链与read view机制详解 深入浅出分析MVCC可见性算法的操作示例 关于readview和可见性算法的原理解释 总结 概述 在之前的文章中讲过&#xff0c;Mysql在可重…

基于Segformer实现PCB缺陷检测(步骤 + 代码)

导 读 本文主要介绍基于Segformer实现PCB缺陷检测 &#xff0c;并给出步骤和代码。 背景介绍 PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性&#xff0c;还可以大大减少检测时间。传统方法涉及手动检查&#xff0c;无法扩展且容易出错…

魏副业而战:手机副业新风口,短剧内容创作实操,日赚500+的创业指南

我是魏哥&#xff0c;与其躺平&#xff0c;不如魏副业而战&#xff01; 今天魏哥给大家分享一个短剧推广的副业项目。 有人会有疑惑&#xff0c;短剧推广是去年爆火的副业项目&#xff0c;现在操作是不是有点晚了。 这个大家不要有太多的顾虑。 恰恰相反&#xff0c;短剧推广…

【springboot项目】之秒杀项目常见问题(Seckill)

秒杀问题分为两部分&#xff1a;用户查看商品详情页、用户下单 项目简介&#xff1a; 模拟了高并发场景的商城系统&#xff0c;它具备秒杀功能&#xff0c;为了解决秒杀场景下的高并发问题。引入了 redis 作为缓存中间件&#xff0c;1.主要作用是缓存预热、预减库存等等。2.针…

新年话节能 电梯也减排

小伍恭祝大家2024年元旦快乐&#xff01;&#xff01; 目前&#xff0c;电梯的节能已经得到业界的广泛重视&#xff0c;积极推动相关的节能技术的实施&#xff0c;努力宣传和倡导规范的电梯的使用行为&#xff0c;将极大地改变我国电梯的耗能状况&#xff0c;为节能减排做出较大…

遥测终端机:数据世界的千里眼与顺风耳

在当今这个信息爆炸的时代&#xff0c;数据的重要性日益凸显。如何高效、准确地收集、传输和处理这些数据&#xff0c;成为了众多企业和研究机构关注的焦点。而遥测终端机&#xff0c;正是这样一种解决这一问题的强大工具。 遥测终端机&#xff0c;顾名思义&#xff0c;是一种…

JavaScript 基础(一)

实验需新建一个 test.html 文件&#xff0c;用于编写代码。后续的例子中&#xff0c;将不再提醒建立文件&#xff0c;大家根据个人需求自行创建对应的 html 文件&#xff0c;并完成代码练习&#xff1a; 首先来看看范例代码&#xff1a; <!doctype html> <html>&…

OpenAI API/Plus会员信用卡绑定付款方式经历

前言 9月25日起ChatGPT风控升级&#xff0c;428813的卡只可以支付Open ai API-key&#xff0c;直接订阅plus会被拒。部分用户将卡绑定美区Google pay使用app store进行订阅可以成功&#xff0c;如果您没有这两种支付方式&#xff0c;请您重新开一张534786的万事达美卡升级订阅…

光伏效果图是用什么软件建模设计的?

光伏效果图是展示光伏系统在建筑或地面上的外观和效果的图像。要创建这样的效果图&#xff0c;需要使用专业的建模和设计软件。那么&#xff0c;光伏效果图是用什么软件建模设计的呢&#xff1f; 鹧鸪云光伏设计软件&#xff1a;鹧鸪云是一款集开发、设计和施工为一体的设计软…

2023年终总结|回顾学习Tensorflow、Keras的历程

2023年4月&#xff0c;初探TensorFlow2.0&#xff0c;对比了1.0版本的差异。接着&#xff0c;学习了TensorFlow2.0的常量矩阵、四则运算以及常用函数。学习了数据切割、张量梯度计算、遍历元素、类别索引转换等技巧&#xff0c;并掌握了CNN输出特征图形状的计算方法。 在数据处…

kafka消息队列安装以及整合springboot使用

文章目录 一、JMS与AMQP二、安装2.1 Java安装2.2 Zookeeper 和 kafka安装2.3 docker-compose 安装【待定&#xff0c;远程连接可能连接不上】 三、Kafka数据存储流程和原理概述和LEOHW讲解四、代码客户端连接kafka五、**ProducerRecord和key的作用**5.1 **如果保证顺序消费&…

cnstd使用效果测试

使用参考&#xff1a;https://github.com/breezedeus/CnSTD/tree/master 原理参考&#xff1a;https://cnocr.readthedocs.io/zh/latest/intro-cnstd-cnocr.pdf 模型&#xff1a; 结论&#xff1a; 经过测试&#xff0c; 长文本检测效果不错&#xff0c;短文本可能角度不对 …

【Harmony OS - 网络请求】

在一个应用开发中&#xff0c;网络请求是必不可少的&#xff0c;我们一般用的fetch、axios来进行http请求&#xff0c;在鸿蒙中也可以通过createHppt来发生一个http请求&#xff0c;它们都是异步请求返回的Promise&#xff0c;下面我们将介绍’ohos.net.http’和axios这两种方式…

学而时习之---状态模式

在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c; 这些状态在某些情况下能够相互转换&#xff0c; 而且对象在不同的状态下具有不同的行为。 为了更好地对这些具有多种状态的对象进行设计。 使用一种被称为状态模式的设计模式。 状态模式用于解决系统中复…

[DevOps-05] Jenkins实现CI/CD操作

一、简要说明 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 二、准备Springboot工程 1、IDEA新建工程 2、填写项目工程信息 3、选择Springboot版本…

不要盲目自学网络安全!学习顺序特别重要!

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

中国植被分区数据,shp数据,2000年,字段包含区域代码、名称、地带代码及名称,附高清图可视化

数据名称: 中国植被分区数据 数据格式: Shp 数据时间: 2000年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1zbqydm植被区域代码2zbqymc植被区域名称3zbdddm植被地带代码4zbddmc植被地带名称 …

接口和抽象类有什么共同点和区别?

共同点&#xff1a; 都不能被实例化。都可以包含抽象方法。都可以有默认实现的方法&#xff08;Java 8 可以用 default 关键字在接口中定义默认方法&#xff09;。 区别&#xff1a; 接口主要用于对类的行为进行约束&#xff0c;你实现了某个接口就具有了对应的行为。抽象类…