当用户已经在聊天时,Firebase 聊天会阻止推送通知

Posted

技术标签:

【中文标题】当用户已经在聊天时,Firebase 聊天会阻止推送通知【英文标题】:Firebase chat prevent push notification when user is already chatting 【发布时间】:2018-10-28 10:04:44 【问题描述】:

我正在使用 Firebase 作为数据库和 FCM 作为推送通知服务来构建一个聊天应用程序。

在构建应用程序时,我意识到我不应该总是为每条创建的消息触发推送通知。例如,用户可能已经在聊天,并且不应收到该对话的推送通知。

实现这一点的一种方法是让服务器知道每次用户进入对话并有条件地发送推送通知。但是,这是一个服务器端解决方案,我想知道是否有任何现有的使用 Firebase 的客户端解决方案。

【问题讨论】:

由于服务器端是系统发送消息的部分,在我看来,解决方案必须主要在该端。客户端只是接收消息。 @DougStevenson 我明白了,我只是觉得服务器应该知道用户的当前屏幕很奇怪。但我想这是解决这个问题的最好方法。谢谢! 服务器可以继续发送消息,客户端可以忽略它们。如果您使用 FCM,则发送消息无需任何费用,您只需为后端处理支付最低费用。 @DougStevenson 哦,有没有办法让客户端忽略消息,尽管它们包含“通知”有效负载? AFAIK 包含“通知”有效负载的 FCM 消息会触发推送通知,无论应用程序是在前台还是后台。 “忽略”是指您的代码在收到消息后选择不做任何事情。您无法更改消息的默认触发行为。 【参考方案1】:

我们可以通过布尔方法检查应用程序是否在后台。使用活动管理器,我们可以检查应用程序(使用您的包名称)是否正在运行!然后在“onMessageReceived”上使用简单的 if-else,您可以选择不显示通知。 在您创建的 Firebase 消息服务类中使用它:

public class MyGcmPushReceiver extends GcmListenerService 

    /**
     * Called when message is received.
     * @param from   SenderID of the sender.
     * @param bundle Data bundle containing message data as key/value pairs.
     *               For Set of keys use data.keySet().
     */
    @Override
    public void onMessageReceived(String from, Bundle bundle) 
        // Check here whether the app is in background or running.
        if(isAppIsInBackground(getApplicationContext())) 
            // Show the notification
         else 
            // Don't show notification
        
    

        /**
        * Method checks if the app is in background or not
        */
        private boolean isAppIsInBackground(Context context) 
            boolean isInBackground = true;

            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) 
                List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
                for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) 
                    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) 
                        for (String activeProcess : processInfo.pkgList) 
                            if (activeProcess.equals(context.getPackageName())) 
                                isInBackground = false;
                            
                        
                    
                
            
            else
            
                List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
                ComponentName componentInfo = taskInfo.get(0).topActivity;
                if (componentInfo.getPackageName().equals(context.getPackageName())) 
                    isInBackground = false;
                
            
            return isInBackground;
        

原始感谢兔子先生https://***.com/a/42312210/10742321

【讨论】:

您好!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。

以上是关于当用户已经在聊天时,Firebase 聊天会阻止推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在聊天时用程序员语言让自己显得很聪明? | 双语阅读

使用firebase聊天时如何从下到上设置数据

聊天时,对方发过的话末尾有obj

当我们聊装饰的时候,我们在聊什么?装饰模式

第一次正确获取数据,当用户移动彼此聊天时,状态值未刷新,显示过去+当前用户聊天

用户在屏幕聊天时如何取消本地推送通知?