สิทธิ์รันไทม์ของการแจ้งเตือน

Android 13 (ระดับ API 33) ขึ้นไปรองรับสิทธิ์รันไทม์สำหรับการส่งการแจ้งเตือนที่ไม่ได้รับการยกเว้น (รวมถึงบริการที่ทำงานอยู่เบื้องหน้า (FGS)) จากแอป: POST_NOTIFICATIONS การเปลี่ยนแปลงนี้จะช่วยให้ผู้ใช้มุ่งเน้นไปที่การแจ้งเตือนที่มีความสำคัญต่อตนเองมากที่สุด

เราขอแนะนำอย่างยิ่งให้คุณกำหนดเป้าหมายเป็น Android 13 ขึ้นไปโดยเร็วที่สุดเพื่อรับประโยชน์จากการควบคุมและความยืดหยุ่นเพิ่มเติมของฟีเจอร์นี้ หากยังคงกำหนดเป้าหมายเป็น 12L (ระดับ API 32) หรือต่ำกว่า คุณจะสูญเสียความยืดหยุ่นบางอย่างในการขอสิทธิ์ในบริบทของฟังก์ชันการทำงานของแอป

ประกาศสิทธิ์

หากต้องการขอสิทธิ์การแจ้งเตือนใหม่จากแอป ให้อัปเดตแอปให้กำหนดเป้าหมายเป็น Android 13 และทำตามกระบวนการที่คล้ายกับการขอสิทธิ์รันไทม์อื่นๆ ดังที่แสดงในส่วนต่อไปนี้

สิทธิ์ที่คุณต้องประกาศในไฟล์ Manifest ของแอปจะปรากฏ ในข้อมูลโค้ดต่อไปนี้

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

ความสามารถของแอปขึ้นอยู่กับตัวเลือกของผู้ใช้ในกล่องโต้ตอบสิทธิ์

ในกล่องโต้ตอบนี้ ผู้ใช้จะดำเนินการต่อไปนี้ได้

ส่วนต่อไปนี้อธิบายลักษณะการทำงานของแอปตามการดำเนินการที่ผู้ใช้เลือก

ผู้ใช้เลือก "อนุญาต"

หากผู้ใช้เลือกตัวเลือกอนุญาต แอปของคุณจะทำสิ่งต่อไปนี้ได้

ผู้ใช้เลือก "ไม่อนุญาต"

หากผู้ใช้เลือกตัวเลือกไม่อนุญาต แอปของคุณจะส่ง การแจ้งเตือนไม่ได้ เว้นแต่จะมีคุณสมบัติได้รับการยกเว้น ระบบจะบล็อกช่องทางการแจ้งเตือนทั้งหมด ยกเว้นบางบทบาทที่เฉพาะเจาะจง ซึ่งคล้ายกับลักษณะการทำงานที่เกิดขึ้นเมื่อผู้ใช้ปิดการแจ้งเตือนทั้งหมดสำหรับแอปของคุณด้วยตนเองในการตั้งค่าระบบ

ข้อควรระวัง: หากแอปกำหนดเป้าหมายเป็น 12L หรือต่ำกว่า และผู้ใช้แตะ ไม่อนุญาต แม้เพียงครั้งเดียว ระบบจะไม่แจ้งให้ผู้ใช้อีก จนกว่าจะเกิดเหตุการณ์ใดเหตุการณ์หนึ่งต่อไปนี้

  • ผู้ใช้ถอนการติดตั้งแล้วติดตั้งแอปอีกครั้ง
  • คุณอัปเดตแอปให้กำหนดเป้าหมายเป็น Android 13 ขึ้นไป

ผู้ใช้ปัดกล่องโต้ตอบออก

หากผู้ใช้ปัดกล่องโต้ตอบออก นั่นคือไม่ได้เลือก อนุญาต หรือ ไม่อนุญาต สถานะสิทธิ์การแจ้งเตือนจะไม่ เปลี่ยนแปลง

