Live Activity — คืออะไร วิดเจ็ตบนหน้าจอล็อก

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-15 เวลาอ่าน: 9 นาที

Live Activity คือวิดเจ็ตแบบไดนามิกบนหน้าจอล็อก iPhone และใน Dynamic Island ที่แสดงข้อมูลแบบเรียลไทม์: สถานะการจัดส่ง คะแนนกีฬา ตัวจับเวลา และการเล่นเพลง ทำงานผ่าน ActivityKit (Swift, iOS 16.1+) ร่วมกับ WidgetKit Live Activity อัปเดตในเครื่องหรือผ่านการแจ้งเตือนแบบพุช รองรับหลายสถานะ และถูกระบบยุติหลังจากเหตุการณ์สิ้นสุด ดูเพิ่มเติมได้ที่ ActivityKit Documentation

ประเด็นสำคัญ

  • Live Activity — วิดเจ็ตเวลาจริงบนหน้าจอล็อกและ Dynamic Island
  • ActivityKit — เฟรมเวิร์กสำหรับเริ่มต้นและจัดการ Live Activities ใน iOS 16.1+
  • การอัปเดตพุช — เซิร์ฟเวอร์ส่งสถานะใหม่ผ่านการแจ้งเตือนพุช ActivityKit
  • สถานะ — แต่ละ Activity รองรับสถานะทำงานและสิ้นสุดด้วย UI ที่ต่างกัน
  • Dynamic Island — การแสดง Live Activity แบบกะทัดรัดบน iPhone 14 Pro ขึ้นไป

Live Activity คืออะไร — วิดเจ็ตบนหน้าจอล็อก?

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 และสามารถบันทึกสถานะล่าสุดเพื่อกู้คืนได้

สถาปัตยกรรม ActivityKit และ WidgetKit

สถาปัตยกรรม 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ออบเจ็กต์ขอและจัดการ ActivityActivity.request(attributes:content:)
PushTokenโทเคนสำหรับการอัปเดตพุชจากเซิร์ฟเวอร์activity.pushToken publisher
ActivityUIวิว SwiftUI สำหรับหน้าจอล็อกและ Dynamic IslandLockScreenView, ExpandedView, CompactView

วงจรชีวิต Activity ประกอบด้วยสามเฟส: ทำงาน (ระบบแสดงและอัปเดต), สิ้นสุด (Activity สิ้นสุดแล้วแต่ UI ยังเห็นได้ 4 ชั่วโมง), ถูกลบ (ระบบลบ UI) แอปสามารถยุติ Activity ได้ทุกเมื่อ ระบบยังยุติ Activities โดยบังคับ — เช่น เมื่อรีสตาร์ทอุปกรณ์หรือหมดเขต 8 ชั่วโมง

swift
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

การสร้าง Live Activity ด้วย WidgetKit และ SwiftUI

การสร้าง Activity เริ่มต้นด้วยคำขอไปยัง ActivityKit แอปเรียก Activity.request(attributes:content:pushType:) ด้วยข้อมูลเริ่มต้น ระบบตรวจสอบว่า Dynamic Island พร้อมใช้งานบนอุปกรณ์หรือไม่และส่งคืนออบเจ็กต์ Activity คำขออาจล้มเหลวหากเกินขีดจำกัดของ Activity ที่ทำงานอยู่ — ปกติไม่เกิน 5 รายการพร้อมกัน หลังจากคำขอสำเร็จ ระบบจะแสดงวิดเจ็ตบนหน้าจอล็อก และหากเป็นไปได้ ใน 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)")
}

วิว SwiftUI สำหรับ Live Activity ใช้โครงสร้าง LockScreenView, ExpandedView และ CompactView จาก WidgetKit วิวได้รับบริบท (ActivityViewContext) พร้อมแอตทริบิวต์และสถานะปัจจุบัน การอัปเดตวิวเกิดขึ้นโดยอัตโนมัติเมื่อมีสถานะใหม่จากระบบ Live Activity รองรับเฉพาะชุดส่วนประกอบ SwiftUI ที่จำกัด — Text, Image, HStack, VStack และม็อดิฟายเออร์บางตัว

