Cordova-plugin-firebase: Modification de l'icône de notification push - problème d'icône Android vierge en 2018

Créé le 6 juil. 2018  ·  22Commentaires  ·  Source: arnesson/cordova-plugin-firebase

Salut tout le monde,

Pour les personnes utilisant ce plugin avec cordova 8+, vous constaterez peut-être que la modification de votre icône de notification ne fonctionnera pas et vous appuyez sur l'ancien problème « l'icône de notification est un carré vide » sur Android. Cela se produit parce que les icônes de notification Android doivent être de forme simple 1 couleur sur fond transparent et si vous n'avez pas fourni une telle icône, Android utilisera l'icône de l'application à la place. Ce sont très probablement des carrés pleins et colorés sans fond transparent.

C'est très ennuyeux lors de la configuration d'un nouveau projet Ionic 3 et en essayant d'utiliser ce plugin.

Lisez-moi ici atm ne décrit pas le processus de modification de votre icône correctement. Voici les étapes à suivre pour changer l'icône :

0) Arrêtez de chercher sur Google et de vous arracher les cheveux. Suivez ces instructions étape par étape et vous le ferez fonctionner, croyez-moi.
1) Préparez une version de l'icône de votre application qui n'est qu'une forme de 1 couleur sur fond transparent
2) Allez ici : 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 appuyez sur "image" en haut à gauche, téléchargez votre icône, coupez-la/ajoutez un rembourrage si besoin est
3) Si cela semble bon, appuyez sur la flèche en haut à droite pour télécharger les dossiers « dessinables ». Il vous donnera un zip avec res dossier drawable-xxx dossiers chacun avec une taille différente de votre icône
4) Copiez ces dossiers pouvant être dessinés quelque part dans votre projet. Pour moi, je les ai copiés à côté des ressources de l'icône et de l'écran de démarrage : project-root/resources/android/notification_icon
5) Configurez votre fichier config.xml pour copier ces fichiers dans votre application Android à l'aide <resource-file /> directive Notez que depuis crodova 8.x, le chemin cible correct est app/src/main/res . Sur cordova < 8, c'était juste res (comme auparavant, les fichiers de ressources étaient conservés dans le répertoire platforms/android/res et maintenant ils sont dans platforms/android/app/main/res ). La plupart des problèmes "résolus" en ligne sur l'icône de notification Android vierge ne le mentionnent pas.

<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) Maintenant que vous avez votre icône dans l'application en tant que ressource pouvant être dessinée, vous devez forcer votre application à l'utiliser. Indépendamment de ce qui est écrit dans le fichier readme ici, la découverte automatique de la ressource pouvant être dessinée appelée 'notification_icon' n'a pas fonctionné pour moi. Je ne sais pas exactement pourquoi car cela semble être dans la base de code ici : https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/android/FirebasePluginMessagingService.java#L140 mais je suis en supposant que quelque chose a changé avec la découverte de ressources sur les dernières versions d'Android.
7) À cause de cela, la seule autre solution que je pouvais utiliser consistait à envoyer le paramètre icon depuis le backend lors de l'envoi d'une notification push à firebase. Notez que leur API subit probablement quelques modifications car elle a des problèmes avec la fusion correcte des parties notification et android de la charge utile. Pour cette raison, vous devez ajouter le paramètre d'icône à la partie notification du json. L'utilisation de paramètres spécifiques à Android ne fonctionnera pas.

Donc, la charge utile de notification que vous envoyez à firebase depuis votre backend doit ressembler à ceci: C'EST LA SEULE VERSION QUI FONCTIONNE

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

Permettez-moi de réitérer - L' UTILISATION DES PARAMÈTRES SPÉCIFIQUES À ANDROID NE FONCTIONNE PAS AVEC FIREBASE À PARTIR DE Juillet 2018 - CI-DESSOUS NE FONCTIONNERA PAS ET VOTRE ICNE DE NOTIFICATION NE CHANGERA PAS, PEU IMPORTE CE QUE LEUR DOCUMENTATION DIT :

{
  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) Une fois toutes les étapes terminées, vous êtes maintenant prêt à tester votre nouvelle icône. Je suggère fortement de le tester dans l'émulateur Android - certains skins Android prennent en charge la barre de notification et utilisent l'icône de l'application indépendamment de ce que vous définissez (c'est-à-dire MIUI de xiaomi). J'ai aussi trouvé parfois que les icônes étaient mises en cache. Pour cette raison, le tester dans un simulateur sur un AVD fraîchement créé est votre pari le plus sûr. Supprimez votre application manuellement entre les tests et redémarrez le simulateur/l'appareil pour éviter les problèmes de mise en cache.

J'espère que ce long article en aidera d'autres à l'avenir, car le nombre d'obstacles à franchir pour changer la petite icône 10x10 est tout simplement trop élevé...

Commentaire le plus utile

Veuillez tester si ce code ajouté à la balise <platform name="android"> config.xml ajoutera l'icône comme icône de notification par défaut.

<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>

Cela fonctionne pour moi en envoyant par le panneau Firebase Cloud Messaging ou le back-end sans icône sur la charge utile.
S'il vous plaît poster ici les commentaires.
Si cela fonctionne, votre tutoriel ajouté à ce code aidera beaucoup de gens et devrait ouvrir un PR pour l'ajouter au README.

Tous les 22 commentaires

Veuillez tester si ce code ajouté à la balise <platform name="android"> config.xml ajoutera l'icône comme icône de notification par défaut.

<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>

Cela fonctionne pour moi en envoyant par le panneau Firebase Cloud Messaging ou le back-end sans icône sur la charge utile.
S'il vous plaît poster ici les commentaires.
Si cela fonctionne, votre tutoriel ajouté à ce code aidera beaucoup de gens et devrait ouvrir un PR pour l'ajouter au README.

Merci @madsheep !! tu m'as sauvé la vie !!

Salut, merci pour le soutien moral et pour me donner le sentiment que je ne suis pas le seul à avoir fini dans ce pétrin. Cependant, malheureusement, je suis revenu à la pré-étape 0, perdant des cheveux en cours de route.

Lorsque j'essaie d'envoyer la notification via la méthode http/post, j'obtiens des erreurs de l'api firebase indiquant que le json n'est pas valide. J'ai essayé les deux manières :

C'est ce que j'obtiens en incluant l'icône comme 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.]]

C'est le message que je reçois en incluant l'icône comme 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.]]

mais peut-être que je l'utilise dans le mauvais contexte (notre code cloud backend envoie une notification aux applications clientes à l'aide de la messagerie cloud firebase).

cela a bien fonctionné pour moi (j'envoie des notifications en utilisant les fonctions firebase):
const payload = { notification: { title: ........, body: ........., icon: 'notification_icon' } };

Merci, cela entraîne pour moi la première des deux erreurs. J'utilise le service REST via une bibliothèque javascript/request, et j'envoie selon le format https://firebase.google.com/docs/cloud-messaging/js/first-message . Je suppose que le format de message/notification est décrit dans https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#Notification .

En fait, quand je lis ceci, cela suggère que l'icône devrait être en message.android.notification.icon , c'est-à-dire un niveau plus profond.

Je viens d'essayer et ça marche vraiment pour moi ! Donc, je suppose que cela dépend du protocole du serveur comment la charge utile doit être structurée ...

Merci à tous pour cette discussion. Cela m'a finalement permis d'arrêter de m'arracher les cheveux...

fermeture comme résolu

@madsheep Cela ne fonctionne pas. Après avoir ajouté « icône » sous la notification dans la fonction cloud, l'erreur suivante est générée :

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

errorInfo :
{ code : 'messagerie/argument-invalide',
message : " Charge utile JSON non valide reçue. Nom inconnu "icône" dans 'message.notification' : champ introuvable.' },
codePrefix : « messagerie » }

essayez message.android.notification.icon au lieu de message.notification.icon .

@madsheep @guilhermehtk Cela a fonctionné pour moi ! Merci.

Veuillez tester si ce code ajouté à la balise <platform name="android"> config.xml ajoutera l'icône comme icône de notification par défaut.

<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>

Cela fonctionne pour moi en envoyant par le panneau Firebase Cloud Messaging ou le back-end sans icône sur la charge utile.
S'il vous plaît poster ici les commentaires.
Si cela fonctionne, votre tutoriel ajouté à ce code aidera beaucoup de gens et devrait ouvrir un PR pour l'ajouter au README.

Vous venez de faire ma journée,

si quelqu'un rencontre un problème dans la construction comme

AAPT : erreur : préfixe non lié.

puis essayez d'ajouter le

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

l'attribut doit être ajouté à la racinebalise à l'intérieur du config.xml

tu m'as sauvé la journée !

Pour toute personne confrontée à ce problème en 2019 avec la version Android 7.1.1, le dossier des ressources a changé, semble-t-il !!

En vérifiant Android studio et les fichiers générés, voici ce qui a fonctionné pour moi :

<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>

La 1ère ligne est la partie importante, car c'était faux pour moi.

@alarv L'icône ne s'affiche pas pour certains téléphones Android, aucune aide à ce sujet s'il vous plaît.

@bioyeneye quels modèles ? Quelle version d'Android utilisent-ils ? Action ou autre ?

@bioyeneye J'ai une autre solution pour Ionic 4 pour que les icônes fonctionnent sur tous les appareils Android.
Je n'utilise pas de png pour icône mais XML. J'utilise un crochet pour l'inclure dans les répertoires suivants :

'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'

créer un exemple de fichier :
android_notification_resources.js

Dans ce nouveau fichier hook, ajoutez :


// COMMENCER
const fs = require("fs");
const chemin = require("chemin");
const Q = exiger("q");

var sourceDir = 'ressources/android/notification_icon'; // c'est ici que se trouve votre icône
var platformDir = 'plates-formes/android/app/src/main/';
var rép_ressource = [
'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 = fonction(ctx) {

if (ctx.opts.platforms.indexOf('android') < 0) {
retourner;
}

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

fonction copy(src, dest) {
var deferred = 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()) {
return deferred.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);
  });
});

});

retour différé.promesse;
}
// FINIR


dans votre config.xml ajoutez cette ligne pour inclure votre hook :

Ce que le crochet fera, c'est copier votre icône à partir de votre dossier de ressources et l'ajouter dans différents dossiers pouvant être dessinés. J'ai fait cela pour m'assurer que cela fonctionne pour tous les appareils. Jusqu'ici tout va bien.

Faites-moi savoir si cela a fonctionné pour vous! à votre santé

@RobinGiel Merci, j'utilise ionic 3, cela fonctionnera-t-il ?

Bonjour @Flucadetena
Android 9
Plateformes Cordova : Android 7.1.1

@bioyeneye J'utilise aussi ionic 3. Je vais tout vérifier et je vous tiens au courant. ;)

@bioyeneye Oui, vous devrez modifier quelques lignes du crochet.

var sourceDir = 'ressources/android/notification_icon';
var platformDir = 'plateformes/android';

et peut-être au lieu d'utiliser const Q = require("q"); supprimez cette ligne et utilisez-la ici .. exemple :

module.exports = fonction(ctx) {

if (ctx.opts.platforms.indexOf('android') < 0) {
retourner;
}

var Q = ctx.requireCordovaModule('q'); // l'utiliser ici
var deferred = Q.defer();
var androidPlatformDir = path.join(ctx.opts.projectRoot, platformDir);
var customResourcesDir = path.join(ctx.opts.projectRoot, sourceDir);


Ajoutez le config.xml en appelant le même exemple de hook before_build et before_run :

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

Veuillez tester si ce code ajouté à la balise <platform name="android"> config.xml ajoutera l'icône comme icône de notification par défaut.

<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>

Cela fonctionne pour moi en envoyant par le panneau Firebase Cloud Messaging ou le back-end sans icône sur la charge utile.
S'il vous plaît poster ici les commentaires.
Si cela fonctionne, votre tutoriel ajouté à ce code aidera beaucoup de gens et devrait ouvrir un PR pour l'ajouter au README.

Vous venez de faire ma journée,

si quelqu'un rencontre un problème dans la construction comme

AAPT : erreur : préfixe non lié.

puis essayez d'ajouter le

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

L'attribut doit être ajouté à la balise racine dans le fichier config.xml

Cela fonctionne pour moi, mais l'icône semble être incroyablement petite, quelle est la taille appropriée du fichier que nous devrions utiliser ?

Edit : j'ai ajouté un 256x256 mais montre toujours un petit point sur la barre d'état. faire glisser la barre d'état vers le bas en affiche une légèrement plus grande

C'EST

Tu es ma bouée de sauvetage !! Merci!!!
Remarques:
J'ajoute de la couleur : « #e50012 » dans la section de notification pour changer la couleur de l'icône. (changez-la quelle que soit votre couleur).
ex:
{
"nom": "ma_notification",
"notification": {
"body": "Organisme de notification",
"title": "Titre de la notification",
"couleur": "#e50012"
},
"Les données":{ ... }
}

Cette page vous a été utile?
0 / 5 - 0 notes