ผลกระทบต่อแอปที่ติดตั้งใหม่

หากผู้ใช้ติดตั้งแอปของคุณในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป การแจ้งเตือนของแอปจะปิดอยู่โดยค่าเริ่มต้น แอปของคุณต้องรอส่งการแจ้งเตือนหลังจากที่คุณขอสิทธิ์ใหม่และผู้ใช้ให้สิทธิ์ดังกล่าวแก่แอป

เวลาที่กล่องโต้ตอบสิทธิ์ปรากฏขึ้นจะขึ้นอยู่กับเวอร์ชัน SDK เป้าหมายของแอป ดังนี้

  • หากแอปกำหนดเป้าหมายเป็น Android 13 ขึ้นไป แอปของคุณจะควบคุมเวลาที่กล่องโต้ตอบสิทธิ์แสดงได้อย่างสมบูรณ์ ใช้โอกาสนี้อธิบายให้ผู้ใช้ทราบว่าทำไมแอปจึงต้องได้รับสิทธิ์นี้ และกระตุ้นให้ผู้ใช้ให้สิทธิ์
  • หากแอปกำหนดเป้าหมายเป็น 12L (ระดับ API 32) หรือต่ำกว่า ระบบจะแสดงกล่องโต้ตอบสิทธิ์ในครั้งแรกที่แอปเริ่มกิจกรรมหลังจากที่คุณสร้าง ช่องทางการแจ้งเตือน หรือเมื่อแอปเริ่มกิจกรรมแล้วสร้างช่องทางการแจ้งเตือนแรก ซึ่งโดยปกติแล้วจะเกิดขึ้นเมื่อแอปเริ่มต้น ในแอปที่มีกิจกรรมเดียว เช่น แอป Compose ส่วนใหญ่ ระบบจะแสดงกล่องโต้ตอบเมื่อ MainActivity เริ่มต้น

ผลกระทบต่อการอัปเดตแอปที่มีอยู่

ระบบจะให้สิทธิ์การแจ้งเตือนล่วงหน้าแก่แอปที่มีสิทธิ์ทั้งหมดโดยอัตโนมัติเมื่อผู้ใช้อัปเกรดอุปกรณ์เป็น Android 13 ขึ้นไป เพื่อลดการหยุดชะงักที่เกี่ยวข้องกับสิทธิ์การแจ้งเตือน กล่าวคือ แอปเหล่านี้จะส่งการแจ้งเตือนไปยังผู้ใช้ต่อไปได้ และผู้ใช้จะไม่เห็นข้อความแจ้งสิทธิ์รันไทม์

การมีสิทธิ์ให้สิทธิ์ล่วงหน้า

แอปของคุณต้องมีช่องทางการแจ้งเตือนอยู่แล้วและผู้ใช้ต้องไม่ได้ปิดใช้การแจ้งเตือนอย่างชัดแจ้งในอุปกรณ์ที่ใช้ 12L หรือต่ำกว่า จึงจะมี สิทธิ์ ได้รับการให้สิทธิ์ล่วงหน้าโดยอัตโนมัติ

หากผู้ใช้ปิดใช้การแจ้งเตือนสำหรับแอปของคุณในอุปกรณ์ที่ใช้ 12L หรือต่ำกว่า การปฏิเสธดังกล่าวจะยังคงอยู่เมื่ออุปกรณ์อัปเกรดเป็น Android 13 ขึ้นไป

การยกเว้น

ส่วนนี้ประกอบด้วยชุดการแจ้งเตือนและแอปที่ได้รับการยกเว้นจากการเปลี่ยนแปลงลักษณะการทำงานของสิทธิ์การแจ้งเตือน ใน Android 13 (ระดับ API 33) ขึ้นไป หากผู้ใช้ปฏิเสธสิทธิ์การแจ้งเตือน ผู้ใช้จะยังคงเห็นการแจ้งเตือนที่เกี่ยวข้อง กับบริการที่ทำงานอยู่เบื้องหน้าใน ตัวจัดการงาน แต่จะไม่เห็นใน ลิ้นชักการแจ้งเตือน

