You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:35:22