แต่ละ วิว Live Activity ต้องมีน้ำหนักเบาและรวดเร็ว — ระบบปฏิเสธที่จะเรนเดอร์วิวที่หนัก ข้อจำกัดด้านเวลาเรนเดอร์คือ 30 มิลลิวินาทีต่อเฟรม อนิเมชันจำกัดเฉพาะการเปลี่ยนผ่านของระบบระหว่างสถานะ — อนิเมชันแบบกำหนดเองไม่สามารถใช้ได้ใน Live Activity การเรนเดอร์ดำเนินการในกระบวนการพื้นหลังของ WidgetKit โดยให้ความสำคัญกับการตอบสนองของหน้าจอล็อก

การอัปเดต Live Activity ในเครื่องและผ่านพุช

การอัปเดตในเครื่อง — แอปอัปเดตสถานะ Activity โดยเรียก activity.update(using:) เมธอดรับ ContentState ใหม่และ AlertConfiguration เลือกได้สำหรับแสดงการแจ้งเตือนเมื่ออัปเดต การอัปเดตในเครื่องรวดเร็ว — ระบบวาดวิวใหม่ในรอบการเรนเดอร์ถัดไป โดยปกติภายใน 1–2 วินาที สำหรับการอัปเดตบ่อยครั้ง (ตัวจับเวลา นาฬิกาจับเวลา) ให้ใช้โหมดในเครื่อง — เชื่อถือได้และเร็วกว่าพุช

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"
    )
)

การอัปเดตพุช — เซิร์ฟเวอร์ส่งการแจ้งเตือนพุช ActivityKit พร้อมสถานะใหม่ในรูปแบบ JSON สำหรับสิ่งนี้ แอปได้รับ pushToken จากผู้เผยแพร่ activity.pushToken และส่งต่อไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์ส่งคำขอ POST ไปยัง APNs พร้อม payload ที่มี ContentState ใหม่ ระบบรับพุช ถอดรหัสสถานะ และอัปเดต Live Activity โดยไม่ต้องให้แอปมีส่วนร่วม — ซึ่งช่วยให้อัปเดต Activity ได้แม้เมื่อแอปปิดอยู่

การอัปเดตพุช มีประสิทธิภาพมากกว่า การอัปเดตในเครื่องสำหรับการอัปเดตที่ไม่บ่อย (สถานะจัดส่งทุก 5–10 นาที) — แอปไม่จำเป็นต้องรักษาการเชื่อมต่อเครือข่าย สำหรับการอัปเดตบ่อยทุก 1–2 วินาที ให้ใช้เมธอดในเครื่อง Payload ของเซิร์ฟเวอร์มีเฉพาะฟิลด์ที่เปลี่ยนแปลงได้ของ ContentState — ข้อมูล Attributes แบบคงที่ถูกส่งเมื่อสร้าง Activity เท่านั้น

การแสดง Live Activity ใน Dynamic Island

Dynamic Island คือพื้นที่ฮาร์ดแวร์-ซอฟต์แวร์บน iPhone 14 Pro, 15 Pro ขึ้นไปที่ปรับตามเนื้อหาของ Live Activity ระบบแสดง Activity โดยอัตโนมัติในสามโหมด: กะทัดรัด (ไอคอน + ข้อความสั้นทางซ้ายของรอยตัด), ขั้นต่ำ (ไอคอนเท่านั้น) และขยาย (สี่เหลี่ยม 300pt พร้อมข้อมูล) นักพัฒนาไม่ได้ควบคุมโหมดเหล่านี้โดยตรง — ระบบเลือกโหมดตามลำดับความสำคัญและพื้นที่ว่าง

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 รองรับ การโต้ตอบ — ผู้ใช้แตะพื้นที่และเข้าสู่แอปหรือเปิดวิวขยาย การแตะโหมดกะทัดรัดจะเปลี่ยนเป็นโหมดขยาย และการปัดซ้ายจะลด Activity ลงเป็นโหมดขั้นต่ำ ปุ่มในโหมดขยาย (หยุดชั่วคราว/ยกเลิก) จัดการผ่าน Link จาก SwiftUI — ระบบเปิดแอปด้วย URL deep link การประมวลผลทำใน UIApplicationDelegate

