Notification Permission คือสิทธิ์ที่จำเป็นสำหรับแอปในการส่งการแจ้งเตือนแบบพุชและการแจ้งเตือนภายในเครื่องไปยังผู้ใช้ ตั้งแต่ Android 13 และ iOS 12 เป็นต้นไป แอปจำเป็นต้องขอสิทธิ์นี้ในขณะรันไทม์ผ่านไดอะล็อกของระบบ ตามข้อมูลจาก Android Developers, 2024 หากไม่ได้รับความยินยอมอย่างชัดแจ้งจากผู้ใช้ แอปจะไม่สามารถแสดงการแจ้งเตือนบนอุปกรณ์ที่ใช้ Android 13 ขึ้นไปได้
ประเด็นสำคัญ
Notification Permission คือสิทธิ์ของระบบที่ควบคุมความสามารถของแอปในการส่งการแจ้งเตือนไปยังผู้ใช้ ก่อน Android 13 แอปทั้งหมดสามารถแสดงการแจ้งเตือนได้โดยไม่ต้องขอ — เพียงแค่ประกาศสิทธิ์ในไฟล์ Manifest ก็เพียงพอ อย่างไรก็ตาม ด้วยการเพิ่มขึ้นของสแปมและการแจ้งเตือนที่รบกวน Google ได้นำการขอแบบบังคับในขณะรันไทม์มาใช้ ซึ่งคล้ายกับ iOS
บน iOS สิทธิ์การแจ้งเตือนเป็นสิ่งบังคับตั้งแต่ iOS 8 และเริ่มจาก iOS 12 ได้มีการแจ้งเตือนชั่วคราว (Provisional Notifications) — การแจ้งเตือนแบบเงียบที่ส่งโดยไม่มีเสียงและแสดงในศูนย์การแจ้งเตือนโดยไม่ต้องขออย่างชัดแจ้ง การแจ้งเตือนชั่วคราว ช่วยให้นักพัฒนาสามารถแสดงคุณค่าของการแจ้งเตือนให้ผู้ใช้เห็นก่อนที่จะขอสิทธิ์เต็มรูปแบบ
ตามข้อมูลจาก Localytics (2024) ผู้ใช้ iOS 61% และผู้ใช้ Android 55% ยอมรับการรับการแจ้งเตือนแบบพุชหลังจากมีการขอ อัตราการอนุมัติขึ้นอยู่กับบริบทของการขอโดยตรง: แอปที่ขอสิทธิ์หลังจากปฏิสัมพันธ์ที่มีคุณค่าครั้งแรกได้รับการอนุมัติมากกว่าแอปที่ขอในการเปิดครั้งแรกถึง 40%
วิวัฒนาการของสิทธิ์การแจ้งเตือน แสดงให้เห็นว่าแพลตฟอร์มได้จำกัดการเข้าถึงของแอปไปยังช่องทางการสื่อสารนี้อย่างค่อยเป็นค่อยไปอย่างไร การทำความเข้าใจวิวัฒนาการนี้ช่วยให้นักพัฒนาจัดการกับเวอร์ชันระบบปฏิบัติการต่างๆ ได้อย่างถูกต้อง
ก่อน Android 13 (2022) แอปใด ๆ ก็สามารถแสดงการแจ้งเตือนได้โดยไม่ต้องได้รับความยินยอมจากผู้ใช้ Android 8.0 (2017) เปิดตัวช่องทางการแจ้งเตือน Android 12 (2021) เพิ่มการบล็อกอัตโนมัติสำหรับการแจ้งเตือนที่รบกวน และในที่สุด Android 13 ก็ทำให้การขอ POST_NOTIFICATIONS ในขณะรันไทม์เป็นสิ่งบังคับ สำหรับแอปที่มี targetSdkVersion ต่ำกว่า 33 ระบบจะให้สิทธิ์โดยอัตโนมัติ แต่ Google Play กำหนดให้อัปเดต targetSdkVersion เป็น 33+ ตั้งแต่เดือนสิงหาคม 2023
iOS 8 (2014) เปิดตัวการขอสิทธิ์แบบบังคับผ่าน UIUserNotificationSettings iOS 10 (2016) นำเสนอ UNUserNotificationCenter ที่รองรับการแจ้งเตือนแบบสมบูรณ์ iOS 12 (2018) เพิ่มการแจ้งเตือนชั่วคราวและการแจ้งเตือนแบบกลุ่ม iOS 15 (2021) เปิดตัวโหมดโฟกัส ซึ่งสามารถบล็อกการแจ้งเตือนได้โดยไม่ขึ้นกับสิทธิ์ของแอป App Tracking Transparency (iOS 14.5) ไม่เกี่ยวข้องกับการแจ้งเตือน แต่ก็ส่งผลต่อวัฒนธรรมโดยรวมของการขอสิทธิ์เช่นกัน
ปัจจุบัน ทั้งสองแพลตฟอร์มต้องการการขอ Notification Permission ในขณะรันไทม์ นักพัฒนาไม่สามารถพึ่งพาการเปิดใช้งานการแจ้งเตือนอัตโนมัติได้อีกต่อไป ผู้ใช้ควบคุมได้อย่างสมบูรณ์ว่าแอปใดสามารถแจ้งเตือนพวกเขาได้ ช่องทางการแจ้งเตือน บน Android และหมวดหมู่การแจ้งเตือนบน iOS ช่วยให้ผู้ใช้ปรับแต่งประเภทของการแจ้งเตือนที่ได้รับได้อย่างละเอียด
Notification Permission บน Android เปิดใช้งานผ่านสิทธิ์ POST_NOTIFICATIONS ที่ประกาศใน Manifest ตามด้วยการขอในขณะรันไทม์สำหรับ Android 13+
สำหรับ Android 13+ จำเป็นต้องประกาศสิทธิ์ POST_NOTIFICATIONS ใน AndroidManifest.xml สำหรับความเข้ากันได้ย้อนหลังกับ Android 12 และต่ำกว่า ระบบจะให้สิทธิ์โดยอัตโนมัติ — ไม่จำเป็นต้องดำเนินการเพิ่มเติม
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
การขอสิทธิ์ POST_NOTIFICATIONS ดำเนินการผ่าน Activity Result API สิ่งสำคัญคือต้องตรวจสอบเวอร์ชัน SDK: บน Android 12 และต่ำกว่า ไม่จำเป็นต้องขอ — ถือว่าสิทธิ์ได้รับการให้โดยอัตโนมัติ
private val notificationPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
createNotificationChannel()
showPushNotification()
} else {
logPermissionDenied()
}
}
fun requestNotificationAccess() {
if (Build.version.SDK_INT <= Build.VERSION_CODES.S_V2) {
// Android 12 และต่ำกว่า — ให้สิทธิ์โดยอัตโนมัติ
showNotification()
return
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
showNotification()
} else {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
บน Android 8.0+ แอปต้องสร้างช่องทางการแจ้งเตือนผ่าน NotificationChannel ก่อนส่งการแจ้งเตือนครั้งแรก ช่องมีระดับความสำคัญตั้งแต่ IMPORTANCE_NONE ถึง IMPORTANCE_HIGH ซึ่งกำหนดว่าการแจ้งเตือนจะแสดงพร้อมเสียงและเป็นแบนเนอร์หรือไม่ หากผู้ใช้ปิดการแจ้งเตือนสำหรับแอปแล้ว ช่องใหม่จะไม่มีผลจนกว่าจะเปิดใช้งานอีกครั้งในการตั้งค่า ขอแนะนำให้สร้างช่องแยกต่างหากสำหรับการแจ้งเตือนประเภทต่างๆ: ข้อความ โฆษณา เหตุการณ์ของระบบ
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID_MESSAGES,
"ข้อความ",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "การแจ้งเตือนข้อความใหม่"
enableVibration = true
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
Notification Permission บน iOS ขอผ่าน UNUserNotificationCenter Apple แนะนำวิธีสองขั้นตอน: ขั้นแรกขอการแจ้งเตือนชั่วคราว จากนั้นหลังจากแสดงคุณค่าแล้ว ขอสิทธิ์เต็มรูปแบบ
การแจ้งเตือนชั่วคราวคือการแจ้งเตือนแบบเงียบที่ปรากฏในศูนย์การแจ้งเตือนโดยไม่มีเสียงหรือแบนเนอร์ ไม่จำเป็นต้องได้รับความยินยอมอย่างชัดแจ้งจากผู้ใช้ และช่วยให้แอปแสดงคุณค่าของการแจ้งเตือนก่อนการขอเต็มรูปแบบ หลังจากได้รับการแจ้งเตือนชั่วคราวหลายครั้ง ผู้ใช้สามารถเปิดการแจ้งเตือนเต็มรูปแบบผ่านเมนูภายในตัวการแจ้งเตือนเอง
import UserNotifications
func requestNotificationPermission() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
if let error = error {
print("Notification error: \(error.localizedDescription)")
return
}
if granted {
registerForRemoteNotifications()
} else {
handleDeniedPermission()
}
}
}
func requestProvisionalOnly() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.provisional, .alert, .badge, .sound]) { granted, error in
// ชั่วคราว — ผู้ใช้ไม่เห็นไดอะล็อก
// การแจ้งเตือนมาถึงอย่างเงียบเชียบในศูนย์การแจ้งเตือน
registerForRemoteNotifications()
}
}
สถานะ Notification Permission ปัจจุบันบน iOS สามารถรับได้ผ่าน UNUserNotificationCenter.current().getNotificationSettings สถานะ .authorized, .denied, .provisional หรือ .notDetermined ช่วยให้แอปเลือกพฤติกรรมที่ถูกต้อง หลังจากการปฏิเสธครั้งแรก ไดอะล็อกของระบบจะไม่แสดงอีก — ต้องนำทางผู้ใช้ไปยังการตั้งค่าผ่าน UIApplication.openSettingsURLString Apple ยังแนะนำให้จัดการสถานะ .ephemeral (iOS 17+) ซึ่งให้การแจ้งเตือนชั่วคราวสำหรับสถานการณ์เฉพาะ
แนวทางปฏิบัติที่ดีที่สุด สำหรับการขอ Notification Permission มีเป้าหมายเพื่อเพิ่มอัตราการอนุมัติและลดการสูญเสียผู้ใช้ การขอที่ไม่ถูกต้องไม่เพียงแต่จะทำให้แอปสูญเสียความสามารถในการส่งการแจ้งเตือน แต่ยังอาจนำไปสู่การถอนการติดตั้งแอปได้
รูปแบบที่ไม่ถูกต้องที่พบบ่อยที่สุดคือการขอ Notification Permission ในการเปิดแอปครั้งแรก ผู้ใช้ยังไม่เข้าใจคุณค่าของแอปและมีแนวโน้มสูงที่จะปฏิเสธ ช่วงเวลาที่เหมาะสมที่สุดคือหลังจากที่ผู้ใช้ดำเนินการที่มีคุณค่าครั้งแรก: สั่งซื้อ ส่งข้อความ สมัครรับอัปเดต การแจ้งหลังสร้างคุณค่า ช่วยเพิ่มอัตราการอนุมัติเป็น 65-75%
ก่อนไดอะล็อกของระบบ ให้แสดงหน้าจอของคุณเองพร้อมตัวอย่างการแจ้งเตือนที่ผู้ใช้จะได้รับ แสดงแบบจำลองของการแจ้งเตือนในอนาคตพร้อมข้อความและไอคอน หากผู้ใช้เห็นว่าการแจ้งเตือนจะมีประโยชน์และไม่รบกวน พวกเขามีแนวโน้มที่จะยินยอมมากขึ้น ตัวอย่างการแจ้งเตือน บนหน้าจอก่อนขอสิทธิ์เป็นเทคนิคที่มีประสิทธิภาพซึ่งเพิ่มอัตราการแปลงเป็น 35-50%
การขอการแจ้งเตือนชั่วคราวบน iOS อย่างจริงจังช่วยให้ส่งการแจ้งเตือนได้โดยไม่ต้องได้รับความยินยอมอย่างชัดแจ้งจากผู้ใช้ หากผู้ใช้เห็นคุณค่าในการแจ้งเตือนเหล่านี้ พวกเขาสามารถเปิดการแจ้งเตือนเต็มรูปแบบผ่านเมนูบริบทของการแจ้งเตือน Apple แนะนำ วิธีการนี้สำหรับแอปข่าว แอปสภาพอากาศ และบริการอื่น ๆ ที่การแจ้งเตือนเป็นข้อมูล ไม่ใช่ธุรกรรม ตามข้อมูลจาก Apple WWDC 2024 วิธีการนี้เพิ่มอัตราการอนุมัติเต็มรูปแบบ 20-30%
คำถามที่พบบ่อย
หลังจากการปฏิเสธ ไดอะล็อกของระบบจะไม่แสดงอีก วิธีเดียวในการเปิดการแจ้งเตือนคือนำทางผู้ใช้ไปยังการตั้งค่าระบบผ่าน Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) บน Android หรือ UIApplication.openSettingsURLString บน iOS แสดงหน้าจอพร้อมคำแนะนำและปุ่มเพื่อดำเนินการต่อ
บน Android 12 และต่ำกว่า ไม่จำเป็นต้องใช้ Notification Permission — แอปทั้งหมดสามารถส่งการแจ้งเตือนได้โดยไม่ต้องขอ อย่างไรก็ตาม ผู้ใช้สามารถปิดการแจ้งเตือนได้ตลอดเวลาผ่านการตั้งค่าระบบ ตั้งแต่ Android 13 เป็นต้นไป การขอในขณะรันไทม์เป็นสิ่งบังคับสำหรับ targetSdkVersion 33+
NotificationChannel คือหมวดหมู่การแจ้งเตือนที่เปิดตัวใน Android 8.0 แต่ละช่องมีชื่อ คำอธิบาย ระดับความสำคัญ และกลุ่ม ผู้ใช้สามารถปิดช่องแต่ละช่องได้โดยไม่ต้องปิดการแจ้งเตือนทั้งหมดของแอป ตัวอย่างเช่น ช่อง “ข้อความใหม่” และช่อง “จดหมายข่าวโปรโมชัน” สามารถกำหนดค่าได้แตกต่างกัน
บน Android 13+ หากไม่มี POST_NOTIFICATIONS การเรียก NotificationManager.notify ใด ๆ จะถูกละเว้นโดยระบบ บน iOS หากไม่มีสิทธิ์ UNUserNotificationCenter การแจ้งเตือนจะไม่ถูกส่ง ข้อยกเว้น: Provisional บน iOS (ไม่มีเสียง เฉพาะในศูนย์การแจ้งเตือน) และ Android 12- (ไม่ต้องการสิทธิ์)
บน Android ให้ใช้ NotificationManagerCompat.areNotificationsEnabled() บน iOS ให้เรียก UNUserNotificationCenter.current().getNotificationSettings และตรวจสอบคุณสมบัติ authorizationStatus สำหรับ Android ให้ตรวจสอบความสำคัญของช่องเพิ่มเติม: NotificationChannel.getImportance() ต้องไม่เป็น IMPORTANCE_NONE
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม