How iOS 16 Dynamic Scoreboards Update Live Games

Apple’s iOS 16 introduced Live Activities and the Dynamic Island, enabling sports applications to stream real-time game updates directly to the Lock Screen. This article breaks down the technical architecture behind these dynamic scoreboards, detailing how Apple’s ActivityKit framework and Apple Push Notification service (APNs) work together to deliver low-latency score changes, clock updates, and play-by-play data without draining device battery.

The Role of ActivityKit

At the core of dynamic scoreboards is ActivityKit, an iOS framework designed to manage the lifecycle of Live Activities. Unlike standard iOS widgets that refresh periodically on a timeline, ActivityKit creates a persistent, glanceable interface using WidgetKit and SwiftUI.

When a user initiates tracking for a live game, the app defines two data models:

  • ActivityAttributes (Static Data): Fixed information that does not change throughout the contest, such as team names, logos, and the sport type.
  • ContentState (Dynamic Data): Transient data that changes frequently, such as the current score, game clock, quarter or period, and possession indicators.

Remote Updates via APNs

Live sports require sub-second or near-instant updates, which cannot rely on periodic background app refreshes. Instead, iOS 16 enables remote updates through the Apple Push Notification service (APNs).

  1. Token Generation: When a Live Activity starts, iOS generates a unique push token specific to that active session. The app transmits this token to its backend sports server.
  2. Payload Delivery: When a play concludes or a score changes, the server sends an APNs push notification directly targeted at that Live Activity token.
  3. Payload Structure: The push payload includes an updated JSON representation of the ContentState along with a timestamp. Crucially, the payload is tiny (capped at 4 KB), containing only the delta needed to update the scoreboard.
  4. Immediate Render: Upon receiving the push token payload, the iOS operating system wakes the Live Activity UI and re-renders the SwiftUI views without needing to launch the parent app in the background.

Managing the Live Clock

Pushing a notification every second to update a game clock is inefficient and exceeds APNs rate limits. To solve this, developers do not stream clock ticks. Instead, the backend sends a target timestamp and a timer state (e.g., remaining time: 10:00, counting down). ActivityKit uses native SwiftUI text timers (such as Text(timerInterval:pauseTime:)) that automatically count down on the device's local clock. Push notifications are only required when the game clock stops, resumes, or is manually adjusted by referees.

Displaying on the Dynamic Island

On supported devices, such as the iPhone 14 Pro models running iOS 16.1 and later, ActivityKit automatically bridges scoreboard updates to the Dynamic Island. The framework requires developers to provide multiple layout configurations:

  • Compact: Displays the score and team icons split across the leading and trailing edges of the camera cutout.
  • Minimal: Used when multiple activities are running, collapsing the game to a single icon or score.
  • Expanded: Triggered when a user long-presses the Dynamic Island, revealing a detailed view with statistics, field position graphics, and recent plays.

Each time a new APNs payload arrives, iOS animates transitions smoothly between states, ensuring the user sees up-to-date information regardless of which screen or app they are currently viewing.

Session Lifecycle and Termination

Live Activities are designed to be temporary. A dynamic scoreboard can remain active on the Lock Screen for up to eight hours unless terminated earlier by the app. When the final buzzer sounds, the server issues an end event via APNs, prompting the Live Activity to enter a finished state. The final score remains on the Lock Screen for up to four additional hours before iOS automatically dismisses it.