Cordova-plugin-firebase: Mengubah ikon pemberitahuan push - masalah ikon android kosong pada tahun 2018

Dibuat pada 6 Jul 2018  ·  22Komentar  ·  Sumber: arnesson/cordova-plugin-firebase

Hai semuanya,

Untuk orang yang menggunakan plugin ini dengan cordova 8+ Anda mungkin menemukan bahwa mengubah ikon notifikasi Anda tidak akan berfungsi dan Anda menekan masalah lama 'ikon notifikasi adalah kotak kosong' di Android. Ini terjadi karena ikon notifikasi android harus berbentuk 1 warna sederhana pada latar belakang transparan dan jika Anda belum menyediakan ikon seperti itu, android akan menggunakan ikon aplikasi sebagai gantinya. Itu kemungkinan besar adalah kotak penuh dan berwarna-warni tanpa latar belakang transparan.

Ini sangat mengganggu ketika mengatur proyek Ionic 3 baru dan mencoba menggunakan plugin ini.

Readme here atm tidak menjelaskan proses mengubah ikon Anda dengan benar. Berikut adalah langkah-langkah yang perlu Anda ambil untuk mengubah ikon:

0) Berhenti googling dan menarik rambut Anda keluar. Ikuti instruksi ini selangkah demi selangkah dan Anda akan membuatnya bekerja, percayalah.
1) Siapkan versi ikon aplikasi Anda yang hanya berbentuk 1 warna dengan latar belakang transparan
2) Buka di sini: 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 tekan "gambar" di kiri atas, unggah ikon Anda, potong/tambahkan bantalan jika perlu
3) Jika terlihat bagus tekan panah di kanan atas untuk mengunduh folder 'drawable'. Ini akan memberi Anda zip dengan folder res di dalamnya dan 5 folder drawable-xxx masing-masing dengan ukuran ikon yang berbeda
4) Salin folder yang dapat digambar itu di suatu tempat ke dalam proyek Anda. Bagi saya, saya menyalinnya di sebelah ikon dan sumber daya layar splash: project-root/resources/android/notification_icon
5) Konfigurasikan file config.xml Anda untuk menyalin file-file tersebut di dalam aplikasi Android Anda menggunakan direktif <resource-file /> . Perhatikan bahwa sejak crodova 8.x jalur target yang benar adalah app/src/main/res . Pada cordova < 8 itu hanya res (seperti sebelumnya file sumber daya disimpan di direktori platforms/android/res dan sekarang mereka berada di platforms/android/app/main/res ). Sebagian besar masalah 'terpecahkan' online pada ikon notifikasi android kosong tidak menyebutkan itu.

<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) Sekarang setelah Anda memiliki ikon di aplikasi sebagai sumber daya yang dapat digambar, Anda perlu memaksa aplikasi Anda untuk menggunakannya. Terlepas dari apa yang tertulis di readme di sini, penemuan otomatis sumber daya yang dapat digambar yang disebut 'notification_icon' tidak berfungsi untuk saya. Saya tidak yakin mengapa karena tampaknya ada di basis kode di sini: https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/Android/FirebasePluginMessagingService.java#L140 tapi saya menebak ada sesuatu yang berubah dengan penemuan sumber daya pada versi terbaru dari android.
7) Karena itu satu-satunya solusi lain yang dapat saya gunakan adalah mengirim parameter icon dari backend saat mengirim pemberitahuan push ke firebase. Perhatikan bahwa api mereka mungkin mengalami beberapa perubahan karena memiliki masalah dalam menggabungkan bagian payload dengan benar notification dan android . Untuk alasan itu Anda harus menambahkan param ikon ke bagian notification dari json. Menggunakan params spesifikasi Android tidak akan berfungsi.

Jadi muatan notifikasi yang Anda kirim ke firebase dari backend Anda harus terlihat seperti ini: INI ADALAH SATU-SATUNYA VERSI YANG BERFUNGSI

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

Izinkan saya mengulangi - MENGGUNAKAN PARAMS KHUSUS ANDROID TIDAK BEKERJA DENGAN FIREBASE PER Juli 2018 - DI BAWAH INI TIDAK AKAN BEKERJA DAN IKON PEMBERITAHUAN ANDA TIDAK AKAN BERUBAH TERLEPAS DARI APA DOKUMENTASI MEREKA KATAKAN :

{
  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) Dengan semua langkah selesai, Anda sekarang siap untuk menguji ikon baru Anda. Saya sangat menyarankan untuk mengujinya di dalam emulator android - beberapa skin android mengambil alih bilah notifikasi dan menggunakan ikon aplikasi terlepas dari apa yang Anda atur (yaitu MIUI dari xiaomi). Saya juga menemukan terkadang ikon di-cache. Oleh karena itu, mengujinya dalam simulator pada AVD yang baru dibuat adalah taruhan teraman Anda. Hapus aplikasi Anda secara manual di sela-sela pengujian dan mulai ulang simluator/perangkat untuk menghindari masalah caching.

