ฉันจะตรวจสอบได้อย่างไรเมื่อพุชโทเค็น iOS/APNS จริงลงทะเบียนกับ Firebase Cloud Messaging (FCM)

didReceiveRegistrationToken ของ Firebase ดังที่แสดงด้านล่างกำลังถูกเรียกแม้ว่าผู้ใช้จะไม่ได้รับสิทธิ์ในการแจ้งเตือนแบบพุชก็ตาม ฉันต้องตรวจสอบให้แน่ใจว่าพุชโทเค็น APNS ได้รับการลงทะเบียนสำหรับการวิเคราะห์ เช่นเดียวกับการบันทึกบนเซิร์ฟเวอร์ของฉัน แต่ฟังก์ชันนี้ถูกเรียกแม้ว่าผู้ใช้จะไม่อนุญาตการพุชก็ตาม ????‍♂️

/**
 * Requirement for Firebase push notifications.
 * See documentation here: https://firebase.google.com/docs/cloud-messaging/ios/client
 */
extension AppDelegate: MessagingDelegate {
    // Note: This callback is fired at each app startup and whenever a new token is generated.
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Firebase registration token: \(fcmToken)")
        let dataDict: [String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
        print("Getting called even if the user hasn't opted in for push notifications!")
    }
}



คำตอบ (2)


TL;DR: โทเค็น FCM ไม่ใช่วิธีที่เชื่อถือได้ในการตรวจสอบว่ามีการลงทะเบียนโทเค็น APNS หรือไม่ ปิดการใช้งานวิธีการ Swizzling ใน firebase และฟังการลงทะเบียน APNS ด้วยตนเอง< /ก>.

  1. โทเค็น FCM: โทเค็น FCM เรียกอีกอย่างว่า ID อินสแตนซ์ของอุปกรณ์ มันระบุแอพเฉพาะนั้นบนอุปกรณ์นั้น ๆ กล่าวอีกนัยหนึ่ง โทเค็น FCM ไม่เท่ากับโทเค็น APNS ต่อไปนี้เป็นคำอธิบาย: โทเค็น APN, FCM หรือ GCM

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

ตามค่าเริ่มต้น FCM SDK จะสร้างโทเค็นการลงทะเบียนสำหรับอินสแตนซ์แอปไคลเอนต์เมื่อเปิดแอป หากคุณต้องการรับการเลือกอย่างชัดเจนก่อนที่จะใช้รหัสอินสแตนซ์ คุณสามารถป้องกันการสร้างในเวลากำหนดค่าได้โดยปิดใช้ FCM ในการดำเนินการนี้ ให้เพิ่มค่าข้อมูลเมตาลงใน Info.plist ของคุณ (ไม่ใช่ GoogleService-Info.plist ของคุณ):

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

  1. โทเค็น APNS Swizzling: ตามค่าเริ่มต้นแล้ว Firebase จะเข้ามาแทนที่ didRegisterForRemoteNotificationsWithDeviceToken (เรียกว่า Swizzling) คุณสามารถปิดใช้งานสิ่งนี้และแทนที่วิธีการมอบสิทธิ์ได้ด้วยตนเอง จากนั้นจะทำให้คุณสามารถเข้าถึงโทเค็น APNS และโทเค็น FCM ได้
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("Successfully registered for notifications!")
    // Required to make FCM work since we disabled swizzling!
    Messaging.messaging().apnsToken = deviceToken
    // String version of APNS so we can use save it/use it later/do analytics.
    let apnsToken = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
}
person Zorayr    schedule 27.07.2020

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

อย่างไรก็ตาม หากคุณไม่เห็นด้วยกับพฤติกรรมของ SDK ไคลเอ็นต์ในแง่ความปลอดภัย คุณสามารถ ติดต่อฝ่ายสนับสนุน Firebase โดยตรงพร้อมความคิดเห็น

