Cordova 中的后台 Firebase 推送通知

Posted

技术标签:

【中文标题】Cordova 中的后台 Firebase 推送通知【英文标题】:Background Firebase Push Notifications in Cordova 【发布时间】:2017-11-06 05:01:12 【问题描述】:

我正在使用phonegap-plugin-push 在 Cordova 应用程序中接收通知。我正在部署在 android Marsh-mellow 上进行测试。

我想在应用处于后台时查看并存储通过 Firebase Console 收到的通知的内容。

这是我的代码 -

    document.addEventListener("deviceready",onDeviceReady,false);
    function onDeviceReady()

       var push = PushNotification.init( "android": "senderID": "91254247XXXX");

       push.on('registration', function(data) 
           console.log(data.registrationId);
           //document.getElementById("gcm_id").innerhtml = data.registrationId;
       );

       push.on('notification', function(data) 

           alert("On Notification function!!");
             // data.message,
            // data.title,
            // data.count,
            // data.sound,
            // data.image,
            // data.additionalData
            console.log("notification event");
            console.log(JSON.stringify(data));
            alert(JSON.stringify(data));
           //Do something 
       );

       push.on('error', function(e) 
           alert(e);
       );
    

当应用程序处于前台(屏幕上)时,我可以正确接收内容(标题、消息、数据等),并且可以直接在应用程序的警报框中看到它们。

但是当应用程序在 background(不在屏幕上而是在后台运行)时,我会在通知区域中收到通知。当我点击收到的通知时,它会将我重定向到应用程序中最后打开的页面。

没有调用函数push.on('notification', function(data) 。不显示警报消息。有人可以帮我如何访问通知消息和数据吗?

【问题讨论】:

【参考方案1】:

经过 2 天的研究,我找到了答案。我们必须在数据字段中将“content-available”设置为 1。否则,如果应用程序在后台,它不会调用通知块。

目前通过Google Firebase Console 是不可能的。

我们必须单独使用firebase servers 中的任何一个send our custom payload messages(数据或通知或两者)。

详细信息可以在后台通知的plugin's GitHub Page 上找到。

我使用了 NodeJs firebase-admin。我关注了这些setup guidelines 和这些steps for sending messages,它对我有用。

这是我的工作代码(NodeJS)-

var admin = require("firebase-admin");

var serviceAccount = require("pushnotificationapp-xxxxx.json"); //this is the service account details generated from server

admin.initializeApp(
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://pushnotificationappxxxxx.firebaseio.com/" //your database URL here.
);

var registrationToken = "eYjYT0_r8Hg:APA91bG0BqWbT7XXXXX....."; //registration token of the device
var payload =
    "data": 
        "title": 'Test Push',
        "message": 'Push number 1',
        "info": 'super secret info',
        "content-available": '1' //FOR CALLING ON NOTIFACATION FUNCTION EVEN IF THE APP IS IN BACKGROUND
    
;

//send the notification or message
admin.messaging().sendToDevice(registrationToken, payload)
.then(function(response) 
    console.log("Successfully sent message:", response);
)
.catch(function(error) 
    console.log("Error sending message:", error);
);

更新

我也使用 php 服务器实现了相同的功能。 这是我使用HTTP POST 向 FCM 服务器发送通知的工作 php 代码-

<?php

$url = 'https://fcm.googleapis.com/fcm/send';

$data = 
    array(
          "to" => "eYjYT0_r8Hg:APA91bG0BqWbT7XXXXX.....",
          "data" => array(
                "title"=> 'Test Push',
                "message"=> 'Push number 1',
                "info"=> 'super secret info',
                "content-available"=> '1')

   );

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => array("Content-Type:application/json",
        "Authorization:key=AAAA1HfFM64:APA91XXXX...."), //this is the server authorization key from project settings tab in your Firebase Project
        'method'  => 'POST',
        'content' => json_encode($data)
    )
);

$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);

if ($result === FALSE)  echo "Caught an error"; 
else
    echo $result;

?>

【讨论】:

我遇到了一件很奇怪的事情。我设置了与您发布的完全相同的nodejs服务器,我可以看到在前台收到通知但没有任何反应,当应用程序在后台时实际上没有任何反应:(【参考方案2】:

我遇到了同样的问题,但我也添加了 "content-available": '1' 但我的手机没有收到任何后台推送。

最后我发现我的手机有问题,如下所述:https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/PAYLOAD.md#huawei-and-xiaomi-phones

华为和小米手机

这些手机有一个特殊的怪癖,即当应用程序被强制关闭时,您将无法再收到通知,直到应用程序重新启动。为了让您接收后台通知:

在您的华为设备上,转到“设置”>“受保护的应用”> 在“我的应用”中勾选。 在您的小米上,确保您的手机为您的应用启用了“自动启动”属性。 在您的华硕上,确保您的手机为您的应用启用了“自动启动”属性。

希望它会帮助某人。

【讨论】:

以上是关于Cordova 中的后台 Firebase 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 模拟器中从 firebase 推送通知

Cordova Firebase 插件:安装新应用时,Apple 推送通知有时不起作用

Firebase 推送通知与 PhoneGap Build 使用 cordova-plugin-fcm

在 ionic cordova 和 firebase 中为 iOS 应用程序设置推送通知

Ionic/Cordova 应用程序不会在后台收到推送通知

当应用程序在Phonegap(cordova)的后台状态下收到推送通知时增加徽章编号,