เซสชันสื่อ

การแจ้งเตือนที่เกี่ยวข้องกับ เซสชันสื่อ จะได้รับการยกเว้นจากการเปลี่ยนแปลงลักษณะการทำงานนี้

แอปที่กำหนดค่าให้จัดการการโทรด้วยตนเอง

หากแอปกำหนดค่าให้จัดการการโทรด้วยตนเอง คุณไม่จำเป็นต้องมีสิทธิ์ POST_NOTIFICATIONS เพื่อให้แอปส่งการแจ้งเตือนที่ ใช้รูปแบบการแจ้งเตือน Notification.CallStyle ได้

ระบบจะถือว่าแอปของคุณกำหนดค่าให้จัดการการโทรด้วยตนเองหากแอปทำสิ่งต่อไปนี้

  1. ประกาศสิทธิ์ MANAGE_OWN_CALLS
  2. ใช้อินเทอร์เฟซ ConnectionService
  3. ลงทะเบียนกับผู้ให้บริการโทรคมนาคมของอุปกรณ์โดยเรียกใช้ registerPhoneAccount()

ทดสอบแอป

คุณสามารถประเมินผลกระทบของสิทธิ์การแจ้งเตือนต่อแอปเมื่อมีการใช้แอปเป็นครั้งแรกในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป ชุดคำสั่ง Android Debug Bridge (ADB) ต่อไปนี้ช่วยให้คุณจำลองลำดับการเลือกของผู้ใช้และการอัปเกรดอุปกรณ์ที่พบบ่อยที่สุดได้โดยไม่ต้องรีเซ็ตอุปกรณ์ทดสอบ

  • แอปที่ติดตั้งใหม่ในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป

    adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-set
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-fixed
  • ผู้ใช้เปิดใช้การแจ้งเตือนไว้เมื่อติดตั้งแอปในอุปกรณ์ที่ใช้ 12L หรือต่ำกว่า จากนั้นอุปกรณ์จะอัปเกรดเป็น Android 13 ขึ้นไป

    adb shell pm grant PACKAGE_NAME android.permission.POST_NOTIFICATIONS
    adb shell pm set-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-set
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-fixed
  • ผู้ใช้ปิดใช้การแจ้งเตือนด้วยตนเองเมื่อติดตั้งแอปในอุปกรณ์ที่ใช้ 12L หรือต่ำกว่า จากนั้นอุปกรณ์จะอัปเกรดเป็น Android 13 ขึ้นไป:

    adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
    adb shell pm set-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-set
    adb shell pm clear-permission-flags PACKAGE_NAME \
      android.permission.POST_NOTIFICATIONS user-fixed

แนวทางปฏิบัติแนะนำ

ส่วนนี้อธิบายวิธีต่างๆ ที่คุณสามารถใช้สิทธิ์การแจ้งเตือนใหม่ในแอปได้อย่างมีประสิทธิภาพสูงสุด

อัปเดตเวอร์ชัน SDK เป้าหมายของแอป

หากต้องการให้แอปมีความยืดหยุ่นมากขึ้นในการกำหนดเวลาที่กล่องโต้ตอบสิทธิ์จะปรากฏขึ้น ให้อัปเดตแอปให้กำหนดเป้าหมายเป็น Android 13 ขึ้นไป

รอแสดงข้อความแจ้งสิทธิ์การแจ้งเตือน

ให้ผู้ใช้ทำความคุ้นเคยกับแอปของคุณก่อนที่จะขอให้ผู้ใช้ให้สิทธิ์ใดๆ

