iOS实时活动最佳实践
实时活动设置
LiveActivity 是 iOS 16.1 推出的功能。 借助 ActivityKit 框架,您可以启动实时活动以在灵动岛和锁定屏幕上看到来自您的应用程序的实时更新内容。例如,体育应用程序允许用户启动实时活动,在比赛期间通过实时活动可以一目了然地看到信息的更新(详情参考 iOS 版本特性指南 )。
- 在主工程中使用 ActivityKit 框架 来 开启、更新、结束 实时活动。在 widget extension 中 使用 SwiftUI 和 WidgetKit 来 创建 Live Activity 的界面。
- 开启、更新、结束 实时活动 不仅可以使用 ActivityKit 实现。也可以使用远程推送来实现。
- LiveActivity远程推送更新功能,不支持p12证书。需要用户配置p8证书。
此外,还需要注意:苹果对每小时发送的 LiveActivity 推送通知会有数量上的限制。若您有频繁更新 LiveActivity 推送通知的需求,需要在 info.plist 文件里面添加 NSSupportsLiveActivitiesFrequentUpdates 条目,并将其布尔值设置为 YES(更多信息请参考 iOS LiveActivity )。
为您的项目添加实时活动功能
设置
1. 设置 Info.plist
在主工程的 Info.plist 文件中添加一个键值对,key 为 NSSupportsLiveActivities,value 为 YES;
2. 添加一个 Widget Extension
2.1 新建一个 Target
Go to File > New > Target.
2.2 选择 Widget Extension
2.3 设置 Widget Extension
请勾选 inclue Live Activity
点击Finish
这时XCode已经帮我们创建了一个LiveActivity。
LiveActivityWidgetAttributes 为属性,里面可以定义实时活动的可改变的和不可改变的属性值。
结构体 LiveActivityWidgetLiveActivity 里 对 实时活动的样式进行了自定义。
然后在LiveActivityWidgetBundle 里面允许 该实时活动 展现。
3. 测试
在主工程中启动 一个 liveActivity。并监听它的pushtoken的变化,并将pushtoken上报到Engagelab。上报成功后你就可以使用Engagelab的服务给手机上的LiveActivity推送消息了。
func startLiveActivity1() {
let initialContentState = MTLAAttributes.ContentState(eventStr: "begin", eventTime: 1)
let activityAttributes = MTLAAttributes(name: "LiveActivity", number: 33, tag: "")
do {
// 创建Activity
let activity = try Activity.request(attributes: activityAttributes, contentState: initialContentState, pushType:PushType.token)
// 监听pushToken变化
Task {
for await pushtoken in activity.pushTokenUpdates {
let pushtokenstr = pushtoken.map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
// 向Engagelab注册liveactivity,在推送平台通过liveactivityId推送通知进行更新
MTPushService.registerLiveActivity("my_define_liveactivity_id", pushToken: pushtoken, completion: { code, liveactivityId, token, seq in
print("result:\(code)")
}, seq: 1)
}
}
} catch {
print("Error requesting Live Activity \(error.localizedDescription).")
}
}
- 从iOS17.2开始,苹果允许使用推送启动一个liveactivity,这个操作依赖于pushToStartToken。 监听pushToStartTokenUpdates:函数获取liveactivity的pushToStartToken的变化,并将其上报到Engagalab。
func pushToStart() {
Task {
if #available(iOS 17.2, *) {
var beforeToken = "";
for await pushtoken in Activity<MTLAAttributes>.pushToStartTokenUpdates {
let pushtokenstr = pushtoken.map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
print("pushToStartToken: MTLAAttributes -> \(pushtokenstr)")
if (beforeToken == pushtokenstr) {
return
}
beforeToken = pushtokenstr
MTPushService.registerLiveActivity("MTLAAttributes", pushToStartToken: pushtoken, completion: { code, alias, token, seq in
print("register MTLAAttributes pushToStartToken result: \(pushtokenstr) result:\(code) seq:\(seq)")
}, seq: seq())
}
} else {
// Fallback on earlier versions
}
}