Cordova-plugin-firebase: Ändern des Push-Benachrichtigungssymbols - Problem mit leerem Android-Symbol im Jahr 2018

Erstellt am 6. Juli 2018  ·  22Kommentare  ·  Quelle: arnesson/cordova-plugin-firebase

Hallo zusammen,

Für Leute, die dieses Plugin mit Cordova 8+ verwenden, werden Sie möglicherweise feststellen, dass das Ändern Ihres Benachrichtigungssymbols nicht funktioniert und Sie auf das alte Problem "Benachrichtigungssymbol ist leeres Quadrat" auf Android stoßen. Dies geschieht, weil Android-Benachrichtigungssymbole eine einfache 1-farbige Form auf transparentem Hintergrund haben müssen und wenn Sie kein solches Symbol bereitgestellt haben, verwendet Android stattdessen das Anwendungssymbol. Das sind höchstwahrscheinlich volle und bunte Quadrate ohne transparenten Hintergrund.

Dies ist sehr ärgerlich, wenn Sie ein neues Ionic 3-Projekt einrichten und versuchen, dieses Plugin zu verwenden.

Readme here atm beschreibt nicht den korrekten Vorgang zum Ändern Ihres Symbols. Hier sind die Schritte, die Sie ausführen müssen, um das Symbol zu ändern:

0) Hör auf herum zu googeln und dir die Haare auszureißen. Folgen Sie dieser Anleitung Schritt für Schritt und Sie werden es zum Laufen bringen, vertrauen Sie mir.
1) Bereiten Sie eine Version Ihres Anwendungssymbols vor, die nur eine einfarbige Form auf transparentem Hintergrund hat
2) Gehe hier: http://romannurik.github.io/AndroidAssetStudio/icons-notification.html#source.type=clipart&source.clipart=ac_unit&source.space.trim=1&source.space.pad=0&name=notification_icon drücke auf "Bild" oben links, laden Sie Ihr Symbol hoch, schneiden Sie es zu / fügen Sie bei Bedarf Polster hinzu
3) Wenn es gut aussieht, drücken Sie den Pfeil oben rechts, um die 'drawable' Ordner herunterzuladen. Es gibt Ihnen eine ZIP-Datei mit dem Ordner res und 5 Ordnern drawable-xxx mit jeweils unterschiedlicher Größe Ihres Symbols
4) Kopieren Sie diese zeichnerischen Ordner irgendwo in Ihr Projekt. Für mich habe ich sie neben Symbol- und Begrüßungsbildschirmressourcen kopiert: project-root/resources/android/notification_icon
5) Konfigurieren Sie Ihre config.xml-Datei, um diese Dateien <resource-file /> Anweisung Beachten Sie, dass seit Crodova 8.x der richtige Zielpfad app/src/main/res . Auf Cordova < 8 waren es nur res (da zuvor die Ressourcendateien im Verzeichnis platforms/android/res gespeichert wurden und jetzt in platforms/android/app/main/res ). Die meisten der online "gelösten" Probleme mit dem leeren Android-Benachrichtigungssymbol erwähnen dies nicht.

<platform name="android">
(...) 
  <resource-file src="resources/android/notification_icon/drawable-mdpi/notification_icon.png" target="app/src/main/res/drawable-mdpi/notification_icon.png" />
  <resource-file src="resources/android/notification_icon/drawable-hdpi/notification_icon.png" target="app/src/main/res/drawable-hdpi/notification_icon.png" />
  <resource-file src="resources/android/notification_icon/drawable-xhdpi/notification_icon.png" target="app/src/main/res/drawable-xhdpi/notification_icon.png" />
  <resource-file src="resources/android/notification_icon/drawable-xxhdpi/notification_icon.png" target="app/src/main/res/drawable-xxhdpi/notification_icon.png" />
  <resource-file src="resources/android/notification_icon/drawable-xxxhdpi/notification_icon.png" target="app/src/main/res/drawable-xxxhdpi/notification_icon.png" />
</platform>

6) Jetzt, da Sie Ihr Symbol in der Anwendung als zeichenbare Ressource haben, müssen Sie Ihre Anwendung zwingen, es zu verwenden. Unabhängig davon, was hier in der Readme-Datei steht, hat die automatische Erkennung der zeichnerischen Ressource namens 'notification_icon' bei mir nicht funktioniert. Ich bin mir nicht genau sicher warum, weil es hier in der Codebasis zu sein scheint: https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/android/FirebasePluginMessagingService.java#L140 aber ich bin Ich vermute, dass sich bei der Ressourcenerkennung in den neuesten Android-Versionen etwas geändert hat.
7) Aus diesem Grund war die einzige andere Lösung, die ich verwenden konnte, das Senden des Parameters icon vom Backend beim Senden von Push-Benachrichtigungen an Firebase. Beachten Sie, dass an ihrer API wahrscheinlich einige Änderungen vorgenommen werden, da es Probleme beim korrekten Zusammenführen der Teile notification und android der Nutzlast gibt. Aus diesem Grund müssen Sie den Symbolparameter zum notification Teil des json hinzufügen. Die Verwendung von Android-spezifischen Parametern funktioniert nicht.

Die Benachrichtigungsnutzlast, die Sie von Ihrem Backend an Firebase senden, muss also ungefähr so ​​aussehen: DIES IST DIE EINZIGE VERSION, DIE FUNKTIONIERT

{
  notification: {
    body: 'Imma push your notification if you know what i mean!',
    icon: 'notification_icon',
  },
  data: { someExtraData: 'goes_here' }
}

Lassen Sie mich wiederholen - DIE VERWENDUNG VON ANDROID-SPEZIFISCHEN PARAMEN FUNKTIONIERT NICHT MIT FIREBASE AB Juli 2018 - UNTEN FUNKTIONIERT NICHT UND IHR BENACHRICHTIGUNGSSYMBOL ÄNDERT UNABHÄNGIG VON IHRER DOKUMENTATION :

{
  notification: {
    body: 'Imma push your notification if you know what i mean!'
  },
  data: { someExtraData: 'goes_here_if_you_need_it' },
  android: { 
    icon: 'notification_icon'
  } 
}

8) Nachdem Sie alle Schritte abgeschlossen haben, können Sie Ihr neues Symbol jetzt testen. Ich empfehle dringend, es im Android-Emulator zu testen - einige der Android-Skins übernehmen die Benachrichtigungsleiste und verwenden das Anwendungssymbol, unabhängig davon, was Sie einstellen (dh MIUI von xiaomi). Ich habe auch festgestellt, dass die Symbole manchmal zwischengespeichert werden. Aus diesem Grund ist es am sichersten, es im Simulator auf einem frisch erstellten AVD zu testen. Entfernen Sie Ihre App zwischen den Testläufen manuell und starten Sie den Simulator / das Gerät neu, um Caching-Probleme zu vermeiden.

Ich hoffe, dass diese lange Beschreibung anderen in Zukunft helfen wird, da die Hürde, die man überwinden muss, um das kleine 10x10-Symbol zu ändern, einfach zu hoch ist ...

Hilfreichster Kommentar

Bitte testen Sie, ob dieser dem config.xml <platform name="android"> Tag hinzugefügte Code das Symbol als Standard-Benachrichtigungssymbol hinzufügt.

<config-file parent="/manifest/application/" target="app/src/main/AndroidManifest.xml">
    <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_icon" />
</config-file>

Dies funktioniert für mich beim Senden über das Firebase Cloud Messaging-Panel oder das Back-End ohne Symbol in der Nutzlast.
Bitte posten Sie hier das Feedback.
Wenn es funktioniert, wird Ihr diesem Code hinzugefügtes Tutorial vielen Leuten helfen und sollte eine PR öffnen, um es der README hinzuzufügen.

Alle 22 Kommentare

Bitte testen Sie, ob dieser dem config.xml <platform name="android"> Tag hinzugefügte Code das Symbol als Standard-Benachrichtigungssymbol hinzufügt.

<config-file parent="/manifest/application/" target="app/src/main/AndroidManifest.xml">
    <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_icon" />
</config-file>

Dies funktioniert für mich beim Senden über das Firebase Cloud Messaging-Panel oder das Back-End ohne Symbol in der Nutzlast.
Bitte posten Sie hier das Feedback.
Wenn es funktioniert, wird Ihr diesem Code hinzugefügtes Tutorial vielen Leuten helfen und sollte eine PR öffnen, um es der README hinzuzufügen.

Danke @madsheep !! du hast mein Leben gerettet !!

Hallo, danke für die moralische Unterstützung und das Gefühl, dass ich nicht der einzige bin, der in diesem Schlamassel gelandet ist. Leider bin ich jedoch wieder zu Pre-Step 0 zurückgekehrt und verliere unterwegs Haare.

Wenn ich versuche, die Benachrichtigung über die Methode http/post zu senden, erhalte ich Fehlermeldungen von der Firebase-API, dass der Json ungültig ist. Ich habe beide Wege probiert:

Das erhalte ich, wenn ich das Symbol als message: { notification: { icon: 'notification_icon', ... }, ... }

Error code=400, message=Invalid JSON payload received. Unknown name "icon" at 'message.notification': Cannot find field., status=INVALID_ARGUMENT, details=[@type=type.googleapis.com/google.rpc.BadRequest, fieldViolations=[field=message.notification, description=Invalid JSON payload received. Unknown name "icon" at 'message.notification': Cannot find field.]]

Dies ist die Meldung, die ich erhalte, wenn ich das Symbol als message: { android: { icon: 'notification_icon' }, ... }

Error code=400, message=Invalid JSON payload received. Unknown name "icon" at 'message.android': Cannot find field., status=INVALID_ARGUMENT, details=[@type=type.googleapis.com/google.rpc.BadRequest, fieldViolations=[field=message.android, description=Invalid JSON payload received. Unknown name "icon" at 'message.android': Cannot find field.]]

aber vielleicht verwende ich dies im falschen Kontext (unser Back-End-Cloud-Code sendet eine Benachrichtigung an Client-Apps über Firebase Cloud Messaging).

das hat bei mir gut funktioniert (ich sende Benachrichtigungen mit Firebase-Funktionen):
const payload = { notification: { title: ........, body: ........., icon: 'notification_icon' } };

Danke, das führt bei mir zum ersten der beiden Fehler. Ich verwende den REST-Dienst über eine Javascript-/Anfragebibliothek und sende gemäß dem Format https://firebase.google.com/docs/cloud-messaging/js/first-message . Ich nehme an, das Nachrichten-/Benachrichtigungsformat ist in https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#Notification beschrieben .

Wenn ich dies lese, deutet dies sogar darauf hin, dass sich das Symbol in message.android.notification.icon , dh eine Ebene tiefer.

Ich habe es gerade versucht, und das funktioniert tatsächlich für mich! Ich nehme an, es hängt vom Serverprotokoll ab, wie die Nutzlast strukturiert sein soll ...

Danke an alle für diese Diskussion. Es hat endlich dazu geführt, dass ich aufgehört habe, mir die Haare auszureißen...

schließen wie gelöst

@madsheep Es funktioniert nicht. Nach dem Hinzufügen von 'Symbol' unter Benachrichtigung in der Cloud-Funktion wird folgender Fehler ausgegeben:

{ Error: Invalid JSON payload received. Unknown name "icon" at 'message.notification': Cannot find field

FehlerInfo:
{ Code: 'Nachricht/ungültiges-Argument',
Nachricht: 'Ungültige JSON-Nutzlast empfangen. Unbekannter Name "Symbol" bei 'message.notification': Feld kann nicht gefunden werden.' },
codePrefix: 'messaging' }

Versuchen Sie es mit message.android.notification.icon anstelle von message.notification.icon .

@madsheep @guilhermehtk Bei mir hat es funktioniert! Vielen Dank.

Bitte testen Sie, ob dieser dem config.xml <platform name="android"> Tag hinzugefügte Code das Symbol als Standard-Benachrichtigungssymbol hinzufügt.

<config-file parent="/manifest/application/" target="app/src/main/AndroidManifest.xml">
    <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_icon" />
</config-file>

Dies funktioniert für mich beim Senden über das Firebase Cloud Messaging-Panel oder das Back-End ohne Symbol in der Nutzlast.
Bitte posten Sie hier das Feedback.
Wenn es funktioniert, wird Ihr diesem Code hinzugefügtes Tutorial vielen Leuten helfen und sollte eine PR öffnen, um es der README hinzuzufügen.

Du hast gerade meinen Tag gemacht,

Wenn jemand ein Problem beim Build hat, wie?

AAPT: Fehler: ungebundenes Präfix.

dann versuche The . hinzuzufügen

xmlns:android= " http://schemas.android.com/apk/res/android "

Attribut sollte der Wurzel hinzugefügt werdenTag in der config.xml

du hast meinen Tag gerettet!

Für jeden, der 2019 mit diesem Problem mit Android Build 7.1.1 konfrontiert ist, hat sich der Ressourcenordner anscheinend geändert !!

Bei der Überprüfung von Android Studio und den generierten Dateien hat Folgendes für mich funktioniert:

<resource-file src="resources/android/notification/notification_icon.png" target="app/src/main/res/drawable/notification_icon.png" />
<config-file parent="/manifest/application/" target="app/src/main/AndroidManifest.xml">
            <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_icon" />
</config-file>

Die 1. Zeile ist der wichtige Teil, da das für mich falsch war.

@alarv Das Symbol wird für einige Android-Telefone nicht

Hey @bioyeneye welche Modelle? Welche Android-Version läuft auf ihnen? Lager oder sonstiges?

@bioyeneye Ich habe eine andere Lösung für Ionic 4, damit die Symbole auf allen Android-Geräten funktionieren.
Ich verwende kein PNG für das Symbol, sondern XML. Ich verwende einen Hook, um dies in die folgenden Verzeichnisse aufzunehmen:

'res/drawable-hdpi',
'res/drawable-mdpi',
'res/drawable-xhdpi',
'res/drawable-xxhdpi',
'res/drawable-xxxhdpi',
'res/mipmap-hdpi',
'res/mipmap-mdpi',
'res/mipmap-xhdpi',
'res/mipmap-xxhdpi',
'res/mipmap-xxxhdpi'

Erstellen Sie ein Dateibeispiel:
android_notification_resources.js

Fügen Sie in dieser neuen Hook-Datei Folgendes hinzu:


// START
const fs = erfordern("fs");
const path = require("Pfad");
const Q = erfordern("q");

var sourceDir = 'resources/android/notification_icon'; // hier ist dein Icon
var platformDir = 'platforms/android/app/src/main/';
var resourceDirs = [
'res/drawable-hdpi',
'res/drawable-mdpi',
'res/drawable-xhdpi',
'res/drawable-xxhdpi',
'res/drawable-xxxhdpi',
'res/mipmap-hdpi',
'res/mipmap-mdpi',
'res/mipmap-xhdpi',
'res/mipmap-xxhdpi',
'res/mipmap-xxxhdpi'
];

module.exports = function(ctx) {

if (ctx.opts.platforms.indexOf('android') < 0) {
Rückkehr;
}

var verzögert = Q.defer();
var androidPlatformDir = path.join(ctx.opts.projectRoot, platformDir);
var customResourcesDir = path.join(ctx.opts.projectRoot, sourceDir);

Funktion kopieren (src, dest) {
var verzögert = Q.defer();

fs.stat(src, function(err, stats) {
  if (err || !stats.isFile()) {
    return deferred.reject(err);
  }

  fs.stat(path.dirname(dest), function(err, stats) {
    if (err || !stats.isDirectory()) {
      return deferred.reject(err);
    }

    var rs = fs.createReadStream(src);

    rs.on('error', function(err) {
      console.error(err.stack);
      deferred.reject(err);
    });

    var ws = fs.createWriteStream(dest);

    ws.on('error', function(err) {
      console.error(err.stack);
      deferred.reject(err);
    });

    ws.on('close', function() {
      deferred.resolve();
    });

    rs.pipe(ws);
  });
});

return deferred.promise;

}

fs.stat(customResourcesDir, function(err, stats) {
if (err || !stats.isDirectory()) {
zurückgeben zurückgestellt.resolve();
}

fs.readdir(customResourcesDir, function(err, files) {
  var copies = [];

  for (var i in files) {
    for (var j in resourceDirs) {
      var filePath = path.join(ctx.opts.projectRoot, sourceDir, files[i]);
      var destPath = path.join(androidPlatformDir, resourceDirs[j], files[i]);

      copies.push([filePath, destPath]);
    }
  }

  copies.map(function(args) {
    return copy.apply(copy, args);
  });

  Q.all(copies).then(function(r) {
    deferred.resolve();
  }, function(err) {
    console.error(err.stack);
    deferred.reject(err);
  });
});

});

zurückgestellt.Versprechen zurückgeben;
}
// ENDE


