Dynamic Island là một khu vực tương tác ở phần trên của iPhone 14 Pro và tất cả iPhone 15/16, kết hợp thông báo, hoạt động nền và chỉ báo hệ thống trong một vùng động duy nhất. Không giống như notch truyền thống, Dynamic Island thay đổi hình dạng và kích thước tùy theo ngữ cảnh hiện tại. Theo Apple (WWDC 2024), người dùng tương tác với Dynamic Island trung bình 12 lần mỗi ngày — qua chạm, nhấn giữ và Live Activities với ActivityKit. Tìm hiểu thêm về hoạt ảnh trong iOS trong bài viết về Corner Radius.
Những điểm chính
Dynamic Island là một khu vực tương tác dựa trên giải pháp phần mềm-phần cứng của Apple, được giới thiệu vào tháng 9 năm 2022 cùng với iPhone 14 Pro. Về mặt vật lý, đó là một phần cắt hình viên thuốc được bao quanh bởi các pixel OLED thay đổi màu sắc và hình dạng một cách động. Apple sử dụng kết hợp phần cứng cắt cho camera và Face ID với kết xuất phần mềm các vùng đen xung quanh, tạo ra ảo giác về một «hòn đảo sống».
Mục tiêu chính của Dynamic Island là thu hẹp khoảng cách giữa thông báo hệ thống và nội dung đang hoạt động. Thay vì thông báo xuất hiện ở giữa màn hình (như trên Android) hoặc dưới dạng biểu ngữ từ trên xuống (như trên iOS cũ hơn), Dynamic Island tích hợp chúng trực tiếp vào vùng phần cứng. Điều này giảm sự xao nhãng và tạo cảm giác không gian thống nhất.
Theo dữ liệu của Apple (Thống kê áp dụng iOS 17, 2024), Dynamic Island có sẵn trên 38% iPhone đang hoạt động. Bắt đầu từ iPhone 15 (2023), tất cả các model trong dòng sản phẩm đều có Dynamic Island, bao gồm cả các model cơ bản. Trong iOS 18, Apple đã mở rộng API Live Activities, thêm hỗ trợ cho bộ đếm ngược và điểm thể thao trực tiếp trên Dynamic Island.
Dynamic Island có sẵn trên iPhone 14 Pro, iPhone 14 Pro Max, iPhone 15, iPhone 15 Plus, iPhone 15 Pro, iPhone 15 Pro Max, iPhone 16, iPhone 16 Plus, iPhone 16 Pro, iPhone 16 Pro Max. Dynamic Island không có trên iPad. Phát triển cho Dynamic Island yêu cầu Xcode 14.1+ và iOS 16.1+.
Dynamic Island hỗ trợ ba trạng thái hiển thị: gọn, tối thiểu và mở rộng. Chuyển đổi giữa các trạng thái được tạo hoạt ảnh bằng UIKit Animation và Core Animation. Hệ thống tự quản lý mức độ ưu tiên hoạt động: nếu nhiều ứng dụng cố gắng hiển thị nội dung cùng lúc, iOS sử dụng hàng đợi dựa trên thời gian bắt đầu của hoạt động cuối cùng.
| Trạng thái | Kích thước | Nội dung | Ví dụ |
|---|---|---|---|
| Gọn | 49×18 pt | Biểu tượng ứng dụng + biểu tượng hệ thống | Đếm giờ, nhạc, cuộc gọi |
| Tối thiểu | Lên đến 66×18 pt | Biểu tượng + văn bản ngắn | Chỉ đường, số bước |
| Mở rộng | Lên đến 364×160 pt | Widget đầy đủ với nội dung | Điểm thể thao, trạng thái taxi |
Trạng thái gọn là chế độ xem tiêu chuẩn của Dynamic Island khi có một tác vụ nền đang hoạt động. Nó xuất hiện dưới dạng viên tròn với biểu tượng ứng dụng bên trái và biểu tượng hệ thống bên phải. Theo mặc định, tất cả Live Activities đều bắt đầu ở trạng thái gọn.
Trạng thái tối thiểu xảy ra khi có hai hoặc nhiều tác vụ hoạt động đồng thời. Dynamic Island «chia» thành hai phần tử riêng biệt ở bên trái và bên phải camera. Trạng thái tối thiểu cho phép hiển thị hai nguồn thông tin độc lập, như thời gian đến của taxi và bản nhạc hiện tại.
Trạng thái mở rộng được kích hoạt bằng cách nhấn giữ trên Dynamic Island. Ở chế độ này, một widget đầy đủ với nội dung có thể tùy chỉnh được hiển thị: tiêu đề, mô tả, thanh tiến trình, nút bấm. Trạng thái mở rộng hỗ trợ cuộn và các phần tử tương tác.
ActivityKit là một framework Swift được giới thiệu trong iOS 16.1, cho phép các ứng dụng xuất bản Live Activities lên Dynamic Island và Màn hình khóa. ActivityKit sử dụng kiến trúc dựa trên ActivityView và ActivityAttributes: cái đầu tiên xác định loại nội dung, cái thứ hai xác định dữ liệu có thể thay đổi. Framework hoạt động kết hợp với WidgetKit, nhưng không giống như widget, Live Activities có thể cập nhật theo thời gian thực mà không cần mở ứng dụng.
import ActivityKit
import SwiftUI
// Xác định thuộc tính hoạt động
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var driverName: String
var distanceToArrival: Double
var estimatedMinutes: Int
}
var orderNumber: String
}
// Bắt đầu Live Activity
func startDeliveryActivity() {
let initialState = DeliveryAttributes.ContentState(
driverName: "Alexei",
distanceToArrival: 3.5,
estimatedMinutes: 12
)
let attributes = DeliveryAttributes(orderNumber: "ORD-2024-8912")
let activity = try? Activity.request(
attributes: attributes,
contentState: initialState,
pushType: .token
)
}
Live Activities được cập nhật qua ActivityView, nơi kết xuất nội dung SwiftUI cho Dynamic Island. Hệ thống tự xác định mẫu nào sẽ sử dụng (gọn, tối thiểu hoặc mở rộng) tùy theo kích thước của Dynamic Island và số lượng hoạt động. Để cập nhật nội dung, hãy gọi activity.update(using: contentState). Để kết thúc — activity.end(dismissalPolicy: .immediate).
ActivityKit hỗ trợ cập nhật push qua APNs (Apple Push Notification Service). Khi bắt đầu Live Activity, bạn có thể yêu cầu pushToken và gửi cập nhật từ máy chủ mà không cần khởi chạy ứng dụng trên thiết bị. Cập nhật push hoạt động qua activity.pushToken và Activity.pushToStartToken để khởi động Live Activity từ xa.
// Cập nhật Live Activity qua Push
func updateActivity(activity: Activity<DeliveryAttributes>) {
let updatedState = DeliveryAttributes.ContentState(
driverName: "Alexei",
distanceToArrival: 1.2,
estimatedMinutes: 4
)
let alertConfiguration = AlertConfiguration(
title: "Người giao hàng ở gần",
body: "Alexei sẽ đến trong 4 phút nữa",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration là một tham số tùy chọn hiển thị thông báo trên Dynamic Island cho các cập nhật quan trọng (ví dụ: «Người giao hàng đã đến»). Không có AlertConfiguration, nội dung được cập nhật trong nền, phù hợp cho thanh tiến trình và bộ đếm giờ.
Notch là phần cắt cứng của iPhone X–13 chứa camera trước, cảm biến Face ID và loa. Notch là tĩnh: kích thước và hình dạng của nó không thay đổi, và thông báo được hiển thị bên dưới dưới dạng biểu ngữ tiêu chuẩn. Dynamic Island, ngược lại, sử dụng các pixel xung quanh phần cắt để hiển thị nội dung, biến phần tử phần cứng thành một phần của giao diện.
| Tiêu chí | Dynamic Island | Notch |
|---|---|---|
| Tương tác | Hỗ trợ chạm, nhấn giữ, vuốt | Không tương tác |
| Thích ứng nội dung | Thay đổi hình dạng theo ngữ cảnh | Tĩnh, nội dung dưới notch |
| Live Activities | Hỗ trợ tích hợp qua ActivityKit | Không — chỉ thông báo thường |
| Đa nhiệm | Hai hoạt động đồng thời (trái và phải) | Chỉ một hoạt động |
| Khả dụng | iOS 16.1+, iPhone 14 Pro trở lên | iOS 11+, iPhone X–13 |
Theo Nguyên tắc Giao diện Người dùng Apple (2025), Dynamic Island không nên được sử dụng cho quảng cáo hoặc hiển thị nội dung tĩnh vĩnh viễn. Live Activities chỉ dành cho các tác vụ nền có vòng đời rõ ràng: bộ đếm giờ, giao hàng, thể thao, nhạc, điều hướng. Vi phạm các quy tắc này dẫn đến việc ứng dụng bị từ chối trong quá trình xét duyệt App Store.
Dynamic Island có vòng đời nghiêm ngặt: một hoạt động bắt đầu bằng yêu cầu qua Activity.request(), trải qua các trạng thái hoạt động/tạm dừng/đã cập nhật và kết thúc bằng lệnh gọi activity.end(). Hệ thống có thể buộc kết thúc hoạt động khi thiếu bộ nhớ (ví dụ: khi khởi động camera). Trong trường hợp này, ứng dụng nhận được thông báo qua ActivityActivityState.finished.
Cử chỉ trên Dynamic Island được xử lý bởi nội dung SwiftUI bên trong ActivityView. Cử chỉ tiêu chuẩn: chạm vào trạng thái gọn mở ứng dụng, nhấn giữ mở rộng trạng thái mở rộng, vuốt xuống đóng trạng thái mở rộng. Cử chỉ tùy chỉnh được thêm qua các bổ ngữ SwiftUI (onTapGesture, onLongPressGesture) bên trong view hoạt động.
Khi hệ thống kết thúc Live Activity (hoặc người dùng vuốt để xóa), ứng dụng cần xử lý trạng thái finished để giải phóng tài nguyên. Nên đăng ký Activity.activityStateUpdates và xóa các tham chiếu cục bộ đến hoạt động sau khi hoàn thành.
import ActivityKit
func observeActivityState(activity: Activity<DeliveryAttributes>) {
Task {
for await state in activity.activityStateUpdates {
switch state {
case .active:
print("Hoạt động đang hoạt động trên Dynamic Island")
case .dismissed:
print("Hoạt động bị người dùng ẩn")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("Hoạt động bị hệ thống kết thúc")
cleanupResources()
@unknown default:
break
}
}
}
}
Khuyến nghị của Apple (WWDC 2024, Phiên 10146): không sử dụng Dynamic Island để hiển thị trạng thái không cần sự chú ý của người dùng. Mỗi Live Activity phải có trình kích hoạt bắt đầu và kết thúc rõ ràng. Đối với cập nhật nền không có giao diện người dùng, hãy sử dụng Background Tasks thay vì Live Activities.
Câu hỏi thường gặp
Dynamic Island có sẵn trên iPhone 14 Pro, 14 Pro Max và tất cả các model iPhone 15 và iPhone 16 (bao gồm các phiên bản cơ bản). Phát triển yêu cầu iOS 16.1+ và Xcode 14.1. Trên các model cũ hơn (iPhone X–13), sử dụng notch tĩnh không hỗ trợ Live Activities.
Dynamic Island tích hợp thông báo vào vùng phần cứng của màn hình mà không che nội dung. Thông báo thường xuất hiện dưới dạng biểu ngữ từ trên xuống và biến mất sau vài giây. Live Activities trên Dynamic Island có thể duy trì hoạt động hàng giờ và cập nhật theo thời gian thực (trạng thái giao hàng, bộ đếm giờ, nhạc).
Sử dụng cập nhật push qua APNs. Khi bắt đầu Live Activity, hãy gọi activity.pushToken và gửi token đến máy chủ của bạn. Máy chủ gửi yêu cầu cập nhật qua APNs với ContentState mới. Thay thế là cập nhật cục bộ qua activity.update(using:) từ trong ứng dụng.
iOS tự động chia Dynamic Island thành hai phân đoạn khi có hai Live Activities đang hoạt động. Mỗi hoạt động được hiển thị ở trạng thái tối thiểu bên trái và bên phải camera. Nhấn giữ một trong các phân đoạn sẽ mở trạng thái mở rộng chỉ cho ứng dụng đó.
Kiểm tra: (1) ứng dụng có NSSupportsLiveActivities = YES trong Info.plist, (2) ActivityAttributes và ContentState triển khai Codable và Hashable, (3) phiên bản iOS là 16.1+, (4) thiết bị hỗ trợ Dynamic Island. Đối với trình mô phỏng, hãy sử dụng iPhone 14 Pro trở lên trong Xcode.
Tóm tắt
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.
Đọc thêm