gpt4 book ai didi

cordova - 应用程序恢复时如何处理推送通知?

转载 作者:行者123 更新时间:2023-12-02 19:48:13 25 4
gpt4 key购买 nike

尝试使用 PushPlugin 处理推送通知。以下是我的代码。

onNotificationGCM: function(e) {
switch( e.event )
{
case 'registered':
if ( e.regid.length > 0 )
{
console.log("Regid " + e.regid);
//alert('registration id = '+e.regid);
sDeviceId = e.regid;
//alert(sDeviceId);
}
break;

case 'message':
// this is the actual push notification. its format depends on the data model from the push server
alert('message = '+e.message);
alert('message = '+e.message+' msgcnt = '+e.msgcnt);
if ( e.foreground )
{
alert("Notification Received");

}
else
{ // otherwise we were launched because the user touched a notification in the notification tray.
if ( e.coldstart )
{
alert("coldstart");
}
else
{
alert("other than coldstart");
}
}
break;

case 'error':
alert('GCM error = '+e.msg);
break;

default:
alert('An unknown GCM event has occurred');
break;
}
}

一切正常。

  • 当应用程序位于前台时,我会收到警报。

  • 当收到消息时单击通知应用程序 打开,我收到警报。(冷启动)

  • 当应用程序在后台运行时,然后单击通知应用程序进入前台,我收到警报。

但是,当我将应用程序保持在后台时,并且当我将应用程序置于前台时,当推送通知到达而没有单击通知时,我不会收到任何警报。那么如何处理这种情况?

最佳答案

我也遇到过同样的问题。简单来说,PushPlugin 现在不支持这个功能。但您可以非常轻松地修改它以满足您的需求

现在如何运作

当插件的 GCMIntentService 收到消息时,onMessage叫做。此方法获取传递给它的所有附加参数,并将它们保存在 extras 中。此后,如果应用程序位于前台,此函数只需通过调用 sendExtrasextras 传递给您。否则,它会调用 createNotification,这实际上会在状态栏中创建通知。

您的问题

根据我从您的问题中了解到的情况,如果在状态栏中收到通知后,您在没有触摸通知的情况下打开应用程序,则不会收到警报。

这就是发生的事情:

  1. GCMIntentService 接收消息
  2. 由于您的应用处于后台,PushPlugin 会调用 createNotification
  3. 当您启动应用时,它不会收到任何提醒,因为您尚未触摸状态栏中的通知

如果您触摸了通知,您就会收到警报,因为通知意图会唤醒您的应用程序。当您的应用程序唤醒时,它会查找 cached extras然后再次调用 sendExtras 将它们传递给您的应用。

解决方案

我还没有对此进行测试,但我坚信,如果您编辑插件,在调用 createNotification 之前(或之后)sendExtras,数据将是无论您是触摸通知还是将其滑开,都会为您的应用程序缓存。

protected void onMessage(Context context, Intent intent) {
Log.d(TAG, "onMessage - context: " + context);
// Extract the payload from the message
Bundle extras = intent.getExtras();
if (extras != null)
{
// if we are in the foreground, just surface the payload, else post it to the statusbar
if (PushPlugin.isInForeground()) {
extras.putBoolean("foreground", true);
PushPlugin.sendExtras(extras);
}
else {
extras.putBoolean("foreground", false);
// Send a notification if there is a message
if (extras.getString("message") != null && extras.getString("message").length() != 0) {
createNotification(context, extras);
}
}
}
}

将以上部分修改为:

protected void onMessage(Context context, Intent intent) {
Log.d(TAG, "onMessage - context: " + context);
Bundle extras = intent.getExtras();
if (extras != null)
{
if (PushPlugin.isInForeground()) {
extras.putBoolean("foreground", true);
}
else {
extras.putBoolean("foreground", false);
if (extras.getString("message") != null && extras.getString("message").length() != 0) {
createNotification(context, extras);
}
}
// call sendExtras always
PushPlugin.sendExtras(extras);
}
}

关于cordova - 应用程序恢复时如何处理推送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29204334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com