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…