gpt4 book ai didi

android - Ionic/Cordova 应用程序在后台不接收推送通知

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:44 24 4
gpt4 key购买 nike

我的 Android 应用程序不会在后台接收推送通知,它应该根据 documentation .

An Android application on an Android device doesn't need to be running to receive messages. The system will wake up the Android application via Intent broadcast when the message arrives, as long as the application is set up with the proper broadcast receiver and permissions.

尝试不同的通知发现当且仅当通知包含属性“消息”时它确实在关闭时收到推送通知,如果没有,它只是丢弃它。 (推送通知只是 JSON 对象)。

我的通知包含所有类型的属性,包括“alert”、“id”和“title”,但只有“message”让 Android 唤醒应用。

不起作用的示例通知:

{ event: 'message',
from: '947957531940',
collapse_key: 'do_not_collapse',
foreground: true,
payload:
{ alert: 'Mensaje de Prueba',
title: 'Titulo Mensaje de Prueba' } }

有效的示例通知:

{ event: 'message',
from: '947957531940',
message: 'Contenido del mensaje de prueba.',
collapse_key: 'do_not_collapse',
foreground: true,
payload:
{ alert: 'Mensaje de Prueba',
title: 'Titulo Mensaje de Prueba',
message: 'Contenido del mensaje de prueba.' } }

这是设计的 Android 标准还是我在我的应用中做错了什么?

我的应用是使用 Ionic 和 Cordova 开发的。

PD:请原谅我的英语。

编辑:

这是app.js 中.run 模块中的Android 推送代码,如ng-cordova说明指定:

if (ionic.Platform.isAndroid()){

var androidConfig = {
"senderID": "94*************",
"ecb": "window.casosPush"
};

try{
var pushNotification = window.plugins.pushNotification;
} catch (ex){

}

// Llamada en caso de exito
var successfn = function(result){
//alert("Success: " + result);
};

// Llamada en caso de error
var errorfn = function(result){
window.alert("Error: " + result);
};

// Llamada de casos de notificacion push
window.casosPush = function(notification){
switch (notification.event){
case 'registered':
if (notification.regid.length > 0){
$rootScope.data.token = notification.regid;
//alert('registration ID = ' + notification.regid);
}
break;

case 'message':

$rootScope.mensajes.unshift(notification.payload);
$localstorage.setArray('mensajes', $rootScope.mensajes);
alert(JSON.stringify(notification));
break;

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

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

// Llamada de registro con la plataforma GCM
pushNotification.register(successfn,errorfn,androidConfig);
} catch(notification){

}
}

最佳答案

在 stackoverflow 中搜索所有涉及 Cordova/Phonegap Push Plugin 的问题后,我找到了问题的根源。写在插件的源代码里,不应该。

问题是插件源代码要求推送通知有“消息”字段,以便在后台触发通知。它在 GCMIntentService.java 文件中指定。

if (extras.getString("message") != null && extras.getString("message").length() != 0) {
createNotification(context, extras);
}

最有用的帖子是这个answer还有这个issue在插件库中。因此,因为我无法控制推送服务器操作,所以我无法在推送通知中指定“消息”字段,所以我别无选择,只能重写源代码。

所以我重写了这样的代码:

@Override
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) {
if (extras.getString("alert") != null && extras.getString("alert").length() != 0) {
createNotification(context, extras);
}
}
}
}

这样,如果插件收到带有字段“alert”而不是“message”的推送通知,它就会触发本地通知。

然后,我更改了本地通知本身的代码:

public void createNotification(Context context, Bundle extras)
{
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String appName = getAppName(this);

Intent notificationIntent = new Intent(this, PushHandlerActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.putExtra("pushBundle", extras);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

int defaults = Notification.DEFAULT_ALL;

if (extras.getString("defaults") != null) {
try {
defaults = Integer.parseInt(extras.getString("defaults"));
} catch (NumberFormatException e) {}
}

NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context)
.setDefaults(defaults)
.setSmallIcon(context.getApplicationInfo().icon)
.setWhen(System.currentTimeMillis())
//.setContentTitle(extras.getString("title"))
.setContentTitle(extras.getString("alert"))
//.setTicker(extras.getString("title"))
.setTicker(extras.getString("alert"))
.setContentIntent(contentIntent)
.setAutoCancel(true);
/*
String message = extras.getString("message");
if (message != null) {
mBuilder.setContentText(message);
} else {
mBuilder.setContentText("<missing message content>");
}
*/
// Agregado mensaje predefinido
mBuilder.setContentText("Haz clic para más información");

String msgcnt = extras.getString("msgcnt");
if (msgcnt != null) {
mBuilder.setNumber(Integer.parseInt(msgcnt));
}

int notId = 0;

try {
notId = Integer.parseInt(extras.getString("notId"));
}
catch(NumberFormatException e) {
Log.e(TAG, "Number format exception - Error parsing Notification ID: " + e.getMessage());
}
catch(Exception e) {
Log.e(TAG, "Number format exception - Error parsing Notification ID" + e.getMessage());
}

mNotificationManager.notify((String) appName, notId, mBuilder.build());
}

现在通知栏中的通知将首先显示字段“警报”而不是“标题”,然后是预定义的消息而不是我的推送通知中不存在的字段“消息”。

然后我重新编译代码:

ionic platform rm android

ionic platform add android

ionic run android

所以 children ,当您为每个人编写插件时会发生这种情况,但您没有考虑一般情况,也没有很好地记录。该插件仅对推送通知中包含“消息”和“标题”字段的人有用。

我因此失去了两天的实习时间,我花时间写了这篇文章,这样其他人就不必写了。

关于android - Ionic/Cordova 应用程序在后台不接收推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31212507/

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