ข้อจำกัดของ Dynamic Island: ความกว้างของโหมดขยายสูงสุด 300pt ข้อความกะทัดรัดสูงสุด 30 ตัวอักษร สีและฟอนต์ตรงกับธีมระบบ — การปรับแต่งมีจำกัด อนิเมชันการเปลี่ยนระหว่างโหมดถูกกำหนดโดยระบบและไม่สามารถปรับแต่งได้ หากหลายแอปมี Activity ที่ทำงานอยู่ Dynamic Island จะแสดงตามลำดับความสำคัญตามเวลาเริ่มต้นและประเภทเนื้อหา

คำถามที่พบบ่อย

Live Activity แตกต่างจากวิดเจ็ตทั่วไปอย่างไร?

วิดเจ็ต WidgetKit ทั่วไปแสดงข้อมูลคงที่และอัปเดตตามตัวจับเวลาของระบบด้วยช่วงเวลาขั้นต่ำ 15–30 นาที Live Activity แสดงข้อมูลไดนามิกแบบเรียลไทม์บนหน้าจอล็อกและ Dynamic Island Live Activity ถูกเริ่มต้นโดยแอป มีอายุสูงสุด 8 ชั่วโมง และถูกระบบยุติหลังจากเหตุการณ์สิ้นสุด ต่างจากวิดเจ็ตที่มีอยู่ถาวร

Live Activity อัปเดตบ่อยแค่ไหน?

Live Activity รองรับสองโหมดการอัปเดต: ในเครื่อง — แอปอัปเดตสถานะผ่าน API ActivityKit ได้ทุกเมื่อ และการอัปเดตพุช — เซิร์ฟเวอร์ส่งการแจ้งเตือนพุช ActivityKit ซึ่งระบบแปลงเป็นสถานะใหม่ของวิดเจ็ต เมื่อแบตเตอรี่เหลือน้อย ระบบอาจหยุด Live Activity จนกว่าจะเชื่อมต่อที่ชาร์จ

Live Activities ทำงานบนอุปกรณ์ใดบ้าง?

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 พร้อมกันได้กี่รายการ?

ระบบจำกัดจำนวน Live Activities ที่ทำงานอยู่ — ปกติไม่เกิน 5 รายการพร้อมกันสำหรับทุกแอป การพยายามเริ่มเกินขีดจำกัดจะส่งคืนข้อผิดพลาดจาก ActivityKit แต่ละ Live Activity สามารถมีหลายสถานะ — เช่น รอดำเนินการ กำลังจัดส่ง จัดส่งแล้วสำหรับคำสั่งซื้ออาหาร หลังจากเสร็จสิ้น Activity จะยังคงอยู่ใน UI อีก 4 ชั่วโมง

ต้องได้รับอนุญาตจากผู้ใช้สำหรับ Live Activity หรือไม่?

ใช่ แอปต้องขออนุญาตส่งการแจ้งเตือน — Live Activity ใช้ช่องทางการแจ้งเตือนของระบบ ผู้ใช้สามารถปิด Live Activity สำหรับแอปเฉพาะในการตั้งค่า เมื่อเริ่มครั้งแรก ActivityKit จะแสดงไดอะล็อกขออนุญาต หากไม่มีสิทธิ์ คำขอ Activity จะล้มเหลว

สรุป

  • Live Activity — วิดเจ็ตไดนามิกบนหน้าจอล็อกและ Dynamic Island พร้อมอัปเดตแบบเรียลไทม์
  • ActivityKit — เฟรมเวิร์ก iOS 16.1+ สำหรับจัดการวงจรชีวิต Live Activities
  • Attributes and State — ข้อมูลคงที่และสถานะไดนามิกของ Activity ส่งไปยังวิว SwiftUI
  • การอัปเดตพุช — เซิร์ฟเวอร์ส่งสถานะใหม่ผ่าน APNs โดยไม่ต้องให้แอปมีส่วนร่วม
  • Dynamic Island — สามโหมดการแสดง: กะทัดรัด ขั้นต่ำ และสี่เหลี่ยมขยาย
  • ข้อจำกัด — สูงสุด 5 Activity ที่ทำงานอยู่ สูงสุด 8 ชั่วโมงอายุ สูงสุด 4 ชั่วโมงหลังเสร็จสิ้น
  • AlertConfiguration — การแจ้งเตือนเลือกได้เมื่ออัปเดตสถานะ Activity

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม