一、基本概述
名词基础知识
苹果在 iPhone 14 Pro 系列中增加一个灵动岛,主要目的是隐藏挖孔造型的高端“感叹号屏”。 通过动画的视觉差异,用户找不到原来的挖孔屏。灵动岛是一种巧妙的设计,模糊了软件和硬件之间的界限,它可以在锁屏的情况下根据不同的应用程序操作和提示、通知和活动内容的需求,自动改变大小和形状,展示用户关注的事情。
开发基础知识
1、设备只支持iPhone,并且是有“药丸屏”的iPhone14Pro和14Pro Max上;
2、Max系统版本、编译器及iOS系统版本:>=MacOS12.4、>=Xcode14.0+beta4、>=iOS16.1+beta;
3、使用
ActivityKit
用于配置、开始、更新、结束实现Live Activity
能力。使用WidgetKit
、SwiftUI
在widget
小组件中创建Live Activity
的用户界面,这样小组件和Live Activity
的代码是可以共享;4、
Live Activity
目前只能通过ActivityKit
从主工程获取数据,或者从 远程通知 获取最新数据;无法访问网络或者接受位置更新信息5、
ActivityKit
和 远程通知推送 更新的数据不能超过4KB;6、
Live Activity
可以给不同的控制绑定不同的 deeplink,使其跳转到不同的页面;7、
Live Activity
在用户主动结束前最多存活8小时;8、已经结束的
Live Activity
在锁屏也最多保留4小时,所以一个Live Activity
最长可以停留12小时;9、最多同时存在两组
Live Activity
,排列顺序待发现
二、项目构思
这里以电商常用的抢购商品作为实践,包含的交互方式主要有如下特征:
1、主工程商品能展示基本信息,包含图片、名称、价格、开抢时间、预约按钮等;
2、主工程记录商品预约状态及灵动岛的任务状态,避免重复预约;
3、开启预约后,在打开App的情况下,灵动岛看到该商品的基本信息,支持立即抢购;
包含了开发灵动岛的基础知识:
1、主工程数据通过 ActivityKit
来启动、更新、停止灵动岛 Widget;
2、灵动岛 Widget 的基本布局方式及开发注意事项;
3、灵动岛 Widget 点击跳转到主工程的事件通讯;
三、代码实践
1、创建主工程及灵动岛Widget工程
在主工程的 info.plist
文件中添加 Supports Live Activities
并且设置为 YES
2、熟悉 ActivityKit
常用对象及API,创建基本视图
数据部分(主工程):继承 ActivityAttributes
,定义常用的数据来控制或改变UI及状态。这里包含的商品的基本信息,可以认为是不变的状态,可变的状态需要在 ContentState
中声明。
// SeckillProduct.swift
import Foundation
import ActivityKit
struct SeckillProductAttributes: ActivityAttributes {
typealias SeckillProductState = ContentState
public struct ContentState: Codable, Hashable {
// 可变的属性需要放在这里,activity调用update进行数据的更新
var isSeckill: Bool
}
// 一个灵动岛任务的初始化数据,描述一些不可变数据
let productId: String
let name: String
let price: String
let image: String
let countDown: Double
let isSeckill: Bool
init(productId: String, name: String, price: String, image: String, countDown: Double, isSeckill: Bool = false) {
self.productId = productId
self.name = name
self.price = price
self.image = image