Cordova-plugin-firebase: تغيير رمز إعلام الدفع - مشكلة فارغة في رمز android في عام 2018

تم إنشاؤها على ٦ يوليو ٢٠١٨  ·  22تعليقات  ·  مصدر: arnesson/cordova-plugin-firebase

أهلا بالجميع،

بالنسبة للأشخاص الذين يستخدمون هذا المكون الإضافي مع كوردوفا 8+ ، قد تجد أن تغيير رمز الإشعارات لن يعمل وتضغط على مشكلة "رمز الإشعار مربع فارغ" القديم على نظام Android. يحدث هذا لأن أيقونات إشعارات android يجب أن تكون بسيطة على شكل لون واحد على خلفية شفافة وإذا لم تقدم مثل هذا الرمز ، فسيستخدم android رمز التطبيق بدلاً من ذلك. هذه على الأرجح مربعات كاملة وملونة بدون أي خلفية شفافة.

هذا أمر مزعج للغاية عند إعداد مشروع Ionic 3 جديد ومحاولة استخدام هذا البرنامج المساعد.

لا يصف الملف التمهيدي هنا atm عملية تغيير الرمز الخاص بك بشكل صحيح. فيما يلي الخطوات التي يجب عليك اتخاذها لتغيير الرمز:

0) توقف عن البحث في googling وشد شعرك. اتبع هذه التعليمات خطوة بخطوة وسوف تجعلها تعمل ، ثق بي.
1) قم بإعداد إصدار من رمز التطبيق الخاص بك بحيث يكون شكل لون واحد فقط على خلفية شفافة
2) اذهب هنا: 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 اضغط على "صورة" في أعلى اليسار ، قم بتحميل الرمز الخاص بك ، وقم بقصه / إضافة مساحة متروكة إذا لزم الأمر
3) إذا بدا الأمر جيدًا ، فاضغط على السهم أعلى اليمين لتنزيل المجلدات "القابلة للرسم". سيعطيك ملفًا مضغوطًا يحتوي على مجلد res بداخله و 5 drawable-xxx مجلدات كل منها بحجم مختلف من الرمز الخاص بك
4) انسخ تلك المجلدات القابلة للرسم في مكان ما إلى مشروعك. بالنسبة لي ، قمت بنسخها بجوار رمز وموارد شاشة البداية: project-root/resources/android/notification_icon
5) قم بتكوين ملف config.xml الخاص بك لنسخ تلك الملفات داخل تطبيق android الخاص بك باستخدام التوجيه <resource-file /> . لاحظ أنه منذ crodova 8.x المسار الصحيح هو app/src/main/res . في كوردوفا <8 ، كانت القيمة res (كما في السابق تم حفظ ملفات الموارد في دليل platforms/android/res وهي الآن في platforms/android/app/main/res ). معظم المشكلات "التي تم حلها" عبر الإنترنت على أيقونة إعلام android الفارغة لا تذكر ذلك.

<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) الآن بعد أن أصبح لديك رمزك في التطبيق كمورد قابل للرسم ، فأنت بحاجة إلى إجبار تطبيقك على استخدامه. بغض النظر عما هو مكتوب في الملف التمهيدي هنا ، فإن الاكتشاف التلقائي لمورد قابل للرسم يسمى "رمز_إعلام" لم ينجح معي. لست متأكدًا تمامًا من السبب لأنه يبدو أنه موجود في قاعدة الكود هنا: https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/android/FirebasePluginMessagingService.java#L140 لكنني تخمين أن هناك شيئًا ما تغير مع اكتشاف الموارد على أحدث إصدارات أندرويد.
7) بسبب ذلك ، كان الحل الوحيد الذي يمكنني استخدامه هو إرسال المعلمة icon من الواجهة الخلفية عند إرسال إشعار الدفع إلى firebase. لاحظ أن واجهة برمجة التطبيقات الخاصة بهم تخضع على الأرجح لبعض التغييرات نظرًا لوجود مشكلات في الدمج الصحيح للأجزاء notification و android من الحمولة. لهذا السبب ، يجب عليك إضافة معلمة الرمز إلى الجزء notification من json. لن يعمل استخدام معلمات android specfic.