ผู้ใช้ใหม่อาจต้องการสำรวจแอปและเห็นประโยชน์ของการขอสิทธิ์การแจ้งเตือนแต่ละรายการด้วยตนเองก่อน คุณสามารถทริกเกอร์ข้อความแจ้งสิทธิ์ จากการดำเนินการของผู้ใช้ได้ รายการต่อไปนี้แสดงตัวอย่างหลายกรณีที่ควรแสดงข้อความแจ้งสิทธิ์การแจ้งเตือน

  • ผู้ใช้แตะปุ่ม "กระดิ่งแจ้งเตือน"
  • ผู้ใช้เลือกติดตามบัญชีโซเชียลมีเดียของบุคคลอื่น
  • ผู้ใช้ส่งคำสั่งซื้ออาหารแบบเดลิเวอรี

รูปที่ 1 แสดงเวิร์กโฟลว์ที่แนะนำสำหรับการขอสิทธิ์การแจ้งเตือน แอปของคุณไม่จำเป็นต้องแสดงหน้าจอตรงกลาง (หน้าจอที่มีข้อความชื่อ "รับการแจ้งเตือน!") เว้นแต่ shouldShowRequestPermissionRationale() จะแสดงผลเป็น true ใน Compose คุณสามารถค้นหา Activity ปัจจุบันได้โดย เข้าถึง LocalContext.current และแคสต์เป็น Activity

หรือคุณจะตั้งค่าให้คำขอปรากฏขึ้นหลังจากให้โอกาสผู้ใช้ทำความคุ้นเคยกับแอปแล้วก็ได้ เช่น คุณอาจรอจนกว่าผู้ใช้จะเปิดแอปเป็นครั้งที่ 3 หรือ 4

หลังจากผู้ใช้ลงชื่อเข้าใช้แล้ว ระบบจะแสดง
   คำเชิญให้รับการแจ้งเตือนข้อมูลอัปเดตการเดินทาง หลังจากที่ผู้ใช้กดปุ่ม
   ฉันพร้อมแล้ว แอปจะขอสิทธิ์ใหม่ ซึ่งจะทำให้กล่องโต้ตอบของระบบ
   ปรากฏขึ้น
รูปที่ 1 เวิร์กโฟลว์ที่แนะนำซึ่งขับเคลื่อนโดยผู้ใช้สำหรับการขอ สิทธิ์การแจ้งเตือน หน้าจอตรงกลางจำเป็นก็ต่อเมื่อ shouldShowRequestPermissionRationale() แสดงผลเป็น true

ขอสิทธิ์ใน Compose

หากต้องการขอสิทธิ์ภายใน UI ของ Compose ให้ใช้ API rememberLauncherForActivityResult() กับสัญญา ActivityResultContracts.RequestPermission()

ข้อมูลโค้ดต่อไปนี้แสดงวิธีขอสิทธิ์การแจ้งเตือนเพื่อตอบสนองต่อการโต้ตอบของผู้ใช้

Kotlin

val context = LocalContext.current
val permissionLauncher = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted ->
    if (isGranted) {
        // Permission granted, you can now send notifications.
    } else {
        // Permission denied, handle accordingly.
    }
}

// ... in your UI ...
Button(onClick = {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
    }
}) {
    Text("Enable Notifications")
}

ขอสิทธิ์ในบริบท

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

ใช้โอกาสนี้แสดงความโปร่งใสเกี่ยวกับความตั้งใจของคุณ แล้วผู้ใช้จะมีแนวโน้มที่จะให้สิทธิ์การแจ้งเตือนแก่แอปมากขึ้น

ตรวจสอบว่าแอปส่งการแจ้งเตือนได้หรือไม่

ก่อนที่แอปจะส่งการแจ้งเตือน ให้ยืนยันว่าผู้ใช้ได้เปิดใช้ การแจ้งเตือนสำหรับแอปของคุณหรือไม่ โดยเรียกใช้ areNotificationsEnabled()

ใช้สิทธิ์อย่างมีความรับผิดชอบ

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