Bagaimana cara mendeteksi kapan token push iOS/APNS asli terdaftar di Firebase Cloud Messaging (FCM)?

didReceiveRegistrationToken Firebase seperti yang terlihat di bawah ini dipanggil meskipun pengguna belum memberikan izin pemberitahuan push. Saya perlu memastikan bahwa token push APNS didaftarkan untuk analitik, serta untuk menyimpannya di server saya, tetapi fungsi ini dipanggil bahkan ketika pengguna belum memberikan izin push. ????‍♂️

/**
 * 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!")
    }
}

person Zorayr    schedule 23.07.2020    source sumber


Jawaban (2)


TL;DR: Token FCM bukan cara yang dapat diandalkan untuk mendeteksi apakah token APNS terdaftar. Nonaktifkan metode swizzling di firebase dan dengarkan pendaftaran APNS secara manual.

  1. Token FCM: Token FCM juga dikenal sebagai ID instance perangkat; itu mengidentifikasi aplikasi tertentu pada perangkat tertentu. Dengan kata lain, Token FCM tidak sama dengan token APNS. Berikut penjelasannya: Token APN, FCM, atau GCM.

  2. Pembuatan Token FCM Secara Otomatis: Yang mengejutkan, bahkan tanpa pengguna iOS memberikan izin, Firebase menghasilkan token FCM saat peluncuran aplikasi. Saya kira ia ingin menemukan cara untuk mengidentifikasi pasangan aplikasi & perangkat, jadi segera setelah Anda meluncurkannya, Anda akan memiliki token FCM. Jika mau, Anda dapat menonaktifkan pembuatan otomatis dan menunggu agar pengguna dapat ikut serta.

Secara default, FCM SDK menghasilkan token pendaftaran untuk instance aplikasi klien saat peluncuran aplikasi. Jika Anda ingin mendapatkan keikutsertaan eksplisit sebelum menggunakan ID Instance, Anda dapat mencegah pembuatan pada waktu konfigurasi dengan menonaktifkan FCM. Untuk melakukannya, tambahkan nilai metadata ke Info.plist Anda (bukan GoogleService-Info.plist Anda):

Di sinilah letak salah satu masalahnya! Bahkan jika pengguna telah menonaktifkan pembuatan token FCM secara otomatis, token tersebut akan dibuat ketika pengguna diminta untuk mengaktifkan pemberitahuan push, bukan ketika pengguna telah menerima izin pemberitahuan push. Ini tampaknya cukup aneh dan saya mengakhirinya sampai melaporkan ini ke Firebase.

  1. Penggeseran Token APNS: Jadi secara default, Firebase mengambil alih didRegisterForRemoteNotificationsWithDeviceToken (disebut swizzling). Anda dapat menonaktifkan ini dan mengganti sendiri metode delegasi. Ini kemudian akan memberi Anda akses ke token APNS dan token 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

Mendapatkan panggilan balik untuk token ID perangkat dan mendapatkan panggilan balik untuk pesan yang dikirim sebenarnya adalah dua hal yang berbeda. Panggilan balik token ID perangkat hanya memberi Anda token yang mengidentifikasi perangkat untuk pemberitahuan push nanti. Ini sebenarnya bukan pemberitahuan yang didorong. Itu hanya tanda pengenal.

Oleh karena itu, jika Anda tidak setuju dengan perilaku SDK klien dari sudut pandang keamanan, Anda bebas untuk hubungi dukungan Firebase secara langsung untuk memberikan masukan.

person Doug Stevenson    schedule 23.07.2020
comment
Mungkin pertanyaan saya kurang jelas, saya tidak mencari ID perangkat, saya ingin mengetahui kapan token push APNS telah didaftarkan. - person Zorayr; 23.07.2020
comment
Bisakah Anda mengedit pertanyaan untuk menjelaskan mengapa itu penting? Apakah ada sesuatu yang tidak berfungsi seperti yang Anda harapkan ketika tiba waktunya untuk mengirim pesan? Apakah Anda menghadapi potensi lubang keamanan? - person Doug Stevenson; 23.07.2020
comment
Diperbarui, beri tahu saya jika ini lebih jelas; keamanan tidak menjadi perhatian saat ini. - person Zorayr; 23.07.2020
comment
Baiklah, saya sudah memberikan penjelasan kenapa dipanggil. Jika itu bukan masalah bagi Anda, saya tidak akan memasukkannya ke dalam deskripsi pertanyaan. Sekarang Anda juga mengatakan itu terlalu sering ditelepon? Menurut Anda seberapa sering ia harus dipanggil? Saya mengalami masalah dalam menjawab pertanyaan Anda yang sebenarnya di sini. - person Doug Stevenson; 23.07.2020
comment
Mungkin kita menggunakan dua terminologi berbeda di sini. Token ID perangkat Anda yang setara adalah token push APNS saya; ini sebenarnya yang saya pedulikan, tetapi didReceiveRegistrationToken memberi saya ID ini meskipun pengguna belum menerima izin pemberitahuan push di iOS? Untuk memastikan kita berada di halaman yang sama, saya tidak peduli dengan pesan yang dikirim atau pemberitahuan sebenarnya. - person Zorayr; 23.07.2020
comment
Maksud saya, dalam konteks pertanyaan ini, saya tidak peduli dengan pemberitahuan spesifik, saya hanya perlu tahu kapan aplikasi saya telah menerima token push APNS yang sebenarnya sehingga saya dapat memasukkannya ke dalam analitik saya dan tidur nyenyak dengan mengetahui bahwa permintaan tersebut izin pemberitahuan push → penerimaan pengguna → aplikasi mendapatkan corong token push berfungsi dengan baik. - person Zorayr; 23.07.2020
comment
Apakah Anda yakin tidak hanya ingin menggunakan API milik Apple saja? stackoverflow .com/questions/39565172/ - person Doug Stevenson; 23.07.2020
comment
Saya menggunakan Firebase Cloud Messaging jadi saya tidak perlu menulis layanan push APNS saya sendiri; pertanyaan saya berasal dari fakta bahwa pengumuman token push FCM terjadi meskipun pengguna belum memberikan izin push, ini sepertinya bug! - person Zorayr; 23.07.2020
comment
Oke, seperti yang saya katakan di jawaban saya, hubungi dukungan Firebase jika Anda tidak setuju dengan perilaku tersebut. - person Doug Stevenson; 23.07.2020
comment
Jika saya mematikan swizzling, saya seharusnya bisa mendapatkan dorongan APNS, pertanyaannya adalah apakah ada cara yang lebih baik untuk melakukan ini: medium.com/fantageek/ - person Zorayr; 26.07.2020
comment
Lihat jawaban saya di bawah ;) - person Zorayr; 27.07.2020