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 推送通知的主要内容,如果未能解决你的问题,请参考以下文章
Cordova Firebase 插件:安装新应用时,Apple 推送通知有时不起作用
Firebase 推送通知与 PhoneGap Build 使用 cordova-plugin-fcm