Notification Content Extension คือส่วนขยาย iOS ที่อนุญาตให้แทนที่อินเทอร์เฟซการแจ้งเตือน push มาตรฐานด้วย UIView ที่กำหนดเอง นักพัฒนาได้รับการควบคุมอย่างเต็มที่ในการแสดงเนื้อหา: รูปภาพ วิดีโอ แอนิเมชัน แบบอักษรที่กำหนดเอง และองค์ประกอบแบบโต้ตอบ ตามข้อมูลจาก Apple Developer, 2025 Notification Content Extension รองรับอินเทอร์เฟซ UIKit ใดๆ ในพื้นที่จำกัดของการแจ้งเตือน
ประเด็นสำคัญ
Notification Content Extension คือส่วนขยายแอปใน iOS ที่แทนที่เทมเพลตการแสดงผลการแจ้งเตือน push มาตรฐานด้วย UIView ที่กำหนดเอง ต่างจากการแจ้งเตือนปกติที่เนื้อหาถูกจำกัดอยู่ที่หัวเรื่อง หัวเรื่องย่อย และเนื้อหา ส่วนขยายอนุญาตให้แสดงอินเทอร์เฟซ UIKit ใดๆ: แผนที่พร้อมพิกัด กราฟ แกลเลอรีรูปภาพ หรือฟอร์มป้อนข้อมูล
เมื่อ iOS ได้รับการแจ้งเตือน push ที่มี categoryIdentifier ที่ระบุ ระบบจะตรวจสอบว่ามีส่วนขยายที่ลงทะเบียนสำหรับหมวดหมู่นี้หรือไม่ ถ้ามี — ระบบจะเริ่มส่วนขยายในกระบวนการแยกต่างหากและส่งเนื้อหาการแจ้งเตือนให้ ส่วนขยายจะแสดงอินเทอร์เฟซของตนเองแทนมาตรฐาน ผู้ใช้ จะโต้ตอบกับอินเทอร์เฟซที่กำหนดเองโดยไม่ต้องเปิดแอปพลิเคชันหลัก
สิ่งสำคัญคือไม่ควรสับสนระหว่าง Notification Content Extension กับ Notification Service Extension Service Extension จะประมวลผลเนื้อหาก่อนแสดงการแจ้งเตือน (ดาวน์โหลดไฟล์แนบ ถอดรหัส) Content Extension จะแทนที่อินเทอร์เฟซหลังจากได้รับเนื้อหาที่พร้อมแล้ว ทั้งสองส่วนขยาย สามารถทำงานร่วมกันได้: Service Extension เตรียมข้อมูล Content Extension แสดงข้อมูลเหล่านั้น
| คุณลักษณะ | Content Extension | Service Extension |
|---|---|---|
| วัตถุประสงค์ | UI การแจ้งเตือนที่กำหนดเอง | การปรับเปลี่ยนเนื้อหาก่อนแสดง |
| เวลาทำงาน | ขณะที่ผู้ใช้เห็นการแจ้งเตือน | สูงสุด 30 วินาทีในพื้นหลัง |
| อินเทอร์เฟซ | UIView UIKit เต็มรูปแบบ | ไม่มีอินเทอร์เฟซ |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension ทำงานในกระบวนการที่แยกเดี่ยวพร้อมทรัพยากรที่จำกัด ส่วนขยายไม่สามารถเข้าถึงพื้นที่จัดเก็บหลักของแอปพลิเคชันผ่าน NSUserDefaults ยกเว้น App Group ขนาดของส่วนขยายถูกจำกัดที่ 50 MB ในสถานะไม่บีบอัด เวลาในการแสดงเนื้อหาก็ถูกจำกัดเช่นกัน — หากส่วนขยายไม่เสร็จสิ้นการอัปเดตภายในเวลาที่เหมาะสม ระบบจะยุติการทำงาน
ในการสร้างส่วนขยายใน Xcode จำเป็นต้องเพิ่ม target ใหม่ประเภท Notification Content Extension Xcode จะสร้าง MainInterface.storyboard โดยอัตโนมัติพร้อมคอนโทรลเลอร์ที่สืบทอดจาก UIViewController และใช้งาน UNNotificationContentExtension
ใน Xcode ให้เลือก File → New → Target → Notification Content Extension ระบุชื่อส่วนขยาย ภาษา (Swift หรือ Objective-C) และตรวจสอบว่าโปรเจกต์เชื่อมต่อกับทีมพัฒนากลุ่มเดียวกัน หลังจากสร้าง target จะปรากฏโฟลเดอร์ที่มีสามไฟล์: MainInterface.storyboard, Info.plist และไฟล์คอนโทรลเลอร์
ใน Info.plist ของส่วนขยาย จำเป็นต้องระบุอาร์เรย์ NSExtensionAttributes พร้อมคีย์ UNNotificationExtensionCategory อาร์เรย์นี้ประกอบด้วยตัวระบุของหมวดหมู่การแจ้งเตือนที่ส่วนขยายจะทำงาน คีย์เสริม UNNotificationExtensionInitialContentSizeRatio กำหนดอัตราส่วนภาพเริ่มต้นของอินเทอร์เฟซที่กำหนดเองสำหรับการวางตำแหน่งที่ถูกต้อง
แนะนำให้รักษาสถาปัตยกรรมที่สะอาดใน target ส่วนขยาย: โฟลเดอร์แยกสำหรับคอนโทรลเลอร์ โฟลเดอร์แยกสำหรับ View ที่กำหนดเอง เนื่องจากส่วนขยายเป็นไบนารีแยกต่างหาก โค้ดของแอปพลิเคชันหลักจึงไม่สามารถเข้าถึงได้โดยตรง สำหรับการแชร์โค้ด ให้สร้าง framework แยกต่างหากหรือใช้ App Group สำหรับข้อมูล
UNNotificationContentExtension คือโปรโตคอลที่คอนโทรลเลอร์ใน Notification Content Extension ต้องใช้งาน เมธอดที่จำเป็นเพียงอย่างเดียวคือ didReceive(_:with:) ซึ่งถูกเรียกเมื่อได้รับการแจ้งเตือน คอนโทรลเลอร์ได้รับการแจ้งเตือนและคอนโทรลเลอร์มุมมองที่พร้อมซึ่งต้องอัปเดตด้วยข้อมูล
คอนโทรลเลอร์ส่วนขยายต้องสืบทอดจาก UIViewController และใช้งาน UNNotificationContentExtension Storyboard หรือ xib จะเชื่อมโยงกับคอนโทรลเลอร์นี้ เมื่อได้รับการแจ้งเตือน เมธอด didReceive จะส่งเนื้อหาและคอนโทรลเลอร์จะอัปเดตมุมมองของมัน
import UIKit
import UserNotifications
import UserNotificationsUI
class CustomNotificationViewController: UIViewController {
@IBOutlet var titleLabel: UILabel!
@IBOutlet var customImageView: UIImageView!
func didReceive(
notification: UNNotification
) {
let content = notification.request.content
titleLabel.text = content.title
loadAttachment(content.attachments.first)
}
private func loadAttachment(attachment: UNNotificationAttachment?) {
guard let url = attachment?.URL else { return }
if let image = UIImage(contentsOfFile: url.path) {
customImageView.image = image
}
}
}
extension CustomNotificationViewController: UNNotificationContentExtension {
func didReceive(
notification: UNNotification
) {
didReceive(notification: notification)
}
}
ระบบกำหนดขนาดของอินเทอร์เฟซที่กำหนดเองตามคีย์ UNNotificationExtensionInitialContentSizeRatio ใน Info.plist และเนื้อหาปัจจุบัน แนะนำให้ตั้งค่าคีย์นี้เป็น 0.1 สำหรับขนาดเริ่มต้นขั้นต่ำ จากนั้นเปลี่ยนขนาดผ่าน preferredContentSize หลังจากโหลดเนื้อหา
Notification Content Extension ให้อิสระอย่างเต็มที่ในการสร้างอินเทอร์เฟซ สามารถใช้ส่วนประกอบ UIKit ใดๆ ได้: UITableView, MKMapView, WKWebView, UIStackView อย่างไรก็ตาม สิ่งสำคัญคือต้องพิจารณาพื้นที่จำกัดของการแจ้งเตือนและปรับประสิทธิภาพให้เหมาะสม
หนึ่งในสถานการณ์ยอดนิยมคือการแสดงแผนที่พร้อมตำแหน่งที่ตั้ง สำหรับสิ่งนี้ ให้เพิ่ม MKMapView ใน Storyboard ของส่วนขยาย และคอนโทรลเลอร์ส่งพิกัดจากเนื้อหาการแจ้งเตือน อย่าลืมเพิ่ม MapKit ใน target ของส่วนขยาย เมื่อใช้แผนที่ ให้พิจารณาข้อจำกัดหน่วยความจำของส่วนขยาย — การโหลดไทล์ที่ซับซ้อนอาจเกินทรัพยากรที่มีอยู่
Notification Content Extension รองรับแอนิเมชัน UIView รวมถึงการปรับขนาด การเคลื่อนย้าย และความโปร่งใสขององค์ประกอบ เมื่อเข้าสู่โหมดขยายของการแจ้งเตือน สามารถเริ่มแอนิเมชันการปรากฏของเนื้อหาได้ แอนิเมชัน ควรสั้น (สูงสุด 0.5 วินาที) และไม่รบกวนการโต้ตอบของผู้ใช้กับการแจ้งเตือน หลีกเลี่ยงแอนิเมชันที่ไม่สิ้นสุด — ใช้พลังงานแบตเตอรี่และลดประสิทธิภาพ
เนื่องจากส่วนขยายเป็น UIViewController เต็มรูปแบบ คุณสามารถเพิ่มท่าทางและตัวจัดการการแตะได้ ท่าทาง UIKit (UITapGestureRecognizer, UIButton) ทำงานได้ตามปกติ สำหรับการดำเนินการที่ต้องการเปิดแอปพลิเคชัน ให้ใช้ตัวแทนของส่วนขยายหรือ userNotificationCenter องค์ประกอบแบบโต้ตอบ ควรมีขนาดใหญ่พอสำหรับการแตะที่สะดวกสบายในพื้นที่จำกัด — ขนาดเป้าหมายสัมผัสขั้นต่ำคือ 44x44 จุดตามคำแนะนำของ Apple
เนื้อหาสื่อ คือความสามารถหลักของ Notification Content Extension การแจ้งเตือนสามารถมีรูปภาพ GIF เสียง และวิดีโอที่แสดงในอินเทอร์เฟซที่กำหนดเอง ไฟล์แนบถูกส่งผ่าน UNNotificationAttachment ซึ่งสามารถเพิ่มโดยเซิร์ฟเวอร์ผ่าน payload หรือโดย Notification Service Extension หลังจากดาวน์โหลด รูปแบบที่รองรับคือ JPEG, PNG, MPEG-4 และ MP3
ในการแสดงรูปภาพ เพียงรับ UNNotificationAttachment จากเนื้อหาการแจ้งเตือนและโหลดจาก URL ในเครื่อง โปรดจำไว้ว่าส่วนขยายสามารถเข้าถึงได้เฉพาะไฟล์ในเครื่องเท่านั้น — ทรัพยากรระยะไกลต้องถูกดาวน์โหลดล่วงหน้าโดย Service Extension ขนาดสูงสุดของไฟล์แนบ — 50 MB บน iOS 15+ ขีดจำกัดเปลี่ยนแปลงในแต่ละการอัปเดตถัดไป เพื่อรองรับรูปภาพหลายรายการ ให้ใช้ UNNotificationAttachment พร้อมตัวระบุที่แตกต่างกันและแสดงผ่าน UIPageViewController
ในการแสดงรูปภาพในอินเทอร์เฟซที่กำหนดเอง ส่วนขยายจะรับ UNNotificationAttachment จากเนื้อหาการแจ้งเตือนและโหลดจาก URL ในเครื่อง ไฟล์แนบต้องถูกดาวน์โหลดล่วงหน้าโดย Notification Service Extension — Content Extension ไม่สามารถเข้าถึงเครือข่ายได้ ขนาดสูงสุดของไฟล์แนบสื่อ — 50 MB บน iOS 15+ ในเวอร์ชันก่อนหน้าขีดจำกัดคือ 10 MB ส่วนขยายต้องจัดการการไม่มีไฟล์แนบอย่างถูกต้องและแสดงอินเทอร์เฟซสำรอง สำหรับการโหลดรูปภาพความละเอียดต่ำล่วงหน้า ให้ใช้เวอร์ชันรูปขนาดย่อที่สร้างโดย Service Extension ก่อนการแนบ
iOS รองรับการเล่นวิดีโอใน Notification Content Extension ผ่าน AVPlayerLayer ส่วนขยายสามารถแสดงเครื่องเล่นวิดีโอพร้อมปุ่มควบคุมภายในข้อแจ้งเตือนได้ ซึ่งมีประโยชน์โดยเฉพาะสำหรับแอปพลิเคชันเฝ้าระวัง การสตรีม หรือการแสดงตัวอย่างเนื้อหา การเล่นอัตโนมัติแบบไม่มีเสียงจะได้รับอนุญาตหากผู้ใช้คาดหวังเนื้อหาสื่อในการแจ้งเตือนนี้ เมื่อใช้งานเครื่องเล่นวิดีโอ ให้เพิ่มองค์ประกอบควบคุม: เล่น/หยุดชั่วคราว แถบความคืบหน้า และปุ่มปิด ตรวจสอบให้แน่ใจว่าวิดีโอไม่เริ่มโดยอัตโนมัติพร้อมเสียง — ซึ่งละเมิดคำแนะนำของ Apple เกี่ยวกับประสบการณ์ผู้ใช้ สำหรับสไลด์โชว์ของรูปภาพหลายรายการ ให้ใช้การเปลี่ยนภาพแบบแอนิเมชันระหว่างรูปภาพผ่าน UIView.transition พร้อมตัวเลือกการเปลี่ยนภาพแบบพลิกหน้า
Notification Content Extension ทำงานในสภาพแวดล้อมที่จำกัดด้วยขีดจำกัดหน่วยความจำประมาณ 50 MB เพื่อเพิ่มประสิทธิภาพ ให้ใช้การโหลดรูปภาพแบบขี้เกียจ หลีกเลี่ยงการคำนวณหนักบนเธรดหลัก และใช้ Auto Layout พร้อมข้อจำกัดที่เรียบง่าย ดำเนินการหนัก เช่น การประมวลผลรูปภาพหรือการแยกวิเคราะห์ข้อมูลในคิวพื้นหลัง (DispatchQueue.global) หากเกินขีดจำกัดหน่วยความจำ ระบบจะยุติส่วนขยายและผู้ใช้จะเห็นการแจ้งเตือนมาตรฐาน แนะนำให้โปรไฟล์ส่วนขยายผ่าน Instruments (Allocations และ Time Profiler) ก่อนเผยแพร่ รวมถึงตรวจสอบการใช้หน่วยความจำบนอุปกรณ์จริงที่มี iOS เวอร์ชันต่างๆ
คำถามที่พบบ่อย
ได้ ตั้งแต่ iOS 16 Notification Content Extension รองรับ SwiftUI ผ่าน UIHostingController อย่างไรก็ตาม UIKit ยังคงเป็นตัวเลือกที่เสถียรกว่าสำหรับอินเทอร์เฟซที่ซับซ้อนเนื่องจากการรองรับ SwiftUI ในส่วนขยายมีจำกัด
ตรวจสอบว่า categoryIdentifier ใน payload ของการแจ้งเตือนตรงกับ UNNotificationExtensionCategory ใน Info.plist ของส่วนขยาย นอกจากนี้ตรวจสอบให้แน่ใจว่าส่วนขยายถูกเพิ่มใน target ของแอปหลักและได้รับการลงนามอย่างถูกต้อง
ใช้ App Group — พื้นที่จัดเก็บร่วมกัน (UserDefaults suite) หรือคอนเทนเนอร์ไฟล์ แอปพลิเคชันหลักและส่วนขยายต้องอยู่ในกลุ่มนักพัฒนากลุ่มเดียวกันและเปิดใช้งานความสามารถ App Groups
ใช้เมธอด didReceive(_:with:) with UNNotificationContentExtensionMediaPlayPauseButtonType สำหรับควบคุมสื่อหรือขอการอัปเดตผ่านตัวแทน การอัปเดตเนื้อหาทั้งหมดโดยไม่มีการแจ้งเตือนใหม่ไม่สามารถทำได้
เลือก target ของส่วนขยายใน Xcode และเรียกใช้บนเครื่องจำลอง ใช้ lldb และจุดเบรกเหมือนในแอปพลิเคชันปกติ สำหรับการทดสอบ ให้ส่งการแจ้งเตือน push ผ่าน Firebase Console หรือในเครื่องผ่าน Pusher
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม