Dynamic Island là khu vực tương tác ở phía trên của iPhone 14 Pro và các phiên bản mới hơn, kết hợp phần khuyết phần cứng của camera với thông báo phần mềm thành một phần tử giao diện duy nhất. Dynamic Island thay đổi hình dạng và kích thước theo loại nội dung: cuộc gọi, hẹn giờ, nhạc, Live Activity, kết nối AirPods. Các nhà phát triển tương tác qua Dynamic Island API dựa trên ActivityKit và WidgetKit. Tìm hiểu thêm tại Dynamic Island HIG.
Những điểm chính
Dynamic Island là phần tử giao diện của iPhone 14 Pro, 15 Pro và mới hơn, sử dụng khu vực xung quanh camera trước và cảm biến Face ID để hiển thị thông báo và Live Activity. Không giống như notch cũ, vốn là phần tử đen tĩnh, Dynamic Island thay đổi hình dạng và kích thước một cách linh hoạt: mở rộng để hiển thị bộ hẹn giờ, thu nhỏ cho biểu tượng AirPods đã kết nối, biến thành hình chữ nhật cho kết quả thể thao.
Triển khai kỹ thuật của Dynamic Island dựa trên phần khuyết phần cứng hình viên thuốc của màn hình OLED và xử lý pixel phần mềm xung quanh nó. Hệ thống tăng tốc độ làm mới pixel lên 120 Hz trong khu vực Island và sử dụng khử răng cưa để chuyển đổi mượt mà giữa nội dung và vùng đen của camera. Nhà phát triển không lập trình Island trực tiếp — họ tạo nội dung qua ActivityKit và hệ thống tự động đặt nó xung quanh phần khuyết.
Nhận thức của người dùng — Dynamic Island biến điểm yếu phần cứng thành phần tử chức năng. Theo nghiên cứu của Apple, người dùng coi Island như một phần tự nhiên của màn hình chỉ sau vài ngày sử dụng. Hoạt ảnh làm nổi bật và chuyển đổi sự chú ý — ví dụ, thông báo đến dịch chuyển Island và hiển thị nội dung với hiệu ứng mở rộng ở tốc độ 120 khung hình mỗi giây.
Dynamic Island hỗ trợ ba chế độ hiển thị nội dung, hệ thống tự động chọn dựa trên loại và số lượng hoạt động. Nhà phát triển xác định UI cho mỗi chế độ trong WidgetBundle, nhưng không kiểm soát chế độ nào đang hoạt động. Hệ thống cũng có thể hiển thị hai hoạt động cùng lúc: một bên trái phần khuyết, một bên phải.
| Chế độ | Kích thước | Nội dung | Ví dụ |
|---|---|---|---|
| Gọn | ~50pt chiều rộng | Biểu tượng + văn bản ngắn | Hẹn giờ: biểu tượng đồng hồ + 05:00 |
| Tối thiểu | ~22pt hình tròn | Chỉ biểu tượng ứng dụng | Thông báo chụp màn hình |
| Mở rộng | ~300pt x 80pt | SwiftUI View tùy chỉnh | Điểm thể thao với logo |
Chuyển đổi giữa các chế độ được thực hiện với hoạt ảnh hệ thống kéo dài 0,4–0,6 giây với đường cong ease-in-out. Khi một Activity mới xuất hiện, Island mở rộng từ chế độ gọn sang mở rộng. Khi kết thúc, nó thu nhỏ lại. Người dùng có thể buộc thu gọn chế độ mở rộng bằng cách vuốt sang trái — Island chuyển sang chế độ gọn hoặc tối thiểu. Hệ thống cũng thu gọn chế độ mở rộng sau 5 giây không hoạt động nếu không có bản cập nhật nào dự kiến.
Hai hoạt động — nếu hai ứng dụng có Live Activities đang hoạt động, Dynamic Island hiển thị chúng ở cả hai bên của phần khuyết. Bên trái là Activity được bắt đầu đầu tiên, bên phải là Activity thứ hai. Nếu chỉ có một hoạt động, nó chiếm bên trái, bên phải để trống. Nhấn vào bất kỳ bên nào sẽ mở rộng Island và hiển thị nội dung của Activity đó. Hệ thống tự quyết định Activity nào được ưu tiên trong trường hợp xung đột.
Nội dung Dynamic Island được tạo độc quyền qua Live Activity với framework ActivityKit. Nhà phát triển xác định bốn khu vực trong mã: gọn bên trái (compactLeading), gọn bên phải (compactTrailing), tối thiểu (minimal) và mở rộng (expanded). Mỗi khu vực là một SwiftUI View nhận trạng thái hiện tại của Activity qua context. Nếu khu vực không được xác định, Island không hiển thị Activity đó ở chế độ tương ứng.
struct DeliveryIsland: DynamicIsland {
var body: some DynamicIslandContent {
DynamicIslandExpandedContent {
VStack(alignment: .leading) {
Text(context.state.status)
.font(.headline)
ProgressView(
value: context.state.progress
)
Text("ETA: \(context.state.minutes) min")
.font(.caption)
}
} compactLeading: {
Image(systemName: "box.truck")
} compactTrailing: {
Text("\(context.state.minutes) min")
.monospacedDigit()
} minimal: {
Image(systemName: "box.truck")
}
}
}
Giới hạn SwiftUI trong Dynamic Island — các thành phần có sẵn: Text, Image, HStack, VStack, ZStack, Spacer, ProgressView, Button (chỉ qua Link), Gauge. Bị cấm: ScrollView, List, TabView, hoạt ảnh, trình nhận cử chỉ. Bảng màu — chỉ System Colors (label, secondaryLabel, tint). Phông chữ — kích thước hệ thống từ .caption đến .title3. Phông chữ tùy chỉnh và SF Symbols hoạt động chính xác.
Kiểm tra Dynamic Island — Xcode cung cấp trình mô phỏng hỗ trợ Dynamic Island. Chọn iPhone 14 Pro hoặc 15 Pro làm thiết bị mục tiêu. ActivityKit mô phỏng các chế độ Island khác nhau: nút Dynamic Island Mode trong menu Debug của Xcode chuyển đổi giữa gọn, tối thiểu và mở rộng. Để kiểm tra nhiều Activities cùng lúc, hãy sử dụng lược đồ với ActivityID khác nhau hoặc chạy hai phiên bản của ứng dụng.
Sự kiện hệ thống — cuộc gọi, AirPods, Face ID, sạc và các sự kiện khác — được ưu tiên hơn các Live Activities tùy chỉnh. Khi sự kiện hệ thống xảy ra, Island tạm dừng hiển thị nội dung tùy chỉnh và hiển thị nội dung hệ thống. Sau khi sự kiện hệ thống kết thúc, Island quay lại nội dung tùy chỉnh với hoạt ảnh. Nhà phát triển không thể hủy hoặc sửa đổi các sự kiện hệ thống — chúng được quản lý ở cấp hệ điều hành iOS.
| Sự kiện hệ thống | Định dạng hiển thị | Ưu tiên |
|---|---|---|
| Cuộc gọi đến | Thẻ tối thiểu với tên liên hệ | Cao |
| AirPods | Hoạt ảnh + pin | Trung bình |
| Face ID | Biểu tượng ổ khóa | Trung bình |
| Sạc | Biểu tượng tia sét + phần trăm | Thấp |
| AirDrop | Tiến trình truyền | Trung bình |
| Chụp màn hình | Hoạt ảnh màn trập | Thấp |
Cuộc gọi đến — sự kiện hệ thống quan trọng nhất. Dynamic Island hiển thị tên người gọi bên trái phần khuyết và thời gian/trạng thái bên phải. Trong cuộc gọi đang hoạt động, Island không hiển thị bất kỳ Live Activities tùy chỉnh nào. Người dùng có thể mở rộng Island để mở màn hình cuộc gọi hoặc thu gọn để tiếp tục làm việc trong ứng dụng với cuộc gọi đang hoạt động ở nền.
Kết nối AirPods — khi mở hộp gần iPhone, Dynamic Island tạo hoạt ảnh kết nối và hiển thị pin của mỗi tai nghe và hộp. Hoạt ảnh kéo dài 2–3 giây, sau đó Island quay lại trạng thái trước đó. Nếu người dùng không có Live Activities đang hoạt động, Island vẫn trống. AirPods Pro 2 cũng hiển thị âm lượng và chế độ khử tiếng ồn khi nhấn vào thân tai nghe.
Các phương pháp tốt nhất cho Dynamic Island từ Apple được khuyến nghị tuân theo để đảm bảo trải nghiệm người dùng chất lượng. Chế độ gọn chỉ nên hiển thị thông tin quan trọng nhất — biểu tượng và một số hoặc nhãn ngắn. Chế độ mở rộng — chỉ thông tin chính mà không có yếu tố dư thừa. Tránh đặt văn bản ở chế độ gọn nếu vượt quá 20 ký tự — hệ thống cắt văn bản bằng dấu ba chấm.
Cập nhật push cho Dynamic Island — sử dụng ActivityKit push cho các bản cập nhật hiếm (trạng thái đơn hàng, kết quả thể thao) và cập nhật cục bộ cho bộ hẹn giờ thường xuyên hoặc đồng hồ bấm giờ. Thông báo push đi qua APNs và mất 0,5–2 giây để xuất hiện trong Island. StaleDate — đặt ngày hết hạn nội dung: nếu bản cập nhật không đến đúng hạn, hệ thống hiển thị nền xám thay vì nội dung, báo hiệu cho người dùng dữ liệu đã lỗi thời.
func updateDelivery(activity: Activity<DeliveryAttributes>) {
Task {
let newContent = ActivityContent(
state: DeliveryAttributes.ContentState(
status: .delivered,
estimatedMinutes: 0
),
staleDate: Date().addingTimeInterval(300)
)
await activity.update(newContent)
// Kết thúc Activity sau 2 giây
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
Tiêu thụ năng lượng — Dynamic Island và Live Activities có tác động tối thiểu đến pin nhờ tối ưu hóa phần cứng màn hình OLED. Các pixel đen xung quanh phần khuyết được tắt và nội dung được hiển thị trên bộ đồng xử lý chuyên dụng. Mức tiêu thụ Live Activity trung bình dưới 1% pin mỗi giờ sử dụng khi cập nhật mỗi 5 phút. Hệ thống tự động tạm dừng Island khi pin yếu (dưới 20%) hoặc ở chế độ tiết kiệm pin.
Thiết kế cho Dynamic Island không yêu cầu điều chỉnh UI chính của ứng dụng — Island hoạt động độc lập với màn hình đang hoạt động. Màu sắc của Live Activity phải phù hợp với chủ đề hệ thống (sáng/tối) qua Color Assets hệ thống. SF Symbols được ưu tiên hơn biểu tượng tùy chỉnh — chúng được đảm bảo hiển thị chính xác ở mọi chế độ Island và có hỗ trợ Dynamic Type tích hợp.
Các câu hỏi thường gặp
Dynamic Island chỉ khả dụng trên iPhone 14 Pro, 14 Pro Max, 15 Pro, 15 Pro Max và mới hơn với iOS 16.1+. Trên các iPhone cũ có notch, Dynamic Island không hiển thị — Live Activity xuất hiện như biểu ngữ bình thường trên màn hình khóa. Nhà phát triển không cần viết mã khác nhau: hệ thống tự điều chỉnh giao diện theo khả năng của thiết bị.
Dynamic Island hỗ trợ hiển thị hai hoạt động cùng lúc — chúng được đặt bên trái và bên phải phần khuyết camera. Nếu chỉ có một hoạt động, nó chiếm bên trái và bên phải vẫn ở trạng thái gọn. Nhấn vào bất kỳ bên nào sẽ mở rộng Island và hiển thị nội dung của Activity tương ứng.
Các sự kiện hệ thống trong Dynamic Island: cuộc gọi đến với thẻ tối thiểu và tên liên hệ, kết nối AirPods với hoạt ảnh và pin, Face ID với biểu tượng ổ khóa, sạc thiết bị với phần trăm, chế độ modem, thay đổi âm lượng, bật Chế độ im lặng, AirDrop với tiến trình truyền và chụp màn hình với hoạt ảnh màn trập.
Dynamic Island không yêu cầu API riêng — nó hiển thị Live Activities được tạo qua ActivityKit cùng với WidgetKit. Ứng dụng đăng ký Activity với cấu hình DynamicIsland, xác định SwiftUI Views gọn, tối thiểu và mở rộng. Hệ thống tự động hiển thị nó trong Dynamic Island trên các thiết bị được hỗ trợ.
Dynamic Island bị giới hạn ở ba trạng thái trực quan với kích thước khác nhau: gọn tới 50pt, tối thiểu tới 22pt, mở rộng tới 300pt. Ở chế độ gọn, không nên đặt văn bản dài hơn 20 ký tự. Chỉ có các thành phần SwiftUI hệ thống — Text, Image, ProgressView, Gauge. Phông chữ và màu sắc tùy chỉnh bị giới hạn trong bảng màu hệ thống.
Tổng kế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