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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali