phonegap firebase推送通知在应用程序打开时或应用在后台时不要发射侦听器



我正在使用PhoneGap和Firebase(FCM)接收推送通知。我正在使用Android 8测试。

如果应用程序在前景中运行(作为应用程序中的弹出消息),我希望我的设备收到推送通知。如果应用程序已关闭或在后台,我希望将消息显示为通知,当我单击通知时,它会在前景中打开该应用程序并调用Notification Event函数。

这是迄今为止发生的事情:

  • 当应用程序打开时,推动通知通过并显示在应用中 - 正确

  • 当应用最小化时,将出现在顶部栏中的推动通知 - 正确...但是

  • 当我单击通知消息时,它会打开我的应用程序/将其放在前景中,但是"通知"事件侦听器未调用 - 错误

关于这个问题有很多帮助的要求,我已经经历了许多要求,但它们都没有为我的应用提供工作解决方案(大多数是在2016年至2018年之间,而不是2019年)。

主要需要为Android工作。因此,我尝试删除通知有效载荷,而仅使用数据有效载荷。但是,这无法解决问题。

这是我当前的有效载荷:

$notification = array
(
'body'   => 'test',
'title'     => 'test',
"icon" =>  'notification_icon',
"content_available" => true,
);
$data = array
(
"title" => "test",
"body" => "test",
"icon" => "notification_icon",
"content_available" => true,
);
$fields = array
(
'registration_ids'  => $registrationIds,
'notification'      => $notification,
'data'          => $data,
"priority" => "high",
"content_available" => true 
);

据我了解,有3种发送通知的方法:

1)为"通知" 。如果应用程序当前正在运行,则可以在前景中工作,如果应用程序已关闭或最小化,则在顶部栏中的后台(并且该应用程序的图标上方都有一些徽章表示消息表示消息),但是当在后台,单击"应用程序加载"但未调用"通知功能"时。

2)为"数据" 。这似乎只能在前景中起作用,没有顶级栏消息,并且该应用程序的图标上方没有一些徽章。如果该应用在后台,根本没有推动通知。

3)均为" notificaton"one_answers" data" 。在后台时,应用程序图标上方具有徽章。单击顶部栏消息时,加载了应用程序,但未调用ON通知功能。

,即使在后台使用该应用程序,它也会收到推送通知并将应用程序放入Froeground,请显示无通知消息。仅当收到通知时,它仅在该应用程序已经在前景中时起作用。

这是我的活动听众:

var app = {
initialize: function() {
    this.bindEvents();
},
bindEvents: function() {
    document.addEventListener('deviceready', this.onDeviceReady, false);
},
onDeviceReady: function() {
  console.log('Received Device Ready Event');
  app.setupPush();
},
setupPush: function() {
    var push = PushNotification.init({
      android: {
        senderID: 'XXXXXXXXXX',  
        iconColor: "#ccc",
        alert: true,
        badge: true,
        icon: 'notification_icon',
        sound: true,
        vibrate: true,
      },
      browser: {},
      ios: {
        sound: true,
        vibration: true,
        badge: true
      },
      windows: {}
    });
    console.log('after init');
    push.on('registration', function(data) {
         //[edit - script not displayed for this example, but it registers a token to enable push notifications to the device. tested and working]
    });
    push.on('error', function(e) {
      console.log('push error = ' + e.message);
    });
    push.on('notification', function(data) {
       window.alert(data.additionalData);              //Test line
      if(data.additionalData.foreground){
        window.alert(data.title+'n'+data.message);    //Test line
      }
      if(data.additionalData.coldstart){
        window.alert("coldstart");                     //Test line
      }
      showPopup(data,"info");
    });

  }
};
//Using Sweet Alert to display messages
function showPopup(data,type){
   Swal.fire({
     type: type,
     title: data.title,
     text: data.message,
     showConfirmButton: true,
     imageUrl: data.image,
     imageWidth: 400,
     imageHeight: 200,
    imageAlt: data.title,
    animation: true,
  });
}

有人对上述适用于Android 7和8的答案?

您的通知发送逻辑是可靠的,但是您的担忧也有效。如果您想了解有关该主题的更多信息,Google notification vs data notifications,有一些很好的文章解释。

推送通知在开放接收器上具有特殊的本地,您的网络浏览量必须为这些事件注册。但是,如果您查看源,则不会处理通知开放事件。除了构造存储库以外,您无能为力。

此外,当应用程序被杀死时,您的Webview不会收到.on('notification')事件,因为..嗯,您的应用程序被杀死。您的应用程序被杀死时不会收到通知,Android OS会收到并决定该怎么办。

关于为什么您会在Android 8上注意到这个问题,最近版本的Android版本更积极地杀死了后台的应用程序,以节省电池:打ze和自适应电池。较新的Android应用程序简单地被杀死。

,如果可能的话,我建议您切换到cordova-plugin-firebase,这是一个更具主动维护的插件。或者,学习一些Android并编写自己的插件。

我的最终答案,以获取Android设备的通知MSG和应用程序内消息(INC Android 8和9),将执行以下操作:

将此添加到/修改config.xml:

<preference name="phonegap-version" value="cli-9.0.0" />  
<platform name="android">
    <resource-file src="google-services.json" target="app/google-services.json" />
</platform>
<platform name="ios">
    <resource-file src="GoogleService-Info.plist" />    
</platform>
<plugin name="phonegap-plugin-push" spec="2.1.3">
    <variable name="SENDER_ID" value="xxxxxxxxxxxxx" />
</plugin>    

也发送数据包数据时,发送"数据"参数和"通知"参数,并包括" content_available"标志,例如...

  $notification = [
                'body'   => $message,
                'title'     => $titlenotification,                    
                "icon" =>  'notification_icon',
                "content_available" => "1", 
  ];

 $data = [
             "title"             =>$titlenotification,  
             "message"           => $message,
             "content_available" => "1",
 ];
 $fields =  [
            'registration_ids'   => $registrationtokens,    
             'notification'      => $notification,        
            'data'               => $data,                         
            "priority"           => "high",
            "content_available"  => true,
 ];
 //send field data like curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );

...最后,请确保将您的Google-services.json添加到根文件夹中,也将www文件夹添加到根文件夹中。否则,您将收到错误"插件需要Google-services.json。没有它的Google Services插件无法运行" PhoneGap构建正在处理。

如果应用程序关闭或在后台,这将显示一条通知消息。当您单击通知时,它将打开应用程序并再次显示消息。如果您的应用在后台,当您将其带到前景时,也会显示该消息。如果您的应用程序关闭,并且您不单击通知消息,那么您将永远不会在应用程序上看到消息。

最新更新