Notification Category (หมวดหมู่การแจ้งเตือน) เป็นกลไกของ iOS สำหรับจัดกลุ่มการแจ้งเตือนแบบพุชตามประเภทและแนบการดำเนินการที่กำหนดเองไปด้วย หมวดหมู่จะกำหนดว่าปุ่มใดจะแสดงเมื่อใช้ 3D Touch หรือการกดค้างบนการแจ้งเตือน รวมถึงวิธีที่ระบบประมวลผลการแจ้งเตือนขาเข้าประเภทนี้ ตาม เอกสารนักพัฒนา Apple UNNotificationCategory จะถูกลงทะเบียนใน UNUserNotificationCenter และเชื่อมโยงกับการแจ้งเตือนผ่านฟิลด์ category ในเพย์โหลด APNS
ประเด็นสำคัญ
Notification Category เป็นฟีเจอร์ iOS (ตั้งแต่เวอร์ชัน 8.0) ที่ช่วยให้นักพัฒนาสามารถจำแนกการแจ้งเตือนแบบพุชและเพิ่มการดำเนินการแบบโต้ตอบเข้าไป เมื่อผู้ใช้ได้รับการแจ้งเตือนและกดแรงๆ (3D Touch) หรือกดค้าง ปุ่มที่กำหนดโดยหมวดหมู่จะปรากฏขึ้น ซึ่งทำให้การแจ้งเตือนโต้ตอบได้และช่วยให้ผู้ใช้ดำเนินการได้โดยไม่ต้องเปิดแอป
หมวดหมู่ถูกลงทะเบียนผ่านออบเจกต์ UNNotificationCategory ซึ่งประกอบด้วยตัวระบุ อาร์เรย์ของการดำเนินการ และพารามิเตอร์การแสดงผลที่เป็นตัวเลือกระบบใช้ตัวระบุหมวดหมู่จากเพย์โหลด APNS เพื่อค้นหาหมวดหมู่ที่ลงทะเบียนและแสดงปุ่มที่เกี่ยวข้อง
ไม่เหมือนกับ Android Notification Channel, iOS Category ไม่ได้จัดการความสำคัญ เสียง หรือการสั่น วัตถุประสงค์เดียวของมันคือการให้ ความสามารถแบบโต้ตอบ สำหรับการแจ้งเตือน: ปุ่มตอบกลับ ยืนยัน ยกเลิก หรือป้อนข้อความ
หมวดหมู่ ไม่จำเป็น สำหรับการแสดงการแจ้งเตือนแบบพุชบน iOS การแจ้งเตือนจะปรากฏอยู่ดี — มีปุ่มหากลงทะเบียนหมวดหมู่ หรือไม่มีปุ่ม หมวดหมู่จำเป็นสำหรับการเพิ่มความโต้ตอบให้กับการแจ้งเตือนเท่านั้น
กลไกหมวดหมู่ประกอบด้วยสี่ขั้นตอน: การลงทะเบียนหมวดหมู่บนไคลเอนต์ การส่งเพย์โหลด APNS พร้อมหมวดหมู่ ระบบจดจำหมวดหมู่ และการจัดการการดำเนินการของผู้ใช้
การดำเนินการในหมวดหมู่สามารถมีสองประเภท: foreground (เปิดแอป) และ background (ทำงานในพื้นหลัง) สำหรับการดำเนินการในพื้นหลัง แอปจะมีเวลาจำกัด (ประมาณ 30 วินาที) ในการประมวลผลใน UNNotificationActionHandler
UNNotificationCategory รองรับหลายตัวเลือกผ่านพารามิเตอร์ options: customDismissAction — รับเหตุการณ์เมื่อปัดการแจ้งเตือนออก, allowInCarPlay — แสดงการดำเนินการใน CarPlay, hiddenPreviewsBodyPlaceholder — ข้อความตัวยึดตำแหน่งที่กำหนดเองสำหรับการแสดงตัวอย่างที่ซ่อนอยู่
iOS มีการดำเนินการสองประเภทสำหรับหมวดหมู่การแจ้งเตือน แต่ละประเภทมีวัตถุประสงค์และวิธีการโต้ตอบกับผู้ใช้ของตนเอง
| ประเภท | คลาส | คำอธิบาย | ตัวอย่าง |
|---|---|---|---|
| การดำเนินการแบบง่าย | UNNotificationAction | ปุ่มที่มีชื่อและตัวเลือก (destructive, foreground, authenticationRequired) | “ลบ”, “ดู” |
| การป้อนข้อความ | UNTextInputAction | ปุ่มที่เปิดฟิลด์ป้อนข้อความพร้อมตัวยึดตำแหน่ง | “ตอบกลับ”, “แสดงความคิดเห็น” |
UNTextInputAction เป็นฟีเจอร์เฉพาะของ iOS เมื่อผู้ใช้แตะปุ่ม “ตอบกลับ” ระบบจะแสดงฟิลด์ข้อความที่ผู้ใช้พิมพ์คำตอบ ข้อความที่ป้อนจะถูกส่งไปยังตัวแทนพร้อมกับตัวระบุการดำเนินการ ซึ่งช่วยให้สามารถตอบกลับอย่างรวดเร็วโดยไม่ต้องเปิดแอป
ตัวเลือกการดำเนินการ: options.authenticationRequired — ต้องการปลดล็อกอุปกรณ์, options.destructive — เน้นปุ่มเป็นสีแดง (สำหรับการดำเนินการที่อันตราย), options.foreground — เปิดแอปหลังจากแตะ
หมวดหมู่จะถูกลงทะเบียนเมื่อเปิดแอป โดยปกติในเมธอด didFinishLaunchingWithOptions การลงทะเบียนทำผ่าน UNUserNotificationCenter หลังจากขออนุญาตการแจ้งเตือน หมวดหมู่สามารถอัปเดตได้ทุกครั้งที่เปิดแอป — เวอร์ชันเก่าจะถูกแทนที่ด้วยเวอร์ชันใหม่
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "ตอบกลับ",
options: [.foreground],
textInputButtonTitle: "ส่ง",
textInputPlaceholder: "ป้อนข้อความ..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "ลบ",
options: [.destructive]
)
let messageCategory = UNNotificationCategory(
identifier: "message",
actions: [replyAction, deleteAction],
intentIdentifiers: [],
options: [.customDismissAction]
)
UNUserNotificationCenter.current()
.setNotificationCategories([messageCategory])
}
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
UNUserNotificationCenter.current().delegate = self
registerNotificationCategories()
return true
}
}
หลังจากลงทะเบียนหมวดหมู่แล้ว การแจ้งเตือนใดๆ ที่มี category = “message” ในเพย์โหลด APNS จะแสดงปุ่ม “ตอบกลับ” และ “ลบ” การจัดการการแตะเกิดขึ้นใน userNotificationCenter:didReceive response โดยที่ actionIdentifier กำหนดว่าปุ่มใดถูกกด
เมื่อผู้ใช้แตะปุ่มหมวดหมู่ iOS จะเรียก UNUserNotificationCenterDelegate พร้อมด้วยออบเจกต์ UNNotificationResponse response.actionIdentifier ประกอบด้วยตัวระบุของปุ่มที่ถูกแตะ และ response.notification.request.content.userInfo ประกอบด้วยข้อมูลที่กำหนดเองจากเพย์โหลด
นักพัฒนาที่คุ้นเคยกับช่องทางการแจ้งเตือนของ Android มักสับสนกับหมวดหมู่การแจ้งเตือนของ iOS แม้จะมีชื่อคล้ายกัน แต่กลไกเหล่านี้แก้ปัญหาที่แตกต่างกันและทำงานต่างกัน
ทั้งสองแพลตฟอร์มสามารถรวมกลไกทั้งสองได้: บน Android การแจ้งเตือนสามารถเป็นของช่องทางที่มีการดำเนินการจาก NotificationCompat ในขณะที่บน iOS หมวดหมู่จะเสริมช่องทาง ซึ่งใน iOS เรียกว่า thread-id และใช้สำหรับจัดกลุ่มการแจ้งเตือนในศูนย์การแจ้งเตือน
เพื่อให้การแจ้งเตือนแสดงพร้อมปุ่มหมวดหมู่ เซิร์ฟเวอร์ต้องรวมคีย์ category ในเพย์โหลด APNS หากไม่มีคีย์นี้ ระบบจะไม่รู้ว่าจะใช้หมวดหมู่ใดกับการแจ้งเตือน
{
"aps": {
"alert": {
"title": "ข้อความใหม่",
"body": "อันนา: สวัสดี! สบายดีไหม?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
คีย์ category ต้องตรงกับตัวระบุที่ลงทะเบียนผ่าน setNotificationCategories บนไคลเอนต์อย่างแม่นยำ ตัวพิมพ์ใหญ่เล็กมีความสำคัญ — “message” และ “Message” ถือเป็นหมวดหมู่ที่แตกต่างกัน หากไม่พบหมวดหมู่ การแจ้งเตือนจะปรากฏโดยไม่มีปุ่ม โดยไม่มีข้อผิดพลาดในบันทึก
หากเซิร์ฟเวอร์ส่งการแจ้งเตือนที่มีหมวดหมู่ที่ไม่ได้ลงทะเบียนบนไคลเอนต์ iOS จะละเว้นหมวดหมู่และแสดงการแจ้งเตือน โดยไม่มีปุ่ม ข้อผิดพลาดจะไม่ถูกบันทึกและแอปไม่ทราบถึงความไม่ตรงกัน ขอแนะนำให้ซิงโครไนซ์รายการหมวดหมู่ระหว่างเซิร์ฟเวอร์และไคลเอนต์
เมื่อออกแบบหมวดหมู่การแจ้งเตือนใน iOS ให้ปฏิบัติตามหลักการ หนึ่งหมวดหมู่ — หนึ่งสถานการณ์ แต่ละหมวดหมู่ควรสอดคล้องกับประเภทการโต้ตอบที่เฉพาะเจาะจง: การตอบกลับข้อความ การยืนยันการดำเนินการ การปฏิเสธคำขอ อย่าผสมสถานการณ์ต่างๆ ในหมวดหมู่เดียว
ใช้ UNTextInputAction สำหรับสถานการณ์ที่ผู้ใช้ต้องป้อนข้อความโดยไม่ต้องเปิดแอป: การตอบกลับข้อความ ความคิดเห็น โน้ตด่วน การดำเนินการแบบข้อความเพิ่มการมีส่วนร่วม — ผู้ใช้ดำเนินการที่มีความหมายในการแตะ 2 ครั้งแทนที่จะเป็น 5+ ครั้งในแอป
สำหรับการดำเนินการที่อันตราย (ลบ บล็อก) ให้ใช้ตัวเลือก destructive iOS จะเน้นปุ่มเหล่านี้เป็นสีแดง เตือนผู้ใช้เกี่ยวกับการไม่สามารถย้อนกลับได้ของการดำเนินการ สำหรับการดำเนินการที่ต้องปลดล็อกอุปกรณ์ (ดูข้อมูลส่วนตัว) ให้ระบุ authenticationRequired
ทดสอบหมวดหมู่บนอุปกรณ์ต่างๆ: บน iPhone ที่มี 3D Touch, บน iPhone ที่ไม่มี 3D Touch (กดค้าง), บน iPad และบน Mac พฤติกรรมของหมวดหมู่อาจแตกต่างกันเล็กน้อยบนแพลตฟอร์ม Apple ที่แตกต่างกัน ให้ความสนใจเป็นพิเศษกับ CarPlay: ปุ่มหมวดหมู่ปรากฏบนหน้าจอรถยนต์และควรออกแบบด้วยข้อความน้อยที่สุดเพื่อความปลอดภัยของผู้ขับขี่
คำถามที่พบบ่อย
ไม่มี ขีดจำกัด — iOS ไม่กำหนดขีดจำกัดจำนวน UNNotificationCategory อย่างไรก็ตาม ในทางปฏิบัติ แนะนำให้ใช้ไม่เกิน 10–15 หมวดหมู่เพื่อไม่ให้ซับซ้อนในการจัดการในตัวแทน แต่ละหมวดหมู่สามารถมีได้สูงสุด 4 การดำเนินการ (ปุ่ม) มากกว่า 4 การดำเนินการจะถูกละเว้นโดยระบบ
ใช้โปรโตคอล UNUserNotificationCenterDelegate และเมธอด didReceive ตรวจสอบ response.actionIdentifier: UNNotificationDismissActionIdentifier — ปัดเพื่อยกเลิก, UNNotificationDefaultActionIdentifier — แตะบนเนื้อหา หรือตัวระบุปุ่มที่กำหนดเองของคุณ สำหรับปุ่มป้อนข้อความ ข้อความสามารถเข้าถึงได้ผ่าน response.userText
Category — กำหนดการดำเนินการแบบโต้ตอบ (ปุ่ม) สำหรับการแจ้งเตือน Thread-id — จัดกลุ่มการแจ้งเตือนในศูนย์การแจ้งเตือนตามหัวข้อ ทั้งสองคีย์ถูกระบุในเพย์โหลด APNS Category และ thread-id ไม่เกี่ยวข้องกัน: การแจ้งเตือนสามารถมีหมวดหมู่แต่ไม่มี thread-id และในทางกลับกัน
ใช่ UNNotificationCategory รองรับบน macOS 10.14+ (Mojave) ในแอปที่ใช้เฟรมเวิร์ก UserNotifications พฤติกรรมของหมวดหมู่บน macOS คล้ายกับ iOS: เมื่อคลิกที่การแจ้งเตือน ปุ่มจะปรากฏขึ้น และการจัดการจะเกิดขึ้นผ่าน UNUserNotificationCenterDelegate
ขอแนะนำ ให้ลงทะเบียนหมวดหมู่ทุกครั้งที่เปิดแอปผ่าน setNotificationCategories ระบบจะแทนที่ชุดหมวดหมู่เก่าด้วยชุดใหม่ในทุกการเรียก หากคุณไม่อัปเดต หมวดหมู่จะคงอยู่ระหว่างการเปิดแอป แต่เมื่อโค้ดเปลี่ยนแปลง หมวดหมู่เก่าอาจทำให้เกิดพฤติกรรมที่ไม่คาดคิด
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม