iOS 16.2新ActivityKit API下如何结束Live Activity?
解决iOS 16.2中ActivityKit新API结束Live Activity的问题
问题背景
iOS 16.2废弃了ActivityKit中启动和结束Live Activity的旧API。已将启动代码更新为新的request(attributes:content:pushType:),但使用旧的end(using:dismissalPolicy:)方法无法结束活动,且收到API废弃提示:end(using:dismissalPolicy:)' was deprecated in iOS 16.2: Use end(content:dismissalPolicy:) instead。
解决方案
1. 正确使用新API启动Live Activity
启动时使用新的request(attributes:content:pushType:)方法,将返回的Activity实例保存到@State变量中,用于后续结束操作。
2. 使用新API结束Live Activity
调用新的end(content:dismissalPolicy:)方法,传入包含最终状态的ActivityContent对象及 dismissal 策略即可完成活动结束。
修改后的完整代码
ContentView.swift
import SwiftUI import ActivityKit struct ContentView: View { @State private var isTrackingTime: Bool = false @State private var startTime: Date? = nil @State private var activity: Activity<TimeTrackingAttributes>? = nil var body: some View { NavigationView { VStack { if let startTime { Text(startTime, style: .relative) } Button { isTrackingTime.toggle() if isTrackingTime { startTime = .now // 新API启动Live Activity let attributes = TimeTrackingAttributes() guard let startTime else { return } let state = TimeTrackingAttributes.ContentState(startTime: startTime) let activityContent = ActivityContent(state: state, staleDate: Calendar.current.date(byAdding: .hour, value: 3, to: Date())!) do { let myActivity = try Activity<TimeTrackingAttributes>.request(attributes: attributes, content: activityContent, pushType: nil) print("Requested MyActivity live activity. ID: \(myActivity.id)") activity = myActivity // 保存Activity实例 } catch let error { print("Error requesting live activity: \(error.localizedDescription)") } } else { // 新API结束Live Activity guard let activity = activity else { return } guard let startTime else { return } let finalState = TimeTrackingAttributes.ContentState(startTime: startTime) let finalContent = ActivityContent(state: finalState, staleDate: Date()) // 结束时设置过期时间为当前时间 Task { await activity.end(content: finalContent, dismissalPolicy: .immediate) self.activity = nil // 清空实例 self.startTime = nil } } } label: { Text(isTrackingTime ? "STOP" : "START") .fontWeight(.light) .foregroundColor(.white) .frame(width: 200, height: 200) .background(Circle().fill(isTrackingTime ? .red : .green)) } .navigationTitle("Basic Time Tracker") } } } }
TimeTrackingAttributes.swift
import Foundation import ActivityKit struct TimeTrackingAttributes: ActivityAttributes { public typealias TimeTrackingStatus = ContentState public struct ContentState: Codable, Hashable { var startTime: Date } }
关键修改说明
- 启动部分:替换旧API为新的
request(attributes:content:pushType:),创建ActivityContent并传入,同时保存返回的Activity实例到activity变量。 - 结束部分:创建包含最终状态的
ActivityContent,调用end(content:dismissalPolicy:)方法,结束后清空activity和startTime变量。
内容的提问来源于stack exchange,提问作者silentfilozofer
相关产品推荐
相关产品推荐

