Prácticas recomendadas para actividades en directo de iOS
Configuración de Live Activity
LiveActivity es una función introducida en iOS 16.1. Con el framework ActivityKit, se pueden iniciar actividades en directo para ver actualizaciones en tiempo real de la aplicación en Dynamic Island y en la pantalla de bloqueo. Por ejemplo, una aplicación de deportes permite a los usuarios iniciar una actividad en directo y ver las actualizaciones de un vistazo durante un partido (para obtener más información, consultar la guía de funciones de la versión de iOS).
- Utilizar el framework ActivityKit en el proyecto principal para iniciar, actualizar y finalizar actividades en directo. Utilizar SwiftUI y WidgetKit en la extensión de widget para crear la interfaz de Live Activity.
- Las actividades en directo se pueden iniciar, actualizar y finalizar no solo con ActivityKit, sino también mediante notificaciones push remotas.
- La función de actualización mediante notificaciones push remotas para LiveActivity no admite certificados p12; es necesario configurar certificados p8.
Además, se debe tener en cuenta que Apple limita el número de notificaciones push de LiveActivity enviadas por hora. Si se necesita actualizar con frecuencia las notificaciones push de LiveActivity, es necesario añadir la entrada NSSupportsLiveActivitiesFrequentUpdates en el archivo info.plist y establecer su valor booleano en YES (para obtener más información, consultar iOS LiveActivity).
Añadir la funcionalidad de Live Activity al proyecto
Configuración
1. Configurar Info.plist
Añadir un par clave-valor en el archivo Info.plist del proyecto principal, donde la clave sea NSSupportsLiveActivities y el valor sea YES;

2. Añadir una extensión de widget
2.1 Crear un nuevo target
Acceder a File > New > Target.
2.2 Seleccionar Widget Extension

2.3 Configurar la extensión de widget
Marcar la casilla "Include Live Activity"

Hacer clic en Finish
Xcode creará una Live Activity.
LiveActivityWidgetAttributes define los atributos de la actividad en directo, incluidos tanto los atributos mutables como los inmutables.
La estructura LiveActivityWidgetLiveActivity personaliza la apariencia de la actividad en directo.

A continuación, en LiveActivityWidgetBundle, habilita la visualización de la actividad en directo.

3. Pruebas
Iniciar una actividad en directo en el proyecto principal, escuchar los cambios de su push token y comunicar el push token a EngageLab. Una vez comunicado correctamente, se puede utilizar el servicio de EngageLab para enviar mensajes a la LiveActivity en el móvil.
func startLiveActivity1() {
let initialContentState = MTLAAttributes.ContentState(eventStr: "begin", eventTime: 1)
let activityAttributes = MTLAAttributes(name: "LiveActivity", number: 33, tag: "")
do {
// Create Activity
let activity = try Activity.request(attributes: activityAttributes, contentState: initialContentState, pushType: PushType.token)
// Listen for pushToken changes
Task {
for await pushtoken in activity.pushTokenUpdates {
let pushtokenstr = pushtoken.map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
// Register liveactivity with EngageLab to update notifications via liveactivityId on the push platform
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).")
}
}
- A partir de iOS 17.2, Apple permite utilizar una notificación push para iniciar una actividad en directo, lo que depende de un pushToStartToken. Utilizar la función pushToStartTokenUpdates para escuchar los cambios del pushToStartToken de la actividad en directo y comunicarlo a EngageLab.
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
}
}
}
