【问题标题】:Mapping FCM(Firebase Cloud Messaging) Token to Custom UserID将 FCM(Firebase Cloud Messaging)令牌映射到自定义用户 ID
【发布时间】:2022-11-18 20:39:58
【问题描述】:

我现有的应用程序具有登录和注册功能。我想要实现的是将 FCM 令牌 (https://firebase.google.com/docs/cloud-messaging/android/client#kotlin+ktx) 映射到我服务器上的自定义用户 ID。

我遇到的主要问题是,即使在我的用户注册完成之前,只要安装/初始化应用程序,服务中的onNewToken就会被调用。因此,我将无法将其映射到我的自定义用户 ID。

我可以随时使用 FirebaseMessaging.getInstance().token.addOnCompleteListener 生成令牌,但如果令牌发生变化,我就会失败。我不希望在用户完成注册之前触发 onNewToken 方法,或者即使是这样,我也不想在注册之前对我的后端服务器进行 API 调用。任何建议或链接都​​会非常有益。感谢您花时间阅读我的问题。

TLDR

我正在尝试在我的自定义用户 ID 和 FCM 令牌之间创建映射。用户完成注册后,我会将令牌共享到我的后端服务器。如果令牌发生变化,我将使用这个新令牌更新映射。关于如何实施这个的任何建议/指南?

【问题讨论】:

    标签: android firebase kotlin firebase-cloud-messaging


    【解决方案1】:

    我的建议是从 javascript 将用户 ID 发送到 Kotlin(应用程序),然后从应用程序发送令牌和用户我用 PHP 将其保存在数据库中,我这样做了并且它有效。

    脚本.js

    function showAndroidToast() {
       Android.showToast("18");// ID de Usuario
    }
    showAndroidToast();
    

    WebAppInterface.kt

    /** Instantiate the interface and set the context  */
    class WebAppInterface(private val mContext: Context) {
    
        /** Show a toast from the web page  */
        @JavascriptInterface
        fun showToast(id_usuario: String) {
    
            Toast.makeText(mContext, "ID-Usuario>"+id_usuario, Toast.LENGTH_SHORT).show()
    
            FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
                if (!task.isSuccessful) {
                    Log.w(ContentValues.TAG, "Fetching FCM registration token failed", task.exception)
                    return@OnCompleteListener
                }
    
                // Obtenga un nuevo token de registro de Firebase Cloud Messaging (FCM)
                val token = task.result
    
                // MOSTRAR LOG Y TOAST
                //val msg = getString(R.string.msg_token_fmt, token)
                val msg = "TOKENdesdeJavascript>$token"
                Log.d(ContentValues.TAG, msg)
                Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show()
    
                // Todo ENVIA TOKEN Y USUARIO A LA BBDD
                val urlServer ="http://example.com/AP_RegistrarToken.php"
    
                val stringRequest: StringRequest = object : StringRequest(Request.Method.POST, urlServer,
                    Response.Listener<String> {
                        fun onResponse(response: String?) {
                            val mensaje = "Registro Satisfactorio TOKEN y USUARIO"
                            Log.d(ContentValues.TAG, mensaje)
                            Toast.makeText(mContext, mensaje, Toast.LENGTH_LONG).show()
                        }
                    }, Response.ErrorListener {
                        fun onErrorResponse(error: VolleyError?) {
                            Toast.makeText(mContext, "Error en la Conexión TOKEN y  USUARIO", Toast.LENGTH_LONG).show()
                        }
                    }) {
                    @Throws(AuthFailureError::class)
                    override fun getParams(): Map<String, String> {
                        val params = HashMap<String, String>()
                        params.put("id_usuario_kotlin",id_usuario)
                        params.put("token_kotlin", token)
                        return params
                    }
                }
    
                Log.d(ContentValues.TAG, "SE REGISTRO EXITOSAMENTE")
    
                val requestQueue: RequestQueue = Volley.newRequestQueue(mContext)
                requestQueue.add(stringRequest)
    
    
            }) // FirebaseMessaging
    
            Toast.makeText(mContext, "SE REGISTRO EXITOSAMENTE", Toast.LENGTH_SHORT).show()
    
        } // FIN FUNCION
    
    }
    

    通过这种方式,仅当用户已经注册时,您才将令牌发送到数据库。

    我希望它能帮助你。我昨天做了这个并且它有效并且像你一样,我正在开发一个带有 webview 的应用程序来发送通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2017-02-25
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多