应用程序上的 FCM 已关闭

Posted

技术标签:

【中文标题】应用程序上的 FCM 已关闭【英文标题】:FCM on app closed 【发布时间】:2017-04-28 12:31:11 【问题描述】:

我已经在我的应用程序中实现了 FCM 通知系统,我的问题是它只有在应用程序正在运行或在后台运行时才能正常工作,但如果它被杀死通知不出现,我有这个代码

Manifest.xml
 <service android:name="com.Ryuk.listenme.FirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
</service>
______________________________________________________________

myServer.php

function notify($tokens,$message)


$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array(
              'registration_ids' => $tokens,
              'data' => $message         
              );
$headers = array(
                'Authorization:key = mycode',
                'Content-Type: application/json'
                );

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_POST, true);
   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);  
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
   $result = curl_exec($ch);
   if ($result === FALSE) 
       die('Curl failed: ' . curl_error($ch));
   
   curl_close($ch);
   return $result;

______________________________________________________________

FirebaseMessagingServer.java //which works only in running/background

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService

@Override
public void onMessageReceived(RemoteMessage remoteMessage)


    showNotification(remoteMessage.getData().get("message"));


private void showNotification(String message)

    Intent i = new Intent ();
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_ONE_SHOT);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setAutoCancel(true)
            .setContentTitle("Test FCM")
            .setContentText(message)
            .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark)

            .setContentIntent(pendingIntent);
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(0,builder.build());



我不知道问题出在我的应用程序还是消息格式(在 php 中),我在 google 上尝试了很多解决方案,但一年前它们很现实,但没有奏效

【问题讨论】:

这是当应用程序被强制关闭时,还是只是在后台? @Federico De Luca : Check(Log) 你会收到消息 onMessageReceived 与否。 我最近遇到了这个问题。有时我会收到通知,但有时我不会。有些人甚至推测 Firebase 白名单的应用程序(如 Whatsapp)即使在通过系统托盘关闭时也会发出通知。***.com/a/39505298/4653908。关于这个问题的文档很少。 @guido 我很难相信 GCM/FCM 对待应用程序的方式不同。 @Shmuel 仅在应用程序被强制关闭时才会发生 【参考方案1】:

一旦应用被强制关闭,您将不会收到后台意图。这 包括 GCM/FCM 消息。

“从 Android 3.1 开始,系统的包管理器会跟踪处于停止状态的应用程序,并提供一种控制它们从后台进程和其他应用程序启动的方法。”

“请注意,系统会将 FLAG_EXCLUDE_STOPPED_PACKAGES 添加到所有广播意图中。这样做是为了防止来自后台服务的广播无意或不必要地启动已停止应用程序的组件。” https://developer.android.com/about/versions/android-3.1.html#launchcontrols

GCM push notification works after app Force Stop?

有趣的事实是,三星设备经常使用“优化应用程序”功能杀死后台应用程序。这可能会影响您的应用。请参阅此处了解更多信息 - Samsung "App optimisation" feature kills background applications after 3 days

【讨论】:

【参考方案2】:

根据文档。

当您的应用处于后台时,Android 会发送通知 消息到系统托盘。用户点击通知会打开 默认应用启动器。

这包括同时包含通知和数据的消息 有效载荷。在这些情况下,通知会发送到设备的 系统托盘,并且数据有效负载在附加的 启动器 Activity 的意图。

当您在background 中时,FCM 将根据来自通知负载的信息在系统托盘中显示通知。标题、消息和图标是从通知负载中获取的。更多信息请参考question。

【讨论】:

谢谢,但我该怎么做呢?我必须编辑我的php代码?对不起,也许我是菜鸟,但我不明白我要把有效载荷代码放在哪里...... 这没有帮助,没有解决问题。明确指出问题不在于应用程序在后台运行时,而在于它完全关闭(根本不运行)时【参考方案3】:

我已经解决了,这是我手机中的一个设置,它阻止了通知

【讨论】:

不幸的是它只工作了一天,我暂时投降了,希望在一些 fcm 更新... =(

以上是关于应用程序上的 FCM 已关闭的主要内容,如果未能解决你的问题,请参考以下文章

FCM 检测 IOS 上的应用程序卸载(firebase 云消息推送通知)

确保以 fcm 推送交付

在 Android 上的代理后面接收 FCM (GCM)

iOS 上的 Flutter FCM 不调用 onMessage 和 onResume

应用程序强制停止后 FCM 推送通知有效吗?

商业应用程序的 FCM 定价和使用限制 [关闭]