Fügen Sie in Ihrer config.xml diese Zeile hinzu, um Ihren Hook einzuschließen:

Der Hook kopiert Ihr Symbol aus Ihrem Ressourcenordner und fügt es in verschiedene Drawables-Ordner hinzu. Ich habe dies getan, um sicherzustellen, dass es für alle Geräte funktioniert. So weit, ist es gut.

Lass mich wissen, ob es bei dir funktioniert hat! Beifall

@RobinGiel Danke, ich verwende ionic 3, wird das funktionieren?

Hallo @Flucadetena
Android 9
Cordova-Plattformen: Android 7.1.1

@bioyeneye Ich verwende auch ionic 3. Ich prüfe alles und melde mich. ;)

@bioyeneye Ja, das wird es, Sie müssen ein paar Zeilen vom Hook ändern.

var sourceDir = 'resources/android/notification_icon';
var platformDir = 'Plattformen/Android';

und vielleicht statt const Q = require("q"); Entfernen Sie diese Zeile und verwenden Sie sie hier. Beispiel:

module.exports = function(ctx) {

if (ctx.opts.platforms.indexOf('android') < 0) {
Rückkehr;
}

var Q = ctx.requireCordovaModule('q'); // benutze es hier
var verzögert = Q.defer();
var androidPlatformDir = path.join(ctx.opts.projectRoot, platformDir);
var customResourcesDir = path.join(ctx.opts.projectRoot, sourceDir);


Fügen Sie die config.xml hinzu, die denselben Hook vor_build und before_run aufruft:

<hook type="before_run"         src="hooks/android_notification_resources.js" />
<hook type="before_build"       src="hooks/android_notification_resources.js" />

Bitte testen Sie, ob dieser dem config.xml <platform name="android"> Tag hinzugefügte Code das Symbol als Standard-Benachrichtigungssymbol hinzufügt.

<config-file parent="/manifest/application/" target="app/src/main/AndroidManifest.xml">
    <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_icon" />
</config-file>

Dies funktioniert für mich beim Senden über das Firebase Cloud Messaging-Panel oder das Back-End ohne Symbol in der Nutzlast.
Bitte posten Sie hier das Feedback.
Wenn es funktioniert, wird Ihr diesem Code hinzugefügtes Tutorial vielen Leuten helfen und sollte eine PR öffnen, um es der README hinzuzufügen.

Du hast gerade meinen Tag gemacht,

Wenn jemand ein Problem beim Build hat, wie?

AAPT: Fehler: ungebundenes Präfix.

dann versuche The . hinzuzufügen

xmlns:android= " http://schemas.android.com/apk/res/android "

Das Attribut sollte dem Root-Tag in der config.xml hinzugefügt werden

Das hier funktioniert für mich, aber das Symbol scheint unglaublich klein zu sein. Was ist die richtige Größe der Datei, die wir verwenden sollten?

Bearbeiten: Ich habe 256 x 256 hinzugefügt, zeigt jedoch immer noch einen kleinen Punkt in der Statusleiste an. Wenn Sie die Statusleiste nach unten ziehen, wird eine etwas größere angezeigt

ES IST

Du bist mein Lebensretter!! Danke schön!!!
Anmerkungen:
Ich füge Farbe hinzu: '#e50012' im Benachrichtigungsbereich, um die Farbe des Symbols zu ändern. (ändern Sie es in Ihre Farbe).
Ex:
{
"name": "my_notification",
"Benachrichtigung": {
"body": "Benachrichtigungsstelle",
"title": "Titel der Benachrichtigung",
"Farbe": "#e50012"
},
"Daten":{ ... }
}

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen