Я долго боролся, и вот что я сделал, чтобы решить это:
Мое уведомление объявлено так:
const notification = {
id: idNotif,
text: this.getNotifText(notifs[0].type),
trigger: {at: dateNotif},
led: 'FF0000',
smallIcon: 'res://ic_stat_notify.png',
icon: 'res://icon.png',
vibrate: true
};
this.localNotifications.schedule(notification);
В этом примере кода обратите внимание, чтоссылки на эти значки имеют префикс res://
.Эти значки фактически находятся в папке platforms/android/app/src/main/res
, которая автоматически генерируется при компиляции приложения (например, с ionic cordova run android
).
Если вы хотите, чтобы уведомления работали, у вас должны быть следующие папкив этой папке res
:
- drawable-mdpi
- drawable-hdpi
- drawable-xhdpi
- drawable-xxhdpi
- drawable-xxxhdpi
Вам также необходим файл icon.png
непосредственно в папке res
, так как он упоминается как параметр icon
в объявлении локального уведомления.
Папки соответствуют различным возможным размерам значков в Android , в зависимости от плотности пикселей.Вы можете найти больше об этом в справочнике icon .Когда уведомление будет запущено, правильный размер значка будет автоматически выбран из этих 5 возможных размеров.
Каждая из этих папок должна содержать файл ic_stat_notify.png
, который должен быть значком в правильном формате:
- drawable-mdpi: 24x24
- drawable-hdpi: 36x36
- drawable-xhdpi: 48x48
- drawable-xxhdpi: 72x72
- drawable-xxxhdpi: 96x96
- icon.png: 96x96
Хорошо, но как мне поместить их в папку, которая создается только после компиляции?
Ответ таков: путем создания ловушки .
Поместите эти папки в папку, к которой вы можете получить доступ, и которая постоянно существует в вашем приложении.Лично я использовал resources/android/icon
.
Затем создайте ловушку для копирования этих файлов в нужную папку при каждой компиляции приложения.
Вот мой ловушку icon_notif.js
(примечание: это вдохновлено этим руководством ):
#!/usr/bin/env node
var filestocopy = [];
var filestocopyAndroid = [
{
"resources/android/icon/drawable-mdpi/ic_stat_notify.png":
"platforms/android/app/src/main/res/drawable-mdpi/ic_stat_notify.png"
},
{
"resources/android/icon/drawable-hdpi/ic_stat_notify.png":
"platforms/android/app/src/main/res/drawable-hdpi/ic_stat_notify.png"
},
{
"resources/android/icon/drawable-xhdpi/ic_stat_notify.png":
"platforms/android/app/src/main/res/drawable-xhdpi/ic_stat_notify.png"
},
{
"resources/android/icon/drawable-xxhdpi/ic_stat_notify.png":
"platforms/android/app/src/main/res/drawable-xxhdpi/ic_stat_notify.png"
},
{
"resources/android/icon/drawable-xxxhdpi/ic_stat_notify.png":
"platforms/android/app/src/main/res/drawable-xxxhdpi/ic_stat_notify.png"
},
{
"resources/android/icon/icon.png":
"platforms/android/app/src/main/res/icon.png"
}
];
var fs = require('fs');
var path = require('path');
var rootdir = './';
var androiddir = path.join(rootdir, "platforms/android");
var iosdir = path.join(rootdir, "platforms/ios");
if(fs.existsSync(androiddir)) {
filestocopy = filestocopyAndroid;
console.log("Android platform file recognized");
} else if(fs.existsSync(iosdir)) {
console.log("iOS platform file recognized");
filestocopy = filestocopyiOS;
} else {
console.log("Error: no Android or iOS platform file was recognized.");
filestocopy = [];
}
console.log("~~~~ Start Copying Notification Status Icons");
filestocopy.forEach(function (obj) {
Object.keys(obj).forEach(function (key) {
var val = obj[key];
var srcfile = path.join(rootdir, key);
var destfile = path.join(rootdir, val);
console.log("copying: " + srcfile);
console.log(" to: " + destfile);
var destdir = path.dirname(destfile);
if(!fs.existsSync(destdir)) {
fs.mkdirSync(destdir);
}
if (fs.existsSync(srcfile) && fs.existsSync(destdir)) {
fs.createReadStream(srcfile).pipe(
fs.createWriteStream(destfile));
}
});
});
console.log("~~~~ End Copying Notification Status Icons");
По сути, этот скрипт копирует нужные папки во вновь сгенерированные platforms/android/app/src/main/res folder
.
Пока этот хук работает правильно, все должно работать нормально!