Dynamic Island คือพื้นที่โต้ตอบที่ด้านบนของ iPhone 14 Pro และ iPhone 15/16 ทุกรุ่น ซึ่งรวมการแจ้งเตือน กิจกรรมพื้นหลัง และตัวบ่งชี้ระบบไว้ในโซนไดนามิกเดียว แตกต่างจากรอยบากแบบดั้งเดิม (notch) Dynamic Island เปลี่ยนรูปร่างและขนาดตามบริบทปัจจุบัน ตามข้อมูลของ Apple (WWDC 2024) ผู้ใช้โต้ตอบกับ Dynamic Island โดยเฉลี่ย 12 ครั้งต่อวัน — ผ่านการแตะ การกดค้าง และ Live Activities ด้วย ActivityKit เรียนรู้เพิ่มเติมเกี่ยวกับแอนิเมชันใน iOS ได้ใน บทความเกี่ยวกับ Corner Radius
ประเด็นสำคัญ
Dynamic Island คือพื้นที่โต้ตอบที่อิงตามโซลูชันซอฟต์แวร์-ฮาร์ดแวร์ของ Apple เปิดตัวในเดือนกันยายน 2022 พร้อมกับ iPhone 14 Pro ในทางกายภาพ มันคือรอยตัดรูปทรงยาเม็ดที่ล้อมรอบด้วยพิกเซล OLED ซึ่งเปลี่ยนสีและรูปร่างแบบไดนามิก Apple ใช้การผสมผสานระหว่างรอยตัดฮาร์ดแวร์สำหรับกล้องและ Face ID กับการเรนเดอร์ซอฟต์แวร์ของพื้นที่สีดำรอบ ๆ ทำให้เกิดภาพลวงตาของ «เกาะที่มีชีวิต»
เป้าหมายหลักของ Dynamic Island คือการเชื่อมช่องว่างระหว่างการแจ้งเตือนระบบและเนื้อหาที่กำลังทำงานอยู่ แทนที่การแจ้งเตือนจะปรากฏที่กลางหน้าจอ (เช่นบน Android) หรือเป็นแถบจากด้านบน (เช่นบน iOS รุ่นเก่า) Dynamic Island จะรวมเข้ากับโซนฮาร์ดแวร์โดยตรง ซึ่งช่วยลดสิ่งรบกวนและสร้างความรู้สึกของพื้นที่ที่เป็นหนึ่งเดียว
ตามข้อมูลของ Apple (สถิติการยอมรับ iOS 17, 2024) Dynamic Island พร้อมใช้งานบน 38% ของ iPhone ที่ใช้งานอยู่ เริ่มต้นด้วย iPhone 15 (2023) ทุกรุ่นในไลน์อัปได้รับ Dynamic Island รวมถึงรุ่นพื้นฐาน ใน iOS 18 Apple ได้ขยาย API Live Activities เพิ่มการรองรับตัวจับเวลาถอยหลังและคะแนนกีฬาบน Dynamic Island โดยตรง
Dynamic Island พร้อมใช้งานบน 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 ไม่พร้อมใช้งานบน iPad การพัฒนาสำหรับ Dynamic Island ต้องใช้ Xcode 14.1+ และ iOS 16.1+
Dynamic Island รองรับสามสถานะการแสดงผล: กะทัดรัด ขนาดเล็ก และขยาย การเปลี่ยนระหว่างสถานะเป็นแบบแอนิเมชันโดยใช้ UIKit Animation และ Core Animation ระบบจัดการลำดับความสำคัญของกิจกรรมด้วยตัวเอง: หากหลายแอปพยายามแสดงเนื้อหาพร้อมกัน iOS จะใช้คิวตามเวลาเริ่มต้นของกิจกรรมล่าสุด
| สถานะ | ขนาด | เนื้อหา | ตัวอย่าง |
|---|---|---|---|
| กะทัดรัด | 49×18 pt | ไอคอนแอป + ไอคอนระบบ | ตัวจับเวลา, เพลง, สายโทร |
| ขนาดเล็ก | สูงสุด 66×18 pt | ไอคอน + ข้อความสั้น | เส้นทางการนำทาง, ขั้นตอน |
| ขยาย | สูงสุด 364×160 pt | วิดเจ็ตเต็มรูปแบบพร้อมเนื้อหา | คะแนนกีฬา, สถานะแท็กซี่ |
สถานะกะทัดรัด คือมุมมองมาตรฐานของ Dynamic Island เมื่อมีงานพื้นหลังหนึ่งรายการทำงานอยู่ จะปรากฏเป็นยาเม็ดรูปทรงกลมพร้อมไอคอนแอปทางซ้ายและไอคอนระบบทางขวา โดยค่าเริ่มต้น Live Activities ทั้งหมดจะเริ่มในสถานะกะทัดรัด
สถานะขนาดเล็ก เกิดขึ้นเมื่อมีงานสองรายการขึ้นไปทำงานพร้อมกัน Dynamic Island «แบ่ง» ออกเป็นสององค์ประกอบแยกกันทางซ้ายและขวาของกล้อง สถานะขนาดเล็ก ช่วยให้แสดงแหล่งข้อมูลอิสระสองแหล่ง เช่น เวลาที่แท็กซี่จะมาถึงและเพลงที่กำลังเล่น
สถานะขยาย จะเปิดใช้งานโดยการกดค้างบน Dynamic Island ในโหมดนี้ จะแสดงวิดเจ็ตเต็มรูปแบบพร้อมเนื้อหาที่ปรับแต่งได้: หัวเรื่อง, คำอธิบาย, แถบความคืบหน้า, ปุ่ม สถานะขยายรองรับการเลื่อนและองค์ประกอบโต้ตอบ
ActivityKit คือเฟรมเวิร์ก Swift ที่เปิดตัวใน iOS 16.1 ซึ่งช่วยให้แอปสามารถเผยแพร่ Live Activities บน Dynamic Island และ Lock Screen ActivityKit ใช้สถาปัตยกรรมที่อิงตาม ActivityView และ ActivityAttributes: ตัวแรกกำหนดประเภทเนื้อหา ตัวหลังกำหนดข้อมูลที่เปลี่ยนแปลงได้ เฟรมเวิร์กทำงานร่วมกับ WidgetKit แต่แตกต่างจากวิดเจ็ต Live Activities สามารถอัปเดตแบบเรียลไทม์โดยไม่ต้องเปิดแอป
import ActivityKit
import SwiftUI
// กำหนดคุณสมบัติกิจกรรม
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var driverName: String
var distanceToArrival: Double
var estimatedMinutes: Int
}
var orderNumber: String
}
// เริ่ม Live Activity
func startDeliveryActivity() {
let initialState = DeliveryAttributes.ContentState(
driverName: "อเล็กเซย์",
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 อัปเดตผ่าน ActivityView ซึ่งเรนเดอร์เนื้อหา SwiftUI สำหรับ Dynamic Island ระบบจะกำหนดเทมเพลตที่จะใช้เอง (กะทัดรัด ขนาดเล็ก หรือขยาย) ขึ้นอยู่กับขนาดของ Dynamic Island และจำนวนกิจกรรม หากต้องการอัปเดตเนื้อหา ให้เรียก activity.update(using: contentState) หากต้องการสิ้นสุด — activity.end(dismissalPolicy: .immediate)
ActivityKit รองรับ push updates ผ่าน APNs (Apple Push Notification Service) เมื่อเริ่ม Live Activity คุณสามารถขอ pushToken และส่งการอัปเดตจากเซิร์ฟเวอร์โดยไม่ต้องเปิดแอปบนอุปกรณ์ การอัปเดตแบบพุชทำงานผ่าน activity.pushToken และ Activity.pushToStartToken สำหรับการเริ่ม Live Activity จากระยะไกล
// อัปเดต Live Activity ผ่าน Push
func updateActivity(activity: Activity<DeliveryAttributes>) {
let updatedState = DeliveryAttributes.ContentState(
driverName: "อเล็กเซย์",
distanceToArrival: 1.2,
estimatedMinutes: 4
)
let alertConfiguration = AlertConfiguration(
title: "ผู้จัดส่งอยู่ใกล้",
body: "อเล็กเซย์จะมาถึงใน 4 นาที",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration คือพารามิเตอร์เสริมที่แสดงการแจ้งเตือนเหนือ Dynamic Island สำหรับการอัปเดตสำคัญ (เช่น «ผู้จัดส่งมาถึงแล้ว») หากไม่มี AlertConfiguration เนื้อหาจะอัปเดตแบบเงียบ ซึ่งเหมาะสำหรับแถบความคืบหน้าและตัวจับเวลา
Notch (รอยบาก) คือรอยตัดฮาร์ดแวร์ของ iPhone X–13 ที่ประกอบด้วยกล้องหน้า เซ็นเซอร์ Face ID และลำโพง Notch เป็นแบบคงที่: ขนาดและรูปร่างไม่เปลี่ยนแปลง และการแจ้งเตือนจะแสดงด้านล่างเป็นแถบมาตรฐาน ในทางกลับกัน Dynamic Island ใช้พิกเซลรอบรอยตัดเพื่อแสดงเนื้อหา ทำให้องค์ประกอบฮาร์ดแวร์เป็นส่วนหนึ่งของอินเทอร์เฟซ
| เกณฑ์ | Dynamic Island | Notch |
|---|---|---|
| การโต้ตอบ | รองรับการแตะ, กดค้าง, ปัด | ไม่โต้ตอบ |
| การปรับเนื้อหา | เปลี่ยนรูปร่างตามบริบท | คงที่, เนื้อหาอยู่ใต้รอยบาก |
| Live Activities | รองรับในตัวผ่าน ActivityKit | ไม่มี — เฉพาะการแจ้งเตือนมาตรฐาน |
| มัลติทาสก์ | สองกิจกรรมพร้อมกัน (ซ้ายและขวา) | เพียงกิจกรรมเดียว |
| ความพร้อมใช้งาน | iOS 16.1+, iPhone 14 Pro และใหม่กว่า | iOS 11+, iPhone X–13 |
ตาม Apple Human Interface Guidelines (2025) ไม่ควรใช้ Dynamic Island สำหรับโฆษณาหรือการแสดงเนื้อหาคงที่แบบถาวร Live Activities มีไว้สำหรับงานพื้นหลังที่มีวงจรชีวิตชัดเจนเท่านั้น: ตัวจับเวลา, การจัดส่ง, กีฬา, เพลง, การนำทาง การละเมิดกฎเหล่านี้จะนำไปสู่การปฏิเสธแอปในการตรวจสอบ App Store
Dynamic Island มีวงจรชีวิตที่เคร่งครัด: กิจกรรมเริ่มต้นด้วยคำขอผ่าน Activity.request() ผ่านสถานะ ทำงาน/หยุดชั่วคราว/อัปเดตแล้ว และสิ้นสุดด้วยการเรียก activity.end() ระบบสามารถบังคับสิ้นสุดกิจกรรมเมื่อหน่วยความจำต่ำ (เช่น เมื่อเปิดกล้อง) ในกรณีนี้ แอปจะได้รับการแจ้งเตือนผ่าน ActivityActivityState.finished
ท่าทาง บน Dynamic Island จัดการโดยเนื้อหา SwiftUI ภายใน ActivityView ท่าทางมาตรฐาน: แตะที่สถานะกะทัดรัดเพื่อเปิดแอป, กดค้างเพื่อขยายสถานะขยาย, ปัดลงเพื่อปิดสถานะขยาย ท่าทางที่กำหนดเองจะเพิ่มผ่านตัวปรับแต่ง SwiftUI (onTapGesture, onLongPressGesture) ภายในวิวกิจกรรม
เมื่อระบบสิ้นสุด Live Activity (หรือผู้ใช้ปัดเพื่อลบ) แอปควรจัดการสถานะ finished เพื่อปล่อยทรัพยากร แนะนำให้สมัครรับ Activity.activityStateUpdates และลบการอ้างอิงภายในกิจกรรมหลังจากเสร็จสิ้น
import ActivityKit
func observeActivityState(activity: Activity<DeliveryAttributes>) {
Task {
for await state in activity.activityStateUpdates {
switch state {
case .active:
print("กิจกรรมทำงานบน Dynamic Island")
case .dismissed:
print("กิจกรรมถูกซ่อนโดยผู้ใช้")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("กิจกรรมสิ้นสุดโดยระบบ")
cleanupResources()
@unknown default:
break
}
}
}
}
คำแนะนำของ Apple (WWDC 2024, เซสชัน 10146): อย่าใช้ Dynamic Island สำหรับแสดงสถานะที่ไม่ต้องการความสนใจจากผู้ใช้ Live Activity แต่ละรายการควรมีตัวกระตุ้นเริ่มต้นและสิ้นสุดที่ชัดเจน สำหรับการอัปเดตพื้นหลังที่ไม่มีส่วนติดต่อผู้ใช้ ให้ใช้ Background Tasks แทน Live Activities
คำถามที่พบบ่อย
Dynamic Island พร้อมใช้งานบน iPhone 14 Pro, 14 Pro Max และทุกรุ่น iPhone 15 และ iPhone 16 (รวมถึงรุ่นพื้นฐาน) การพัฒนาต้องใช้ iOS 16.1+ และ Xcode 14.1 ในรุ่นเก่า (iPhone X–13) จะใช้รอยบากแบบคงที่ซึ่งไม่รองรับ Live Activities
Dynamic Island รวมการแจ้งเตือนเข้ากับโซนฮาร์ดแวร์ของหน้าจอโดยไม่บดบังเนื้อหา การแจ้งเตือนปกติจะปรากฏเป็นแถบที่ด้านบนและหายไปหลังจากไม่กี่วินาที Live Activities บน Dynamic Island สามารถทำงานต่อไปได้เป็นชั่วโมงและอัปเดตแบบเรียลไทม์ (สถานะการจัดส่ง, ตัวจับเวลา, เพลง)
ใช้ push updates ผ่าน APNs เมื่อเริ่ม Live Activity ให้เรียก activity.pushToken และส่งโทเค็นไปยังเซิร์ฟเวอร์ของคุณ เซิร์ฟเวอร์ส่งคำขออัปเดตผ่าน APNs พร้อม ContentState ใหม่ ทางเลือกอื่นคือการอัปเดตภายในผ่าน activity.update(using:) จากภายในแอป
iOS จะแบ่ง Dynamic Island ออกเป็นสองส่วนโดยอัตโนมัติเมื่อมี Live Activities สองรายการทำงานอยู่ แต่ละกิจกรรมจะแสดงใน สถานะขนาดเล็ก ทางซ้ายและขวาของกล้อง การกดค้างบนส่วนใดส่วนหนึ่งจะเปิดสถานะขยายเฉพาะแอปนั้นเท่านั้น
ตรวจสอบ: (1) แอปมี NSSupportsLiveActivities = YES ใน Info.plist, (2) ActivityAttributes และ ContentState ใช้ Codable และ Hashable, (3) เวอร์ชัน iOS คือ 16.1+, (4) อุปกรณ์รองรับ Dynamic Island สำหรับโปรแกรมจำลอง ให้ใช้ iPhone 14 Pro หรือใหม่กว่าใน Xcode
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