Live Activity คือวิดเจ็ตแบบไดนามิกบนหน้าจอล็อก iPhone และใน Dynamic Island ที่แสดงข้อมูลแบบเรียลไทม์: สถานะการจัดส่ง คะแนนกีฬา ตัวจับเวลา และการเล่นเพลง ทำงานผ่าน ActivityKit (Swift, iOS 16.1+) ร่วมกับ WidgetKit Live Activity อัปเดตในเครื่องหรือผ่านการแจ้งเตือนแบบพุช รองรับหลายสถานะ และถูกระบบยุติหลังจากเหตุการณ์สิ้นสุด ดูเพิ่มเติมได้ที่ ActivityKit Documentation
ประเด็นสำคัญ
Live Activity เป็นส่วนขยายของ WidgetKit ที่แสดงเนื้อหาแบบไดนามิกบนหน้าจอล็อก iPhone และใน Dynamic Island แตกต่างจากวิดเจ็ตแบบคงที่ซึ่งอัปเดตตามตัวจับเวลาของระบบ Live Activity จะถูกเริ่มต้นโดยแอปและมีอายุจำกัด — สูงสุด 8 ชั่วโมงสำหรับ Activity ที่ทำงานอยู่ และสูงสุด 4 ชั่วโมงหลังจากเสร็จสิ้น ผู้ใช้เห็นข้อมูลล่าสุดโดยไม่ต้องปลดล็อกอุปกรณ์: สถานะคำสั่งซื้อจัดส่ง ระยะทางถึงจุดหมายในแท็กซี่ ผลการแข่งขัน หรือความคืบหน้าของการออกกำลังกาย
ActivityKit เป็นเฟรมเวิร์กสำหรับทำงานกับ Live Activities ซึ่งเปิดตัวใน iOS 16.1 โดยมี API สำหรับขอ อัปเดต และยุติ Activities Activity คือออบเจ็กต์ที่มีเนื้อหาและสถานะ เนื้อหา (ActivityContent) กำหนดข้อมูลคงที่ ในขณะที่สถานะ (ActivityState) กำหนดข้อมูลไดนามิกที่เปลี่ยนแปลงตามเวลา ระบบจะตัดสินใจเองว่าจะเรนเดอร์สถานะใหม่เมื่อใด — ซึ่งช่วยประหยัดแบตเตอรี่และรับประกันอนิเมชันที่ราบรื่น
แต่ละ Live Activity จะถูกระบุโดย ActivityID โดยเฉพาะและผูกกับกระบวนการเดียว — แอปที่สร้างขึ้น ระบบอาจยุติ Activity เมื่อหน่วยความจำต่ำหรือแบตเตอรี่เหลือน้อย นักพัฒนาจะได้รับการแจ้งเตือนการยุติโดยบังคับผ่านตัวแทน ActivityKit และสามารถบันทึกสถานะล่าสุดเพื่อกู้คืนได้
สถาปัตยกรรม Live Activity สร้างขึ้นบนเฟรมเวิร์กสองตัว: WidgetKit รับผิดชอบการเรนเดอร์วิว SwiftUI, ActivityKit รับผิดชอบวงจรชีวิตของ Activity นักพัฒนาสร้าง WidgetBundle ที่รองรับ LiveActivityConfiguration แต่ละคอนฟิกูเรชันกำหนดประเภทข้อมูล (Attributes และ State) และวิว SwiftUI ที่ระบบเรนเดอร์บนหน้าจอล็อกและ Dynamic Island ข้อมูลถูกส่งผ่าน ActivityAttributes — struct ที่มีฟิลด์ let สำหรับเนื้อหาและฟิลด์ var สำหรับสถานะ
| ส่วนประกอบ | วัตถุประสงค์ | API |
|---|---|---|
| Attributes | ข้อมูลคงที่ของ Activity ทั้งหมด | let name: String, let icon: String |
| ContentState | สถานะไดนามิก เปลี่ยนแปลงเมื่ออัปเดต | var progress: Double, var status: Status |
| Activity | ออบเจ็กต์ขอและจัดการ Activity | Activity.request(attributes:content:) |
| PushToken | โทเคนสำหรับการอัปเดตพุชจากเซิร์ฟเวอร์ | activity.pushToken publisher |
| ActivityUI | วิว SwiftUI สำหรับหน้าจอล็อกและ Dynamic Island | LockScreenView, ExpandedView, CompactView |
วงจรชีวิต Activity ประกอบด้วยสามเฟส: ทำงาน (ระบบแสดงและอัปเดต), สิ้นสุด (Activity สิ้นสุดแล้วแต่ UI ยังเห็นได้ 4 ชั่วโมง), ถูกลบ (ระบบลบ UI) แอปสามารถยุติ Activity ได้ทุกเมื่อ ระบบยังยุติ Activities โดยบังคับ — เช่น เมื่อรีสตาร์ทอุปกรณ์หรือหมดเขต 8 ชั่วโมง
import ActivityKit
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable & Hashable {
var status: DeliveryStatus
var estimatedMinutes: Int
}
var orderNumber: String
var restaurantName: String
}
WidgetBundle ลงทะเบียน Live Activity ผ่านมาโคร @main: วิดเจ็ตส่งคืนรายการคอนฟิกูเรชันรวมถึง LiveActivityConfiguration จากคอนฟิกูเรชันนี้ ระบบรู้ว่าต้องคาดหวังประเภทข้อมูลใดและจะเรนเดอร์ UI ในสถานะต่างๆ อย่างไร — แบบกะทัดรัด ขั้นต่ำ และขยายสำหรับ Dynamic Island
การสร้าง Activity เริ่มต้นด้วยคำขอไปยัง ActivityKit แอปเรียก Activity.request(attributes:content:pushType:) ด้วยข้อมูลเริ่มต้น ระบบตรวจสอบว่า Dynamic Island พร้อมใช้งานบนอุปกรณ์หรือไม่และส่งคืนออบเจ็กต์ Activity คำขออาจล้มเหลวหากเกินขีดจำกัดของ Activity ที่ทำงานอยู่ — ปกติไม่เกิน 5 รายการพร้อมกัน หลังจากคำขอสำเร็จ ระบบจะแสดงวิดเจ็ตบนหน้าจอล็อก และหากเป็นไปได้ ใน Dynamic Island
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)")
}
วิว SwiftUI สำหรับ Live Activity ใช้โครงสร้าง LockScreenView, ExpandedView และ CompactView จาก WidgetKit วิวได้รับบริบท (ActivityViewContext) พร้อมแอตทริบิวต์และสถานะปัจจุบัน การอัปเดตวิวเกิดขึ้นโดยอัตโนมัติเมื่อมีสถานะใหม่จากระบบ Live Activity รองรับเฉพาะชุดส่วนประกอบ SwiftUI ที่จำกัด — Text, Image, HStack, VStack และม็อดิฟายเออร์บางตัว
แต่ละ วิว Live Activity ต้องมีน้ำหนักเบาและรวดเร็ว — ระบบปฏิเสธที่จะเรนเดอร์วิวที่หนัก ข้อจำกัดด้านเวลาเรนเดอร์คือ 30 มิลลิวินาทีต่อเฟรม อนิเมชันจำกัดเฉพาะการเปลี่ยนผ่านของระบบระหว่างสถานะ — อนิเมชันแบบกำหนดเองไม่สามารถใช้ได้ใน Live Activity การเรนเดอร์ดำเนินการในกระบวนการพื้นหลังของ WidgetKit โดยให้ความสำคัญกับการตอบสนองของหน้าจอล็อก
การอัปเดตในเครื่อง — แอปอัปเดตสถานะ Activity โดยเรียก activity.update(using:) เมธอดรับ ContentState ใหม่และ AlertConfiguration เลือกได้สำหรับแสดงการแจ้งเตือนเมื่ออัปเดต การอัปเดตในเครื่องรวดเร็ว — ระบบวาดวิวใหม่ในรอบการเรนเดอร์ถัดไป โดยปกติภายใน 1–2 วินาที สำหรับการอัปเดตบ่อยครั้ง (ตัวจับเวลา นาฬิกาจับเวลา) ให้ใช้โหมดในเครื่อง — เชื่อถือได้และเร็วกว่าพุช
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"
)
)
การอัปเดตพุช — เซิร์ฟเวอร์ส่งการแจ้งเตือนพุช ActivityKit พร้อมสถานะใหม่ในรูปแบบ JSON สำหรับสิ่งนี้ แอปได้รับ pushToken จากผู้เผยแพร่ activity.pushToken และส่งต่อไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์ส่งคำขอ POST ไปยัง APNs พร้อม payload ที่มี ContentState ใหม่ ระบบรับพุช ถอดรหัสสถานะ และอัปเดต Live Activity โดยไม่ต้องให้แอปมีส่วนร่วม — ซึ่งช่วยให้อัปเดต Activity ได้แม้เมื่อแอปปิดอยู่
การอัปเดตพุช มีประสิทธิภาพมากกว่า การอัปเดตในเครื่องสำหรับการอัปเดตที่ไม่บ่อย (สถานะจัดส่งทุก 5–10 นาที) — แอปไม่จำเป็นต้องรักษาการเชื่อมต่อเครือข่าย สำหรับการอัปเดตบ่อยทุก 1–2 วินาที ให้ใช้เมธอดในเครื่อง Payload ของเซิร์ฟเวอร์มีเฉพาะฟิลด์ที่เปลี่ยนแปลงได้ของ ContentState — ข้อมูล Attributes แบบคงที่ถูกส่งเมื่อสร้าง Activity เท่านั้น
Dynamic Island คือพื้นที่ฮาร์ดแวร์-ซอฟต์แวร์บน iPhone 14 Pro, 15 Pro ขึ้นไปที่ปรับตามเนื้อหาของ Live Activity ระบบแสดง Activity โดยอัตโนมัติในสามโหมด: กะทัดรัด (ไอคอน + ข้อความสั้นทางซ้ายของรอยตัด), ขั้นต่ำ (ไอคอนเท่านั้น) และขยาย (สี่เหลี่ยม 300pt พร้อมข้อมูล) นักพัฒนาไม่ได้ควบคุมโหมดเหล่านี้โดยตรง — ระบบเลือกโหมดตามลำดับความสำคัญและพื้นที่ว่าง
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 รองรับ การโต้ตอบ — ผู้ใช้แตะพื้นที่และเข้าสู่แอปหรือเปิดวิวขยาย การแตะโหมดกะทัดรัดจะเปลี่ยนเป็นโหมดขยาย และการปัดซ้ายจะลด Activity ลงเป็นโหมดขั้นต่ำ ปุ่มในโหมดขยาย (หยุดชั่วคราว/ยกเลิก) จัดการผ่าน Link จาก SwiftUI — ระบบเปิดแอปด้วย URL deep link การประมวลผลทำใน UIApplicationDelegate
ข้อจำกัดของ Dynamic Island: ความกว้างของโหมดขยายสูงสุด 300pt ข้อความกะทัดรัดสูงสุด 30 ตัวอักษร สีและฟอนต์ตรงกับธีมระบบ — การปรับแต่งมีจำกัด อนิเมชันการเปลี่ยนระหว่างโหมดถูกกำหนดโดยระบบและไม่สามารถปรับแต่งได้ หากหลายแอปมี Activity ที่ทำงานอยู่ Dynamic Island จะแสดงตามลำดับความสำคัญตามเวลาเริ่มต้นและประเภทเนื้อหา
คำถามที่พบบ่อย
วิดเจ็ต WidgetKit ทั่วไปแสดงข้อมูลคงที่และอัปเดตตามตัวจับเวลาของระบบด้วยช่วงเวลาขั้นต่ำ 15–30 นาที Live Activity แสดงข้อมูลไดนามิกแบบเรียลไทม์บนหน้าจอล็อกและ Dynamic Island Live Activity ถูกเริ่มต้นโดยแอป มีอายุสูงสุด 8 ชั่วโมง และถูกระบบยุติหลังจากเหตุการณ์สิ้นสุด ต่างจากวิดเจ็ตที่มีอยู่ถาวร
Live Activity รองรับสองโหมดการอัปเดต: ในเครื่อง — แอปอัปเดตสถานะผ่าน API ActivityKit ได้ทุกเมื่อ และการอัปเดตพุช — เซิร์ฟเวอร์ส่งการแจ้งเตือนพุช ActivityKit ซึ่งระบบแปลงเป็นสถานะใหม่ของวิดเจ็ต เมื่อแบตเตอรี่เหลือน้อย ระบบอาจหยุด Live Activity จนกว่าจะเชื่อมต่อที่ชาร์จ
Live Activities พร้อมใช้งานบน iPhone ที่ใช้ iOS 16.1 ขึ้นไป บน iPhone 14 Pro ขึ้นไป Live Activity จะแสดงใน Dynamic Island ด้วย บน iPad Live Activity รองรับเฉพาะบนหน้าจอล็อก — Dynamic Island ไม่มีบน iPad Apple Watch ไม่รองรับ Live Activities โดยตรง แต่สามารถแสดงการแจ้งเตือนเมื่อเสร็จสิ้น
ระบบจำกัดจำนวน Live Activities ที่ทำงานอยู่ — ปกติไม่เกิน 5 รายการพร้อมกันสำหรับทุกแอป การพยายามเริ่มเกินขีดจำกัดจะส่งคืนข้อผิดพลาดจาก ActivityKit แต่ละ Live Activity สามารถมีหลายสถานะ — เช่น รอดำเนินการ กำลังจัดส่ง จัดส่งแล้วสำหรับคำสั่งซื้ออาหาร หลังจากเสร็จสิ้น Activity จะยังคงอยู่ใน UI อีก 4 ชั่วโมง
ใช่ แอปต้องขออนุญาตส่งการแจ้งเตือน — Live Activity ใช้ช่องทางการแจ้งเตือนของระบบ ผู้ใช้สามารถปิด Live Activity สำหรับแอปเฉพาะในการตั้งค่า เมื่อเริ่มครั้งแรก ActivityKit จะแสดงไดอะล็อกขออนุญาต หากไม่มีสิทธิ์ คำขอ Activity จะล้มเหลว
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