person Doug Stevenson    schedule 23.07.2020
comment
บางทีคำถามของฉันอาจไม่ชัดเจน ฉันไม่ได้กำลังมองหา ID อุปกรณ์ ฉันต้องการทราบว่า APNS Push Token ได้รับการลงทะเบียนเมื่อใด - person Zorayr; 23.07.2020
comment
คุณช่วยแก้ไขคำถามเพื่อบอกว่าเหตุใดจึงสำคัญ มีบางอย่างไม่ทำงานอย่างที่คุณคาดหวังเมื่อถึงเวลาส่งข้อความจริงหรือไม่? คุณกำลังเผชิญกับช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้นหรือไม่? - person Doug Stevenson; 23.07.2020
comment
อัปเดตแล้ว โปรดแจ้งให้เราทราบหากชัดเจนกว่านี้ ความปลอดภัยไม่ใช่เรื่องกังวล ณ จุดนี้ - person Zorayr; 23.07.2020
comment
ฉันได้อธิบายไปแล้วว่าทำไมถึงถูกเรียกไป หากนั่นไม่เป็นปัญหาสำหรับคุณ ฉันก็คงไม่พูดถึงคำอธิบายคำถามนี้ ตอนนี้คุณยังบอกว่ามันถูกโทรมาบ่อยเกินไปเหรอ? คุณคิดว่าควรจะถูกเรียกบ่อยแค่ไหน? ฉันมีปัญหาในการทำความเข้าใจคำถามที่แท้จริงของคุณที่นี่ - person Doug Stevenson; 23.07.2020
comment
บางทีเราอาจใช้คำศัพท์สองคำที่แตกต่างกันที่นี่ โทเค็นรหัสอุปกรณ์ที่เทียบเท่าของคุณคือโทเค็นพุช APNS ของฉัน นี่คือสิ่งที่ฉันสนใจจริงๆ แต่ didReceiveRegistrationToken ให้ ID นี้แก่ฉันแม้ว่าผู้ใช้จะไม่ยอมรับการอนุญาตการแจ้งเตือนแบบพุชบน iOS เพื่อให้แน่ใจว่าเราเข้าใจตรงกัน ฉันไม่สนใจข้อความที่พุชหรือการแจ้งเตือนจริง - person Zorayr; 23.07.2020
comment
ฉันหมายถึงในบริบทของคำถามนี้ ฉันไม่สนใจการแจ้งเตือนใดโดยเฉพาะ ฉันแค่ต้องรู้ว่าเมื่อใดที่แอปของฉันได้รับ APNS Push Token จริง เพื่อให้ฉันสามารถเข้าสู่ระบบการวิเคราะห์ของฉันและนอนหลับได้ดีโดยรู้ว่าคำขอนั้น สิทธิ์การแจ้งเตือนแบบพุช → การยอมรับของผู้ใช้ → แอปที่ได้รับช่องทางโทเค็นพุชทำงานได้ดี - person Zorayr; 23.07.2020
comment
คุณแน่ใจหรือว่าคุณไม่ต้องการใช้เพียง API ของ Apple เอง stackoverflow .com/questions/39565172/ - person Doug Stevenson; 23.07.2020
comment
ฉันใช้ Firebase Cloud Messaging ดังนั้นฉันจึงไม่จำเป็นต้องเขียนบริการพุช APNS ของตัวเอง คำถามของฉันเกิดจากการที่การประกาศโทเค็นการพุชของ FCM เกิดขึ้นแม้ว่าผู้ใช้จะไม่ได้รับอนุญาตในการพุช แต่ดูเหมือนว่าจะเป็นข้อบกพร่อง! - person Zorayr; 23.07.2020
comment
ตกลง เช่นเดียวกับที่ฉันบอกไว้ในคำตอบ ให้ติดต่อฝ่ายสนับสนุนของ Firebase หากคุณไม่เห็นด้วยกับพฤติกรรมดังกล่าว - person Doug Stevenson; 23.07.2020
comment
ถ้าฉันปิด Swizzling ฉันควรจะสามารถรับ APNS Push ได้ คำถามก็คือ มีวิธีที่ดีกว่าในการดำเนินการนี้หรือไม่: medium.com/fantageek/ - person Zorayr; 26.07.2020
comment
ดูคำตอบของฉันด้านล่าง ;) - person Zorayr; 27.07.2020