iOS 记录live activity 实时活动 灵动岛

875 阅读1分钟

start

let activity: Activity<***Attributes>
if #available(iOS 16.2, *) {
    activity = try Activity<BWAlertAttributes>.request(attributes: attributes, content: .init(state: contentState, staleDate: nil, relevanceScore: 1), pushType: .token)
} else {
    activity = try Activity<BWAlertAttributes>.request(attributes: attributes, contentState: contentState, pushType: .token)
}

需要使用push来更新的时候pushType要传.token。这里即使系统推送开关关闭用服务端推送去更新实时活动也是可以的。

Task {
    for await pushToken in activity.pushTokenUpdates {
        let pushTokenString = pushToken.reduce("") {
            $0 + String(format: "%02x", $1)
        }
        print("预警 push token: \(pushTokenString)")
        
        // 这里会调用两次,把token发给服务端只需要发一次即可,自己处理
        // TODO:// 把token发给服务端
    }
}

update

Task {
    if #available(iOS 16.2, *) {
        await activity.update(.init(state: contentState, staleDate: nil))
    } else {
        await activity.update(using:contentState)
    }
}

end

func endActivities() {
    let activities = Activity<***Attributes>.activities
    for activity in activities {
        Task {
            await activity.end(dismissalPolicy: .immediate)
        }
    }
}

push update

{
    "aps":{
        "timestamp":1704441587,
        "event":"update",
        "content-state":{
            "cityId":"****",
            "cityName":"****"
        }
    }
}

push end

{
    "aps":{
        "timestamp":1704441587,
        "event":"end",
        "content-state":{
            "cityId":"****",
            "cityName":"****"
        },
        "dismissal-date":1704422007 // 这里写一个之前的时间就会把实时活动从屏幕移除,如果没有dismissal-date则不会从屏幕溢出,而是保持在最终状态
    }
}

参考文档

developer.apple.com/documentati…

developer.apple.com/documentati…

developer.apple.com/documentati…

developer.apple.com/documentati…

developer.apple.com/documentati…

developer.apple.com/documentati…

icloud.developer.apple.com/dashboard/n…

developer.apple.com/documentati…