我们正在努力使用Ionic Native推送插件(基于phonegap-plugin-push)。当我们确实收到发送的推送通知时,我们无法处理所发送的特定有效负载,因此,在点击通知时,应用程序将在特定页面中打开。
对于Android推送通知,我们使用Firebase Cloud Messaging传递通知,对于iOS,我们使用APNS。
该应用程序已打开,但是在主页中或之前打开过的任何页面中。
这是我们的初始推送代码:
private initPush() {
this.push.hasPermission()
.then((res: any) => {
// just some console logs irrelevant to this question
});
const options: PushOptions = {
android: { clearBadge: true, forceShow: true },
ios: { alert: 'true', badge: true, sound: 'false', clearBadge: true },
windows: {}
};
const pushObject: PushObject = this.push.init(options);
try {
pushObject.on('notification').subscribe((notification: any) => this.onNotification(notification));
pushObject.on('registration').subscribe((registration: any) => this.onRegister(registration));
pushObject.on('error').subscribe(error => this.onError(error));
this.authorizationService.currentUser.subscribe((nextUser) => this.fullfillPushTokenRegistration());
} catch (e) {
console.error('Error on registering push methods', e);
}
}
onNotification(notification): void {
console.info('On Push Notification', JSON.stringify(notification));
const addData = notification.additionalData;
this.notificationEventsService.createEvent('push', 'click', addData);
}
onNotification
方法,应该与Ionic Native push“ notification”事件一起触发,因此永远不会被调用,因此我们无法处理让我们导航到与通知相关的特定页面的其他有效负载。
我们正在使用以下版本:
@ionic/core: 4.11.1
@ionic-native/push: 5.15.0
phonegap-plugin-push: 2.3.0
@angular/core: 8.1.2
[我们知道此插件已停产,我们可能应该切换到OneSignal,但是除非我们最后一招,否则我们将尽量避免这样做,因为它需要进行其他开发。
这是Kotlin代码片段,如果有帮助,我们将在其中创建带有有效负载的通知:
val message = Message.builder().setToken(device.deviceToken)
val fcmNotification: com.google.firebase.messaging.Notification = com.google.firebase.messaging.Notification(
notification.title, notification.message
)
message.setNotification(fcmNotification)
message.putData("action", notification.action!!.toString())
message.putData("pendingToViewUserNotifications", pendingToViewUserNotifications.toString())
message.putData("referenced", notification.referenced)
message.putData("notificationId", notification.id.toString())
message.putData("title", notification.title)
message.putData("body", notification.message)
message.putData("badge", pendingToViewUserNotifications.toString())
message.putData("content-available", "1")
when (device.deviceOs!!.toLowerCase()) {
"android" -> message.setAndroidConfig(AndroidConfig.builder()
.setTtl(3600 * 1000)
.setNotification(AndroidNotification.builder()
.setIcon("stock_ticker_update")
.setColor("#f45342")
.build())
.build())
不确定这是否适合您,但在我以前的应用程序中,我必须为android和iOS设置不同的结构。
Android:
registration_ids : [],
data: {
notId: "", // notId on Android needed to be an int and not a string
title: "",
body: "",
soundname: "default",
}
iOS:
registration_ids : [],
notification:{
title: "",
body: "",
sound: "default",
},
data: {
title: "",
body: "",
}
OR ..
您可以通过此Android notification data pass,在下面的有效载荷应同时适用于Android和iOS。
{“ priority”:“ high”,“通知”:{“ title”:“标题”,“ body”:“ Body”,“ sound”:“默认”,“ click_action”:“ com.adobe.phonegap.push.background.MESSAGING_EVENT”},“数据”:{“更多”:“数据在这里”},“ to”:“ id”}
希望这会有所帮助。干杯。
[好,所以我终于设法解决了...必须在数据有效载荷中设置content-available: "1"
,在推送请求正文中设置contentAvailable: true
,以及设置noCache: "1"
。
放弃了Firebase SDK并手动执行了请求,现在它最终调用了on('notification')
。
如果additionalData.foreground
为true,您还希望在通知回调中进行处理,因为在前台,通知事件在显示通知后立即触发,并在被点击时以前景为false再次触发。
这是我发送到FCM API的有效示例负载:
{ "to":"FIREBASE_TOKEN", "content_available": true, "data": { "action": "ACTION(Custom payload data)", "referenced": "REFERENCED(Custom payload data)", "force-start": "1", "content-available": "1", "no-cache": "0", "notId": "4361c4f5-ae8d-42fa-a863-a04acff2ab7a", "title": "TEST" } "priority":10 }
尽管无法帮助,我将赏金归功于唯一的努力。