我正在使用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构建正在处理。
如果应用程序关闭或在后台,这将显示一条通知消息。当您单击通知时,它将打开应用程序并再次显示消息。如果您的应用在后台,当您将其带到前景时,也会显示该消息。如果您的应用程序关闭,并且您不单击通知消息,那么您将永远不会在应用程序上看到消息。