Saya harap tulisan panjang ini akan membantu orang lain di masa depan, karena jumlah rintangan yang harus dilalui seseorang untuk mengubah ikon kecil 10x10 sangat tinggi ...

Komentar yang paling membantu

Silakan uji apakah kode ini ditambahkan ke config.xml tag <platform name="android"> akan menambahkan ikon sebagai ikon pemberitahuan default.

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

Ini berfungsi untuk saya mengirim melalui panel Firebase Cloud Messaging atau back-end tanpa ikon di payload.
Silakan posting di sini umpan balik.
Jika berhasil, tutorial Anda yang ditambahkan ke kode ini akan membantu banyak orang dan harus membuka PR untuk menambahkannya ke README.

Semua 22 komentar

Silakan uji apakah kode ini ditambahkan ke config.xml tag <platform name="android"> akan menambahkan ikon sebagai ikon pemberitahuan default.

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

Ini berfungsi untuk saya mengirim melalui panel Firebase Cloud Messaging atau back-end tanpa ikon di payload.
Silakan posting di sini umpan balik.
Jika berhasil, tutorial Anda yang ditambahkan ke kode ini akan membantu banyak orang dan harus membuka PR untuk menambahkannya ke README.

Terima kasih @madsheep !! kau telah menyelamatkan hidupku !!

Hai, terima kasih atas dukungan moralnya, dan memberi saya perasaan bahwa saya bukan satu-satunya yang berakhir dalam kekacauan ini. Namun, sayangnya, saya tertarik kembali ke pra-langkah 0, kehilangan rambut di tengah jalan.

Ketika saya mencoba mengirim pemberitahuan melalui metode http/post, saya mendapatkan kesalahan dari api firebase bahwa json tidak valid. Saya sudah mencoba kedua cara:

Inilah yang saya dapatkan ketika menyertakan ikon sebagai 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.]]

Ini adalah pesan yang saya dapatkan saat menyertakan ikon sebagai 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.]]

tapi mungkin saya menggunakan ini dalam konteks yang salah (kode cloud backend kami mengirim pemberitahuan ke aplikasi klien menggunakan perpesanan cloud firebase).

ini berfungsi dengan baik untuk saya (saya mengirim pemberitahuan menggunakan fungsi firebase):
const payload = { notification: { title: ........, body: ........., icon: 'notification_icon' } };

Terima kasih, itu menghasilkan yang pertama dari dua kesalahan untuk saya. Saya menggunakan layanan REST melalui perpustakaan javascript/permintaan, dan mengirim sesuai dengan format https://firebase.google.com/docs/cloud-messaging/js/first-message . Saya kira format pesan/pemberitahuan dijelaskan di https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#Notification .

Sebenarnya, ketika saya membaca ini, ini menunjukkan bahwa ikon harus berada di message.android.notification.icon , yaitu, satu tingkat lebih dalam.

Saya baru saja mencoba, dan ini benar-benar bekerja untuk saya! Jadi saya kira itu tergantung pada protokol server bagaimana muatan harus terstruktur ...

Terima kasih, semuanya, untuk diskusi ini. Itu akhirnya membuatku berhenti mencabuti rambutku...

penutupan sebagai diselesaikan

@madsheep Ini tidak berfungsi. Setelah menambahkan 'ikon' di bawah notifikasi di fungsi cloud, ini memberikan kesalahan berikut:

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

info kesalahan:
{ kode: 'pesan/argumen tidak valid',
pesan: 'Payload JSON tidak valid diterima. Nama "ikon" tidak dikenal di 'message.notification': Tidak dapat menemukan bidang.' },
codePrefix: 'pesan' }

coba message.android.notification.icon alih-alih message.notification.icon .

@madsheep @guilhermehtk Ini berhasil untuk saya! Terima kasih.

Silakan uji apakah kode ini ditambahkan ke config.xml tag <platform name="android"> akan menambahkan ikon sebagai ikon pemberitahuan default.

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

Ini berfungsi untuk saya mengirim melalui panel Firebase Cloud Messaging atau back-end tanpa ikon di payload.
Silakan posting di sini umpan balik.
Jika berhasil, tutorial Anda yang ditambahkan ke kode ini akan membantu banyak orang dan harus membuka PR untuk menambahkannya ke README.

Kau mencerahkan hariku,

jika ada yang menghadapi masalah dalam membangun seperti

AAPT: kesalahan: awalan tidak terikat.

lalu coba tambahkan The

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

atribut harus ditambahkan ke roottag di dalam config.xml

Anda menyelamatkan hari saya!

Bagi siapa pun yang menghadapi masalah ini pada tahun 2019 dengan Android build 7.1.1, folder sumber daya tampaknya telah berubah!!

Dengan memeriksa studio Android dan file yang dihasilkan, inilah yang berhasil bagi saya:

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

Baris pertama adalah bagian penting, karena itu salah bagi saya.

@alarv Ikon tidak muncul untuk beberapa ponsel Android, tolong bantu ini.

Hai @bioyeeye model apa? Versi Android apa yang mereka jalankan? Stok atau lainnya?

@bioyeeye Saya punya solusi lain untuk Ionic 4 agar ikon berfungsi di semua perangkat Android.
Saya tidak menggunakan png untuk ikon tetapi XML. Saya menggunakan pengait untuk memasukkan ini ke direktori berikut:

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

membuat contoh file:
android_notification_resources.js

Dalam file kait baru ini tambahkan:


// MULAI
const fs = membutuhkan("fs");
const jalur = membutuhkan("jalur");
const Q = membutuhkan("q");

var sourceDir = 'resources/android/notification_icon'; // di sinilah ikonmu berada
var platformDir = 'platform/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'
];

modul.ekspor = fungsi(ctx) {

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

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

fungsi copy(src, tujuan) {
var ditangguhkan = 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()) {
kembali ditangguhkan.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);
  });
});

});

kembali ditangguhkan.janji;
}
// AKHIR


di config.xml Anda, tambahkan baris ini untuk memasukkan kait Anda:

Apa yang akan dilakukan pengait adalah menyalin ikon Anda dari folder sumber daya Anda dan menambahkannya di folder drawable yang berbeda. Saya melakukan ini untuk memastikan itu berfungsi untuk semua perangkat. Sejauh ini bagus.

Beri tahu saya jika itu berhasil untuk Anda! Bersulang

@RobinGiel Terima kasih, saya menggunakan ionic 3, apakah ini akan berhasil?

Halo @Flucadetena
Android 9
Platform Cordova: android 7.1.1

@bioyeeye Saya menggunakan ionic 3 juga. Saya akan memeriksa semuanya dan memberi tahu Anda. ;)

@bioyeeye Ya, Anda harus memodifikasi beberapa baris dari hook.

var sourceDir = 'resources/android/notification_icon';
var platformDir = 'platform/android';

dan mungkin alih-alih menggunakan const Q = require("q"); hapus baris itu dan gunakan di sini .. contoh:

modul.ekspor = fungsi(ctx) {

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

var Q = ctx.requireCordovaModule('q'); // gunakan di sini
var ditangguhkan = Q.defer();
var androidPlatformDir = path.join(ctx.opts.projectRoot, platformDir);
var customResourcesDir = path.join(ctx.opts.projectRoot, sourceDir);


Tambahkan config.xml dengan memanggil hook yang sama before_build dan before_run contoh:

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

Silakan uji apakah kode ini ditambahkan ke config.xml tag <platform name="android"> akan menambahkan ikon sebagai ikon pemberitahuan default.

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

Ini berfungsi untuk saya mengirim melalui panel Firebase Cloud Messaging atau back-end tanpa ikon di payload.
Silakan posting di sini umpan balik.
Jika berhasil, tutorial Anda yang ditambahkan ke kode ini akan membantu banyak orang dan harus membuka PR untuk menambahkannya ke README.

Kau mencerahkan hariku,

jika ada yang menghadapi masalah dalam membangun seperti

AAPT: kesalahan: awalan tidak terikat.

lalu coba tambahkan The

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

atribut harus ditambahkan ke tag root di dalam config.xml

Ini di sini berfungsi untuk saya, tetapi ikonnya tampaknya sangat kecil, berapa ukuran file yang tepat yang harus kita gunakan?

Sunting: Saya telah menambahkan 256x256 namun masih menunjukkan titik kecil di bilah status. menyeret bilah status ke bawah menunjukkan yang sedikit lebih besar

DIA

Kamu penyelamat hidupku!! Terima kasih!!!
Catatan:
Saya menambahkan warna: '#e50012' di bagian notifikasi untuk mengubah warna ikon. (ubah ke apa pun warna Anda).
mantan:
{
"nama": "pemberitahuan_saya",
"pemberitahuan": {
"body": "Badan pemberitahuan",
"title": "Judul pemberitahuan",
"warna": "#e50012"
},
"data":{ ... }
}

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

rolinger picture rolinger  ·  5Komentar

JonSmart picture JonSmart  ·  3Komentar

dhavalsoni2001 picture dhavalsoni2001  ·  5Komentar

danielpalen picture danielpalen  ·  5Komentar

Zrnik picture Zrnik  ·  3Komentar