لذا يجب أن تبدو حمولة الإشعارات التي ترسلها إلى Firebase من الواجهة الخلفية لديك كما يلي: هذا هو الإصدار الوحيد الذي يعمل

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

اسمحوا لي أن أكرر - استخدام معلمات Android المحددة لا يعمل مع FIREBASE اعتبارًا من يوليو 2018 - لن يتم العمل أدناه ولن يتغير رمز الإشعار الخاص بك بصرف النظر عما تقوله وثائقهم :

{
  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) مع اكتمال جميع الخطوات ، فأنت الآن جاهز لاختبار الرمز الجديد الخاص بك. أقترح بشدة اختباره داخل محاكي android - تستحوذ بعض أشكال android على شريط الإشعارات وتستخدم أيقونة التطبيق بغض النظر عما قمت بتعيينه (أي MIUI من xiaomi). لقد وجدت أيضًا أن الرموز يتم تخزينها مؤقتًا في بعض الأحيان. لهذا السبب ، يعد اختباره في جهاز محاكاة على AVD الذي تم إنشاؤه حديثًا هو الرهان الأكثر أمانًا. قم بإزالة تطبيقك يدويًا بين عمليات التشغيل التجريبية وأعد تشغيل جهاز simluator / الجهاز لتجنب مشكلات التخزين المؤقت.

آمل أن تساعد هذه الكتابة الطويلة الآخرين في المستقبل ، لأن مقدار العقبة التي يجب على المرء أن يمر بها لتغيير رمز 10x10 الصغير هو ببساطة لعنة عالية ...

التعليق الأكثر فائدة

الرجاء اختبار ما إذا تمت إضافة هذا الرمز إلى config.xml <platform name="android"> tag ستضيف الرمز كرمز إشعار افتراضي.

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

يعمل هذا بالنسبة لي للإرسال عن طريق لوحة Firebase Cloud Messaging أو النهاية الخلفية بدون رمز على الحمولة.
الرجاء نشر ردود الفعل هنا.
إذا كان يعمل ، فإن البرنامج التعليمي الذي تمت إضافته إلى هذا الرمز سيساعد الكثير من الأشخاص ويجب أن يفتح العلاقات العامة لإضافته إلى التمهيدي.

ال 22 كومينتر

الرجاء اختبار ما إذا تمت إضافة هذا الرمز إلى config.xml <platform name="android"> tag ستضيف الرمز كرمز إشعار افتراضي.

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

يعمل هذا بالنسبة لي للإرسال عن طريق لوحة Firebase Cloud Messaging أو النهاية الخلفية بدون رمز على الحمولة.
الرجاء نشر ردود الفعل هنا.
إذا كان يعمل ، فإن البرنامج التعليمي الذي تمت إضافته إلى هذا الرمز سيساعد الكثير من الأشخاص ويجب أن يفتح العلاقات العامة لإضافته إلى التمهيدي.

شكرا madsheep !! أنت أنقذت حياتي !!

مرحبًا ، شكرًا على الدعم المعنوي ، ومنحي الشعور بأنني لست الوحيد الذي انتهى به الأمر في هذه الفوضى. ومع ذلك ، لسوء الحظ ، عدت إلى الخطوة 0 السابقة ، حيث فقد الشعر في الطريق.

عندما أحاول إرسال الإشعار من خلال طريقة http / post ، أحصل على أخطاء من Firebase api تفيد بأن json غير صالح. لقد جربت كلا الطريقتين:

هذا ما أحصل عليه عند تضمين الرمز كـ 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.]]

هذه هي الرسالة التي أتلقاها عند تضمين الرمز كـ 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.]]

ولكن ربما أستخدم هذا في سياق خاطئ (يرسل رمز السحابة الخلفية الخاص بنا إشعارًا إلى تطبيقات العميل باستخدام المراسلة السحابية من Firebase).

كان هذا جيدًا بالنسبة لي (أرسل إشعارات باستخدام وظائف Firebase):
const payload = { notification: { title: ........, body: ........., icon: 'notification_icon' } };

شكرًا ، ينتج عن ذلك أول خطأ من الخطأين بالنسبة لي. أنا أستخدم خدمة REST عبر مكتبة javascript / request ، وأرسلها وفقًا للتنسيق https://firebase.google.com/docs/cloud-messaging/js/first-message . أفترض أن تنسيق الرسالة / الإشعار موصوف في https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#Notification .

في الواقع ، عندما قرأت هذا ، يشير هذا إلى أن الرمز يجب أن يكون في message.android.notification.icon ، أي مستوى أعمق.

لقد حاولت للتو ، وهذا في الواقع يناسبني! لذلك أفترض أن الأمر يعتمد على بروتوكول الخادم كيف ينبغي هيكلة الحمولة ...

شكرا للجميع على هذه المناقشة. لقد أدى ذلك أخيرًا إلى توقفي عن نتف شعري ...

إغلاق كما تم حلها

madsheep لا يعمل. بعد إضافة "رمز" تحت الإشعار في وظيفة السحابة ، فإنه يعطي الخطأ التالي:

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

معلومات الخطأ:
{code: 'messaging / غير صالح-وسيطة'،
الرسالة: "تم استلام حمولة JSON غير صالحة. اسم غير معروف "رمز" في "message.notification": لا يمكن العثور على الحقل. } ،
codePrefix: "المراسلة"}

جرب message.android.notification.icon بدلاً من message.notification.icon .

تضمين التغريدة شكرا.

الرجاء اختبار ما إذا تمت إضافة هذا الرمز إلى config.xml <platform name="android"> tag ستضيف الرمز كرمز إشعار افتراضي.

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

يعمل هذا بالنسبة لي للإرسال عن طريق لوحة Firebase Cloud Messaging أو النهاية الخلفية بدون رمز على الحمولة.
الرجاء نشر ردود الفعل هنا.
إذا كان يعمل ، فإن البرنامج التعليمي الذي تمت إضافته إلى هذا الرمز سيساعد الكثير من الأشخاص ويجب أن يفتح العلاقات العامة لإضافته إلى التمهيدي.

انت صنعت يومي،

إذا كان هناك أي واحد يواجه مشكلة في بناء مثل

AAPT: خطأ: بادئة غير منضمة.

ثم حاول إضافة

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

يجب إضافة السمة إلى الجذرعلامة داخل ملف config.xml

لقد أنقذت يومي!

بالنسبة لأي شخص يواجه هذه المشكلة في عام 2019 باستخدام إصدار android 7.1.1 ، فقد تغير مجلد الموارد على ما يبدو !!

من خلال فحص Android studio والملفات التي تم إنشاؤها ، إليك ما نجح معي:

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

السطر الأول هو الجزء المهم ، لأن هذا كان خطأ بالنسبة لي.

alarv لا يظهر الرمز لبعض هواتف android ، أي مساعدة في ذلك من فضلك.

يا bioyeneye ما هي النماذج؟ ما هو إصدار Android الذي يتم تشغيله؟ الأسهم أو غيرها؟

bioyeneye لدي حل آخر لـ Ionic 4 لجعل الرموز تعمل على جميع أجهزة Android.
أنا لا أستخدم png للأيقونة ولكن XML. أنا أستخدم خطافًا لتضمين ذلك في الأدوار التالية:

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

إنشاء ملف مثال:
android_notification_resources.js

أضف في ملف الخطاف الجديد هذا:


// يبدأ
const fs = تتطلب ("fs") ؛
مسار const = يتطلب ("المسار") ؛
const Q = تتطلب ("q") ؛

var sourceDir = 'resources / android / alert_icon' ؛ // هذا هو المكان الذي يوجد فيه الرمز الخاص بك
var platformDir = 'منصات / android / app / src / main /' ؛
var ResourceDirs = [
"الدقة / drawable-hdpi" ،
"الدقة / drawable-mdpi" ،
"الدقة / drawable-xhdpi" ،
"الدقة / drawable-xxhdpi" ،
"الدقة / drawable-xxxhdpi" ،
"الدقة / mipmap-hdpi" ،
"الدقة / mipmap-mdpi" ،
"الدقة / mipmap-xhdpi" ،
"الدقة / mipmap-xxhdpi" ،
"الدقة / mipmap-xxxhdpi"
] ؛

module.exports = function (ctx) {

if (ctx.opts.platforms.indexOf ('android') <0) {
إرجاع؛
}

var مؤجل = Q.defer () ،
var androidPlatformDir = path.join (ctx.opts.projectRoot، platformDir) ؛
var customResourcesDir = path.join (ctx.opts.projectRoot ، sourceDir) ،

نسخ الوظيفة (src ، dest) {
var مؤجل = 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) {
إذا (يخطئ ||! stats.isDirectory ()) {
العودة مؤجلة .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);
  });
});

}) ؛

عودة مؤجلة الوعد.
}
// نهاية


في ملف config.xml ، أضف هذا السطر لتضمين الخطاف الخاص بك:

ما سيفعله الخطاف هو نسخ الرمز الخاص بك من مجلد الموارد وإضافته في مجلدات قابلة للرسم مختلفة. لقد فعلت ذلك للتأكد من أنه يعمل مع جميع الأجهزة. حتى الان جيدة جدا.

اسمح لى اعرف لو هذا العمل لاجلك! في صحتك

RobinGiel شكرًا ، أنا أستخدم أيوني 3 ، هل

مرحبا @ Flucadetena
أندرويد 9
منصات كوردوفا: android 7.1.1

bioyeneye أنا أستخدم الأيونية 3 أيضًا. سوف أتحقق من كل شيء وأعلمك بذلك. ؛)

bioyeneye نعم ، سيكون عليك تعديل بضعة أسطر من الخطاف.

var sourceDir = 'resources / android / alert_icon' ؛
var platformDir = 'منصات / أندرويد' ؛

وربما بدلاً من استخدام const Q = تتطلب ("q") ؛ أزل هذا الخط واستخدمه هنا .. مثال:

module.exports = function (ctx) {

if (ctx.opts.platforms.indexOf ('android') <0) {
إرجاع؛
}

var Q = ctx.requireCordovaModule ('q') ؛ // استخدمه هنا
var مؤجل = Q.defer () ،
var androidPlatformDir = path.join (ctx.opts.projectRoot، platformDir) ؛
var customResourcesDir = path.join (ctx.opts.projectRoot ، sourceDir) ،


أضف في config.xml استدعاء نفس الخطاف before_build و before_run مثال:

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

الرجاء اختبار ما إذا تمت إضافة هذا الرمز إلى config.xml <platform name="android"> tag ستضيف الرمز كرمز إشعار افتراضي.

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

يعمل هذا بالنسبة لي للإرسال عن طريق لوحة Firebase Cloud Messaging أو النهاية الخلفية بدون رمز على الحمولة.
الرجاء نشر ردود الفعل هنا.
إذا كان يعمل ، فإن البرنامج التعليمي الذي تمت إضافته إلى هذا الرمز سيساعد الكثير من الأشخاص ويجب أن يفتح العلاقات العامة لإضافته إلى التمهيدي.

انت صنعت يومي،

إذا كان هناك أي واحد يواجه مشكلة في بناء مثل

AAPT: خطأ: بادئة غير منضمة.

ثم حاول إضافة

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

يجب إضافة السمة إلى علامة الجذر داخل الملف config.xml

يعمل هذا هنا بالنسبة لي ، ولكن يبدو أن الرمز صغير بشكل لا يصدق ، ما هو الحجم المناسب للملف الذي يجب أن نستخدمه؟

تحرير: لقد أضفت 256 × 256 ولكن ما زلت تظهر نقطة صغيرة على شريط الحالة. يؤدي سحب شريط الحالة إلى الأسفل إلى إظهار شريط أكبر قليلاً

إنه

أنت منقذ حياتي !! شكرا لك!!!
ملحوظات:
أقوم بإضافة اللون: "# e50012" في قسم التنبيهات لتغيير لون الأيقونة (قم بتغييره إلى أي لون تريده).
السابق:
{
"الاسم": "my_notification" ،
"تنبيه": {
"النص الأساسي": "هيئة الإشعار" ،
"العنوان": "عنوان الإعلام"،
"اللون": "# e50012"
} ،
"البيانات":{ ... }
}

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات