android 将FCM(Firebase云消息传递)令牌Map到自定义用户ID

li9yvcax  于 2022-11-20  发布在  Android
关注(0)|答案(1)|浏览(198)

我现有的应用程序具有登录和注册功能。我尝试实现的是将FCM令牌(https://firebase.google.com/docs/cloud-messaging/android/client#kotlin+ktx)与我在服务器上的自定义用户ID进行Map。
我遇到的主要问题是,在我的用户注册完成之前,一旦应用程序安装/初始化,服务中的onNewToken就会被调用。因此,我无法将其Map到我的自定义用户ID。
我可以随时使用FirebaseMessaging.getInstance().token.addOnCompleteListener生成一个令牌,但是如果令牌发生了变化,我将失去这个机会。我不希望在用户完成注册之前触发onNewToken方法,我不想在注册前对我的后端服务器进行API调用。任何建议或链接都将非常有益。感谢您抽出时间阅读我的问题。

顶级域名

我正在尝试创建一个自定义用户ID和FCM令牌之间的Map。一旦用户完成注册,我将把令牌共享到我的后端服务器。如果令牌发生变化,我将用这个新令牌更新Map。关于如何实现这一点,有什么建议/指南吗?

2vuwiymt

2vuwiymt1#

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

脚本. js

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

Web应用程序界面.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发送通知。

相关问题