【问题标题】:Messages not always being received by Firebase Messaging ServiceFirebase 消息服务并不总是收到消息
【发布时间】:2020-02-22 18:37:37
【问题描述】:

在我的聊天应用中,我使用 FCMFirebase 函数 来在用户收到新消息时发送通知。

为此,我有一个覆盖 onMessageReceivedFirebaseMessagingService。除此之外,此服务还覆盖onNewToken。每当用户首次启动应用程序时,onNewToken 都会被调用,我检索一个新令牌并将其存储在 Firebase 实时数据库中。

然后我去和一些用户聊天(不关闭应用程序)。当我收到新消息时,我会收到通知。 onMessageReceived 被调用。

问题是,当我关闭应用程序然后打开它(或关闭模拟器并重新启动它)时,我从之前的聊天中收到一条新消息,服务没有被调用。我知道问题不在于 Firebase 函数,因为在我的控制台日志中,我收到了一条成功消息。

当我关闭并重新打开应用时,Firebase 消息服务会停止吗?

这是我的 Firebase 消息服务

的代码
class MyFirebaseInstanceId : FirebaseMessagingService() {

    private lateinit var sp: SharedPreferences
    private lateinit var auth: FirebaseAuth
    private lateinit var uid: String
    private lateinit var token: String



    override fun onMessageReceived(p0: RemoteMessage) {
        super.onMessageReceived(p0)
            if (p0.data.isNotEmpty()) {
            val payload: Map<String, String> = p0.data
            sendNotification(payload)
        }
    }

    override fun onNewToken(p0: String) {
        super.onNewToken(p0)
        // Save the new token
        sp = getSharedPreferences("AUTH_UID", Context.MODE_PRIVATE)
        token = p0
        auth = FirebaseAuth.getInstance()
        signIn()
    }


    private fun signIn() {
        auth.signInAnonymously().addOnCompleteListener { task ->
            if (task.isSuccessful) {
                uid = auth.currentUser?.uid.toString()
                sp.edit().putString("CURRENT_UID", uid).apply()
                sp.edit().putString("CURRENT_TOKEN", token).apply()
                FirebaseDatabase.getInstance().reference.child("users").child(uid).child("token")
                    .setValue(token)
                startActivity(
                    Intent(
                        this,
                        MainActivity::class.java
                    ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                )
            }
        }
    }

    private fun sendNotification(payload: Map<String, String>) {

        createNotificationChannel()

        createNotification(payload)
    }

    private fun createNotification(payload: Map<String, String>) {
        val builder = NotificationCompat.Builder(this)
        builder.setSmallIcon(R.drawable.ic_message_not)
        builder.setContentTitle(payload["title"])
        builder.setContentText(payload["text"])
        builder.priority = NotificationCompat.PRIORITY_DEFAULT
        builder.setChannelId(Constants.CHANNEL_ID)

        val intent = Intent(this, MainActivity::class.java)
        val stackBuilder = TaskStackBuilder.create(this)

        stackBuilder.addNextIntent(intent)

        val resultPendingIntent =
            stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)

        builder.setContentIntent(resultPendingIntent)

        val notificationManager =
            (getSystemService(Context.NOTIFICATION_SERVICE)) as NotificationManager

        notificationManager.notify(0, builder.build())
    }

    private fun createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // Create the NotificationChannel
            val name = getString(R.string.channel_name)
            val descriptionText = getString(R.string.channel_description)
            val importance = NotificationManager.IMPORTANCE_DEFAULT
            val mChannel = NotificationChannel(Constants.CHANNEL_ID, name, importance)
            mChannel.description = descriptionText
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(mChannel)
        }
    }
}

基本上,在我的 Splash Activity 中,我会检查这是否是用户第一次打开应用程序。 如果是,则从 Service 进行登录;如果不是,则从 Splash Activity 进行登录。

这是我的Splash Activity的代码:

class SplashActivity : AppCompatActivity() {

    private lateinit var sp: SharedPreferences
    private lateinit var auth: FirebaseAuth
    private var flag: Boolean = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        // If it is first time user enters the app, wait for the MyFirebaseServiceId
        // If not, authenticate and sign in (since we already have the token)
        sp = getSharedPreferences("FIRST_LOGIN", Context.MODE_PRIVATE)
        flag = sp.getBoolean("IS_FIRST_TIME", true)
        if (!flag) {
            auth = FirebaseAuth.getInstance()
            signIn()
        }
        sp.edit().putBoolean("IS_FIRST_TIME", false).apply()


    }


    private fun signIn() {
        auth.signInAnonymously().addOnCompleteListener { task ->
            if (task.isSuccessful) {
                sp = getSharedPreferences("AUTH_UID", Context.MODE_PRIVATE)
                sp.edit().putString("CURRENT_UID", auth.currentUser?.uid).apply()

                getFCMToken()

                Handler().postDelayed({
                    startActivity(Intent(this, MainActivity::class.java))
                    finish()
                }, 2000)


            }
        }
    }

    private fun getFCMToken() {
        FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { p0 ->
            if (p0.isSuccessful) {
                val token = p0.result?.token.toString()
                //sp = getSharedPreferences("AUTH_UID", Context.MODE_PRIVATE)
                sp.edit().putString("CURRENT_TOKEN", token).apply()
            }
        }
    }

}

什么问题,为什么我一直收不到消息?

【问题讨论】:

    标签: android firebase firebase-cloud-messaging


    【解决方案1】:

    我遇到了同样的问题。这不是android端的错。 您可以通过编辑通知模型/结构来解决此问题,方法是不使用任何关键字作为关键字、数组名称或表示通知的对象名称。让我们说通知 {} ===> 数据{}

    注意:执行此操作后,您将不会收到声音通知或自动通知。您需要手动从此消息中获取数据并使用通知管理器创建自定义通知。添加标题优先级和其他内容...

    这样做可以解决后台收不到通知的问题。如果您需要进一步的帮助,我可以提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多