Notification Content Extension — เป็นส่วนขยาย iOS ชนิดหนึ่งที่แทนที่เทมเพลตการแจ้งเตือนแบบพุชมาตรฐานด้วยอินเทอร์เฟซผู้ใช้ที่กำหนดเองทั้งหมด นักพัฒนาจะได้รับความสามารถในการแสดงภาพ โปรแกรมเล่นเสียง ปุ่มดำเนินการ แถบความคืบหน้า และแอนิเมชันแบบกำหนดเองภายในข้อความแจ้งเตือน ซึ่งขยายแบนเนอร์มาตรฐานให้กลายเป็นมินิแอปพลิเคชันที่สมบูรณ์ ตามข้อมูลของ WWDC 2025 ส่วนขยายนี้ใช้ UNNotificationContentExtension และรองรับไฟล์แนบสื่อสูงสุด 4 รายการในข้อความแจ้งเตือนเดียว รวมถึงการประมวลผลการดำเนินการเชิงโต้ตอบผ่าน UNNotificationAction
หัวใจสำคัญ
Notification Content Extension — เป็นส่วนขยายแอปที่แทนที่การแสดงผลการแจ้งเตือนแบบพุชบน iOS แทนแบนเนอร์มาตรฐานที่มีชื่อเรื่อง เนื้อหาข้อความ และปุ่มต่างๆ สามารถแสดงอินเทอร์เฟซที่พัฒนาขึ้นอย่างสมบูรณ์ใน Interface Builder หรือโดยทางโปรแกรมผ่าน UIKit หรือ SwiftUI
แตกต่างจาก Notification Service Extension ซึ่งเปลี่ยนแปลงเนื้อหาก่อนแสดงผล Content Extension รับผิดชอบเฉพาะ การนำเสนอด้วยภาพ เท่านั้น ส่วนขยายจะรับการแจ้งเตือนที่พร้อมหลังจากการแก้ไขทั้งหมดและตัดสินใจว่าจะแสดงอย่างไร นี่คือความแตกต่างหลักระหว่างส่วนขยายการแจ้งเตือนสองประเภท
ส่วนขยายจะถูกเปิดใช้งานเมื่อผู้ใช้ทำท่าทางขยาย — เลื่อนข้อความแจ้งเตือนลงหรือคลิกที่ข้อความนั้น (ขึ้นอยู่กับรุ่นอุปกรณ์) iOS จะเริ่มกระบวนการส่วนขยาย สร้างตัวควบคุมจาก nib หรือ storyboard ที่ระบุ และส่งการแจ้งเตือนผ่าน UNNotificationContentExtension
การพัฒนาเริ่มต้นด้วยการเพิ่ม target ใหม่ใน Xcode ด้วยเทมเพลต Notification Content Extension Xcode จะสร้างไฟล์ MainInterface.storyboard และคลาสที่สืบทอดจาก UIViewController ที่ใช้โปรโตคอล UNNotificationContentExtension
ความสูงสูงสุดของพื้นที่กำหนดเองคือ 320 จุด บน iPhone (สำหรับรุ่นหน้าจอใหญ่) และ 352 จุดบน iPad เนื้อหาที่เกินขอบเขตเหล่านี้จะถูกตัดออก สำหรับการปรับให้เข้ากับขนาดต่างๆ แนะนำให้ใช้ Auto Layout และ UIScrollView สำหรับเนื้อหาที่สามารถเลื่อนได้ ความกว้างจะเท่ากับความกว้างของการแจ้งเตือนเสมอและเปลี่ยนแปลงโดยอัตโนมัติเมื่อหมุนอุปกรณ์
Apple Human Interface Guidelines เตือนว่า: อินเทอร์เฟซการแจ้งเตือนควรกระชับและมีองค์ประกอบหลักเพียงรายการเดียว — ภาพ โปรแกรมเล่น แผนที่ หรือแบบฟอร์มป้อนข้อมูลด่วน องค์ประกอบเชิงโต้ตอบหลายรายการจะทำให้ผู้ใช้หนักเกินไปและทำให้การโต้ตอบซับซ้อน
App Group — กลไกเดียวในการแลกเปลี่ยนข้อมูลระหว่างส่วนขยายและแอปพลิเคชันหลัก ผ่านไดเรกทอรีที่ใช้ร่วมกันของ App Group สามารถถ่ายโอนภาพที่แคช โทเค็น และการตั้งค่าได้ การเรียก API โดยตรงของแอปพลิเคชันหลักหรือการเข้าถึง UserDefaults ของแอปนั้นไม่สามารถใช้งานได้เนื่องจากการแยกกระบวนการ
class NotificationViewController: UIViewController {
func didReceive(
_ notification: UNNotification
) {
guard let attachment = notification
.request.content.attachments.first()
else { return }
if attachment.url.startAccessingSecurityScopedResource() {
imageView.image = UIImage(contentsOfFile:
attachment.url.path)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
UNNotificationContentExtension — โปรโตคอลหลักที่กำหนดวงจรชีวิตของการแจ้งเตือนแบบกำหนดเอง โปรโตคอลมีเมธอดสำหรับรับเนื้อหา ประมวลผลการดำเนินการ และจัดการอินเทอร์เฟซ
didReceive(_:with:) จะถูกเรียกเมื่อได้รับการแจ้งเตือน ส่วนขยายจะได้รับวัตถุ UNNotification และ UNNotificationContentExtensionMediaPlayPauseButtonType สำหรับจัดการโปรแกรมเล่นสื่อ ในเมธอดนี้ ต้องตั้งค่าอินเทอร์เฟซ — โหลดภาพ เริ่มต้นโปรแกรมเล่น หรือแสดงข้อมูล ระบบจะเรียกเมธอดนี้ทุกครั้งที่มีการอัปเดตการแจ้งเตือนแบบเรียลไทม์
สิ่งสำคัญที่ต้องทราบคือส่วนขยายมี เวลาจำกัด ในการดำเนินการ — ประมาณ 30 วินาทีสำหรับรอบการแสดงผลทั้งหมด หากอินเทอร์เฟซไม่พร้อมภายในเวลานี้ iOS จะแสดงการแจ้งเตือนของระบบ สำหรับทรัพยากรที่หนัก — การโหลดภาพจากเครือข่าย การถอดรหัสวิดีโอ — แนะนำให้ใช้การดำเนินการแบบอะซิงโครนัสกับการแคชล่วงหน้าผ่าน App Group
โปรโตคอลรวมถึงเมธอดเสริมสำหรับปุ่มเล่น/หยุดชั่วคราว: mediaPlay, mediaPause และ mediaPlayPauseButtonType หากการแจ้งเตือนมีเนื้อหาเสียงหรือวิดีโอ ส่วนขยายสามารถแสดงโปรแกรมเล่นในตัวพร้อมองค์ประกอบควบคุมของระบบ iOS จะเพิ่มปุ่มเล่นโดยอัตโนมัติที่มุมขวาบนของส่วนขยายเมื่อส่งคืนประเภทปุ่มที่เหมาะสม
UNNotificationAttachment — วัตถุที่มีข้อมูลสื่อที่แนบมากับการแจ้งเตือน ภาพ ไฟล์เสียง และวิดีโอจะถูกเพิ่มในขั้นตอนการสร้างการแจ้งเตือนบนเซิร์ฟเวอร์หรือใน Notification Service Extension ผ่าน UNNotificationAttachment
สำหรับภาพ: JPEG, PNG, GIF, HEIF สำหรับเสียง: MP3, AAC, ALAC, WAV สำหรับวิดีโอ: MPEG-4, H.264, HEVC ขนาดสูงสุดของไฟล์แนบแต่ละรายการคือ 50 MB สูงสุด 4 ไฟล์แนบต่อการแจ้งเตือน ระบบจะดาวน์โหลดไฟล์แนบโดยอัตโนมัติในพื้นหลังก่อนแสดงการแจ้งเตือน และให้สิทธิ์การเข้าถึง URL ในเครื่องแก่ส่วนขยายผ่านทรัพยากร security-scoped
ตามคำแนะนำของ Apple ส่วนขยายไม่ควรดาวน์โหลดสื่อด้วยตนเอง — หลังจากการดาวน์โหลดโดยระบบเสร็จสมบูรณ์ UNNotificationAttachment จะมี URL ในเครื่องอยู่แล้ว อย่างไรก็ตาม หากไฟล์แนบไม่ถูกโหลดทันเวลา (เช่น เนื่องจากการเชื่อมต่อไม่ดี) ส่วนขยายสามารถแสดงตัวยึดตำแหน่งหรือข้อความสำรองได้
UNNotificationAttachment แต่ละรายการจะให้ security-scoped URL ซึ่งส่วนขยายต้องเข้าถึงผ่าน startAccessingSecurityScopedResource() และปล่อยผ่าน stopAccessingSecurityScopedResource() เมธอดเหล่านี้ต้องเรียกเป็นคู่ — มิฉะนั้นทรัพยากรจะไม่ถูกปล่อยและทำให้สิทธิ์การเข้าถึงรั่วไหล
let attachment = notification.request.content.attachments.first()
guard attachment.url.startAccessingSecurityScopedResource()
else { return }
defer { attachment.url.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: attachment.url)
imageView.image = UIImage(data: data)
Notification Content Extension รองรับการดำเนินการเชิงโต้ตอบแบบกำหนดเอง — ปุ่มที่แสดงใต้เนื้อหาการแจ้งเตือน การดำเนินการจะถูกลงทะเบียนเมื่อสร้างหมวดหมู่การแจ้งเตือนผ่าน UNNotificationCategory และสามารถเป็นการทำลายล้าง ข้อความ หรือพื้นหลัง
UNNotificationAction — การดำเนินการอย่างง่ายพร้อมชื่อเรื่องและแฟล็กการทำลายล้างที่เป็นตัวเลือก UNTextInputNotificationAction — การดำเนินการพร้อมฟิลด์ป้อนข้อความ เช่น สำหรับการตอบกลับข้อความอย่างรวดเร็ว ทั้งสองประเภทรองรับตัวเลือก UNNotificationActionOptions.authenticationRequired — ข้อกำหนดในการปลดล็อกอุปกรณ์ก่อนดำเนินการ
ส่วนขยายจะได้รับการดำเนินการที่เลือกผ่านเมธอด didReceive(_:withCompletionHandler:) โดยที่วัตถุ UNNotificationResponse พร้อมด้วยตัวระบุการดำเนินการและข้อความที่เป็นตัวเลือกจะถูกส่งผ่าน ส่วนขยายสามารถประมวลผลการตอบสนองได้ด้วยตนเองหรือส่งต่อไปยังแอปพลิเคชันหลักผ่านคอนเทนเนอร์ App Group ที่ใช้ร่วมกัน
let category = UNNotificationCategory(
identifier: "message",
actions: [
UNTextInputNotificationAction(
identifier: "reply",
title: "Reply",
options: .authenticationRequired
),
UNNotificationAction(
identifier: "mark_read",
title: "Mark Read",
options: .foreground
)
],
intentIdentifiers: []
)
คำถามที่พบบ่อย
Content Extension รับผิดชอบการแสดงผลด้วยภาพของการแจ้งเตือน ในขณะที่ Service Extension รับผิดชอบการเปลี่ยนแปลงเนื้อหาก่อนแสดงผล Content Extension ทำงานหลังจาก Service Extension และไม่สามารถเปลี่ยน Payload ของการแจ้งเตือนได้
Swift และ Objective-C สำหรับ UIKit ตั้งแต่ iOS 16 เป็นต้นไป SwiftUI ก็รองรับการสร้างอินเทอร์เฟซการแจ้งเตือนผ่าน NotificationContentView พร้อมตัวปรับขนาดและการกำหนดค่า
ได้ ตั้งแต่ iOS 16 ส่วนขยายสามารถใช้ SwiftUI ผ่าน UIHostingController อย่างไรก็ตาม ความสามารถทั้งหมดของ UIKit — ขนาด ข้อจำกัด ทรัพยากร security-scoped — ยังคงอยู่และนำไปใช้กับเนื้อหา SwiftUI
สูงสุด 4 ไฟล์แนบ ต่อการแจ้งเตือนหนึ่งครั้ง แต่ละไฟล์แนบมีขนาดสูงสุด 50 MB รูปแบบที่รองรับ: ภาพ (JPEG, PNG, HEIF), เสียง (MP3, AAC) และวิดีโอ (MPEG-4, H.264)
ผ่าน App Group — ไดเรกทอรีที่ใช้ร่วมกันบนดิสก์ UserDefaults ที่มีคำต่อท้าย app group ก็ทำงานได้เช่นกัน การเรียก API โดยตรงของแอปพลิเคชันหลักไม่สามารถใช้งานได้เนื่องจากการแยกกระบวนการของส่วนขยาย
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม