Live Activity — widget trên màn hình khóa là gì

Tác giả: IT Sectr Đã đăng: 2026-02-15 Thời gian đọc: 9 phút

Live Activity là widget động trên màn hình khóa iPhone và Dynamic Island, hiển thị thông tin thời gian thực: trạng thái giao hàng, điểm số thể thao, bộ đếm thời gian và phát nhạc. Nó được triển khai qua ActivityKit (Swift, iOS 16.1+) kết hợp với WidgetKit. Live Activity cập nhật cục bộ hoặc qua thông báo push, hỗ trợ nhiều trạng thái và bị hệ thống kết thúc sau khi sự kiện kết thúc. Tìm hiểu thêm tại ActivityKit Documentation.

Những điểm chính

  • Live Activity — widget thời gian thực trên màn hình khóa và Dynamic Island
  • ActivityKit — framework để khởi động và quản lý Live Activities trong iOS 16.1+
  • Cập nhật push — máy chủ gửi trạng thái mới qua thông báo push ActivityKit
  • Trạng thái — mỗi Activity hỗ trợ trạng thái hoạt động và đã kết thúc với UI khác nhau
  • Dynamic Island — hiển thị nhỏ gọn Live Activity trên iPhone 14 Pro trở lên

Live Activity là gì — Widget trên màn hình khóa?

Live Activity là phần mở rộng của WidgetKit hiển thị nội dung động trên màn hình khóa iPhone và Dynamic Island. Không giống như widget tĩnh cập nhật theo bộ đếm thời gian hệ thống, Live Activity được khởi động bởi ứng dụng và tồn tại trong thời gian giới hạn — lên đến 8 giờ cho Activity đang hoạt động và lên đến 4 giờ sau khi kết thúc. Người dùng thấy dữ liệu cập nhật mà không cần mở khóa thiết bị: trạng thái đơn hàng giao hàng, khoảng cách đến điểm đến trong taxi, kết quả trận đấu hoặc tiến độ tập luyện.

ActivityKit là framework làm việc với Live Activities, được giới thiệu trong iOS 16.1. Nó cung cấp API để yêu cầu, cập nhật và kết thúc Activities. Activity là một đối tượng có nội dung và trạng thái. Nội dung (ActivityContent) xác định dữ liệu tĩnh, trong khi trạng thái (ActivityState) xác định dữ liệu động thay đổi theo thời gian. Hệ thống tự quyết định khi nào hiển thị trạng thái mới — điều này tiết kiệm pin và đảm bảo hoạt ảnh mượt mà.

Mỗi Live Activity được xác định duy nhất bằng ActivityID và gắn với một tiến trình — ứng dụng đã tạo ra nó. Hệ thống có thể kết thúc Activity khi bộ nhớ thấp hoặc pin yếu. Nhà phát triển nhận được thông báo kết thúc bắt buộc qua delegate ActivityKit và có thể lưu trạng thái cuối cùng để khôi phục.

Kiến trúc ActivityKit và WidgetKit

Kiến trúc Live Activity được xây dựng trên hai framework: WidgetKit chịu trách nhiệm hiển thị view SwiftUI, ActivityKit quản lý vòng đời Activity. Nhà phát triển tạo WidgetBundle hỗ trợ LiveActivityConfiguration. Mỗi cấu hình xác định loại dữ liệu (Attributes và State) và view SwiftUI mà hệ thống hiển thị trên màn hình khóa và Dynamic Island. Dữ liệu được truyền qua ActivityAttributes — một struct với trường let cho nội dung và trường var cho trạng thái.

Thành phầnMục đíchAPI
AttributesDữ liệu tĩnh của toàn bộ Activitylet name: String, let icon: String
ContentStateTrạng thái động, có thể thay đổi khi cập nhậtvar progress: Double, var status: Status
ActivityĐối tượng yêu cầu và quản lý ActivityActivity.request(attributes:content:)
PushTokenToken cho cập nhật push từ máy chủactivity.pushToken publisher
ActivityUIView SwiftUI cho màn hình khóa và Dynamic IslandLockScreenView, ExpandedView, CompactView

Vòng đời Activity bao gồm ba giai đoạn: hoạt động (hệ thống hiển thị và cập nhật), kết thúc (Activity đã kết thúc nhưng UI vẫn hiển thị 4 giờ), đã xóa (hệ thống xóa UI). Ứng dụng có thể kết thúc Activity bất cứ lúc nào. Hệ thống cũng kết thúc Activities bắt buộc — ví dụ, khi khởi động lại thiết bị hoặc hết giới hạn 8 giờ.

swift
import ActivityKit

struct DeliveryAttributes: ActivityAttributes {
    public struct ContentState: Codable & Hashable {
        var status: DeliveryStatus
        var estimatedMinutes: Int
    }
    var orderNumber: String
    var restaurantName: String
}

WidgetBundle đăng ký Live Activity qua macro @main: widget trả về danh sách cấu hình bao gồm LiveActivityConfiguration. Dựa trên cấu hình này, hệ thống biết loại dữ liệu nào cần mong đợi và cách hiển thị UI ở các trạng thái khác nhau — nhỏ gọn, tối thiểu và mở rộng cho Dynamic Island.

Tạo Live Activity với WidgetKit và SwiftUI

Tạo Activity bắt đầu bằng yêu cầu gửi đến ActivityKit. Ứng dụng gọi Activity.request(attributes:content:pushType:) với dữ liệu ban đầu. Hệ thống kiểm tra xem Dynamic Island có khả dụng trên thiết bị không và trả về đối tượng Activity. Yêu cầu có thể thất bại nếu vượt quá giới hạn Activity đang hoạt động — thường không quá 5 cùng lúc. Sau yêu cầu thành công, hệ thống hiển thị widget trên màn hình khóa và nếu có, trong Dynamic Island.

swift
let attributes = DeliveryAttributes(
    orderNumber: "A-1234",
    restaurantName: "Pizza House"
)

let initialState = DeliveryAttributes.ContentState(
    status: DeliveryStatus.preparing,
    estimatedMinutes: 30
)

do {
    let activity = try await Activity<DeliveryAttributes>.request(
        attributes: attributes,
        content: ActivityContent(state: initialState, staleDate: nil),
        pushType: .token
    )
    print("Activity started: \(activity.id)")
} catch {
    print("Failed: \(error)")
}

View SwiftUI cho Live Activity sử dụng các cấu trúc LockScreenView, ExpandedView và CompactView từ WidgetKit. View nhận ngữ cảnh (ActivityViewContext) với các thuộc tính và trạng thái hiện tại. View tự động cập nhật khi có trạng thái mới từ hệ thống. Live Activity chỉ hỗ trợ một tập hợp hạn chế các thành phần SwiftUI — Text, Image, HStack, VStack và một số bộ điều chỉnh.

Mỗi view Live Activity phải nhẹ và nhanh — hệ thống từ chối hiển thị các view nặng. Giới hạn thời gian hiển thị là 30 ms mỗi khung hình. Hoạt ảnh bị giới hạn trong các chuyển đổi hệ thống giữa các trạng thái — hoạt ảnh tùy chỉnh không khả dụng trong Live Activity. Việc hiển thị được thực hiện trong tiến trình nền của WidgetKit với ưu tiên phản hồi màn hình khóa.

Cập nhật Live Activity cục bộ và qua push

Cập nhật cục bộ — ứng dụng cập nhật trạng thái Activity bằng cách gọi activity.update(using:). Phương thức này chấp nhận ContentState mới và AlertConfiguration tùy chọn để hiển thị thông báo khi cập nhật. Cập nhật cục bộ nhanh — hệ thống vẽ lại view trong chu kỳ hiển thị tiếp theo, thường trong vòng 1–2 giây. Đối với cập nhật thường xuyên (bộ đếm thời gian, đồng hồ bấm giờ) hãy sử dụng chế độ cục bộ — nó đáng tin cậy và nhanh hơn push.

swift
let updatedState = DeliveryAttributes.ContentState(
    status: DeliveryStatus.outForDelivery,
    estimatedMinutes: 10
)

await activity.update(
    ActivityContent<DeliveryAttributes.ContentState>(
        state: updatedState,
        staleDate: Date().addingTimeInterval(60)
    ),
    alertConfiguration: AlertConfiguration(
        title: "Order out for delivery",
        body: "Arriving in 10 min"
    )
)

Cập nhật push — máy chủ gửi thông báo push ActivityKit với trạng thái mới ở định dạng JSON. Để làm điều này, ứng dụng nhận pushToken từ publisher activity.pushToken và chuyển nó đến máy chủ. Máy chủ gửi yêu cầu POST đến APNs với payload chứa ContentState mới. Hệ thống nhận push, giải mã trạng thái và cập nhật Live Activity mà không cần ứng dụng tham gia — điều này cho phép cập nhật Activity ngay cả khi ứng dụng đã đóng.

Cập nhật push hiệu quả hơn cập nhật cục bộ cho các cập nhật không thường xuyên (trạng thái giao hàng mỗi 5–10 phút) — ứng dụng không cần duy trì kết nối mạng. Đối với cập nhật thường xuyên mỗi 1–2 giây, hãy sử dụng phương thức cục bộ. Payload máy chủ chỉ bao gồm các trường có thể thay đổi của ContentState — dữ liệu Attributes tĩnh chỉ được gửi khi tạo Activity.

Hiển thị Live Activity trong Dynamic Island

Dynamic Island là vùng phần cứng-phần mềm trên iPhone 14 Pro, 15 Pro trở lên thích ứng với nội dung Live Activity. Hệ thống tự động hiển thị Activity ở ba chế độ: nhỏ gọn (biểu tượng + văn bản ngắn bên trái vùng cắt), tối thiểu (chỉ biểu tượng) và mở rộng (hình chữ nhật 300pt có thông tin). Nhà phát triển không điều khiển trực tiếp các chế độ này — hệ thống chọn chế độ dựa trên mức độ ưu tiên và không gian khả dụng.

swift
struct DeliveryLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: DeliveryAttributes.self) { context in
            LockScreenView(context: context)
        } dynamicIsland: { context in
            DynamicIsland {
                DynamicIslandExpandedContent {
                    ExpandedView(context: context)
                }
            } compactLeading: {
                CompactLeadingView(context: context)
            } compactTrailing: {
                CompactTrailingView(context: context)
            } minimal: {
                MinimalView(context: context)
            }
        }
    }
}

Dynamic Island hỗ trợ tương tác — người dùng chạm vào vùng và vào ứng dụng hoặc mở view mở rộng. Chạm vào chế độ nhỏ gọn sẽ chuyển sang chế độ mở rộng, và vuốt sang trái sẽ thu nhỏ Activity về chế độ tối thiểu. Các nút trong chế độ mở rộng (tạm dừng/hủy) được xử lý qua Link từ SwiftUI — hệ thống khởi động ứng dụng với URL deep link, xử lý được thực hiện trong UIApplicationDelegate.

Giới hạn Dynamic Island: chiều rộng chế độ mở rộng lên đến 300pt, văn bản nhỏ gọn lên đến 30 ký tự. Màu sắc và phông chữ khớp với chủ đề hệ thống — tùy chỉnh bị hạn chế. Hoạt ảnh chuyển tiếp giữa các chế độ do hệ thống xác định và không thể tùy chỉnh. Nếu nhiều ứng dụng có Activity đang hoạt động, Dynamic Island hiển thị chúng theo ưu tiên dựa trên thời gian khởi chạy và loại nội dung.

Câu hỏi thường gặp

Live Activity khác widget thông thường như thế nào?

Widget WidgetKit thông thường hiển thị thông tin tĩnh và cập nhật theo bộ đếm thời gian hệ thống với khoảng thời gian tối thiểu 15–30 phút. Live Activity hiển thị dữ liệu động theo thời gian thực trên màn hình khóa và Dynamic Island. Live Activity được khởi động bởi ứng dụng, tồn tại đến 8 giờ và bị hệ thống kết thúc sau khi sự kiện kết thúc, không giống như widget tồn tại vĩnh viễn.

Live Activity cập nhật bao lâu một lần?

Live Activity hỗ trợ hai chế độ cập nhật: cục bộ — ứng dụng cập nhật trạng thái qua API ActivityKit bất kỳ lúc nào, và cập nhật push — máy chủ gửi thông báo push ActivityKit mà hệ thống chuyển đổi thành trạng thái widget mới. Khi pin yếu, hệ thống có thể đóng băng Live Activity cho đến khi kết nối sạc.

Live Activities hoạt động trên những thiết bị nào?

Live Activities khả dụng trên iPhone với iOS 16.1 trở lên. Trên iPhone 14 Pro trở lên, Live Activity cũng hiển thị trong Dynamic Island. Trên iPad, Live Activity chỉ được hỗ trợ trên màn hình khóa — Dynamic Island không có trên iPad. Apple Watch không hỗ trợ trực tiếp Live Activities nhưng có thể hiển thị thông báo kết thúc.

Có bao nhiêu Live Activities có thể chạy đồng thời?

Hệ thống giới hạn số lượng Live Activities đang hoạt động — thường không quá 5 cùng lúc cho tất cả ứng dụng. Cố gắng khởi động vượt quá giới hạn sẽ trả về lỗi từ ActivityKit. Mỗi Live Activity có thể có nhiều trạng thái — ví dụ: đang chờ, đang vận chuyển, đã giao cho đơn đồ ăn. Sau khi kết thúc, Activity vẫn ở trong UI thêm 4 giờ nữa.

Có cần quyền người dùng cho Live Activity không?

Có, ứng dụng phải yêu cầu quyền gửi thông báo — Live Activity sử dụng kênh thông báo hệ thống. Người dùng có thể tắt Live Activity cho một ứng dụng cụ thể trong cài đặt. Khi khởi chạy lần đầu, ActivityKit hiển thị hộp thoại yêu cầu quyền. Nếu không có quyền, yêu cầu Activity sẽ thất bại.

Tổng kết

  • Live Activity — widget động trên màn hình khóa và Dynamic Island với cập nhật thời gian thực
  • ActivityKit — framework iOS 16.1+ quản lý vòng đời Live Activities
  • Attributes and State — dữ liệu tĩnh và trạng thái động của Activity truyền đến view SwiftUI
  • Cập nhật push — máy chủ gửi trạng thái mới qua APNs mà không cần ứng dụng tham gia
  • Dynamic Island — ba chế độ hiển thị: nhỏ gọn, tối thiểu và hình chữ nhật mở rộng
  • Giới hạn — tối đa 5 Activity đang hoạt động, tối đa 8 giờ tồn tại, tối đa 4 giờ sau khi kết thúc
  • AlertConfiguration — thông báo tùy chọn khi cập nhật trạng thái Activity

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm