الرد على الإشعارات المحلية والبعيدة الأصلية لنظامي التشغيل iOS وAndroid
لا تتم صيانة هذا المستودع بشكل نشط. السبب الرئيسي هو الوقت. السبب الثاني هو على الأرجح مدى تعقيد الإشعارات على نظامي التشغيل iOS وAndroid. نظرًا لأن هذا المشروع ربما يحتاج إلى إعادة بناء ضخمة لإصلاح بعض المشكلات أو لتنفيذ ميزات جديدة. أعتقد أنك ربما يجب أن تفكر في هذه البدائل: Notifee مجاني منذ سبتمبر أو إشعارات التفاعل الأصلي.
إذا كنت مهتمًا بأن تكون مشرفًا على هذا المشروع، فلا تتردد في طرح المشكلات.
تحقق من التغييرات والترحيل في سجل التغيير:
سجل التغيير
المشرفون مرحب بهم! لا تتردد في الاتصال بي
سجل التغيير متاح من الإصدار 3.1.3 هنا: سجل التغيير
npm install --save react-native-push-notification
yarn add react-native-push-notification
ملاحظة: إذا كنت تستهدف نظام التشغيل iOS، فستحتاج أيضًا إلى اتباع تعليمات التثبيت الخاصة بـ PushNotificationIOS نظرًا لأن هذه الحزمة تعتمد عليه.
ملاحظة: بالنسبة لنظام التشغيل Android، لا يزال يتعين عليك تحديث AndroidManifest.xml يدويًا (كما هو موضح أدناه) لاستخدام الإشعارات المجدولة.
هل تواجه مشكلة؟ اقرأ دليل استكشاف الأخطاء وإصلاحها قبل إثارة المشكلة.
من فضلك إقرأ...
يستخدم المكون PushNotificationIOS لجزء iOS. يجب عليك اتباع تعليمات التثبيت الخاصة بهم.
ملحوظة: يتطلب firebase-messaging
، قبل الإصدار 15، أن يكون لديك نفس رقم الإصدار حتى يعمل بشكل صحيح في وقت الإنشاء وفي وقت التشغيل. لاستخدام إصدار محدد:
في android/build.gradle
تحويلة { googlePlayServicesVersion = "<إصدار خدمات التشغيل الخاص بك>" // الافتراضي: "+"firebaseMessagingVersion = "<إصدار Firebase الخاص بك>" // الافتراضي: "21.1.0"// إعدادات أخرىcompileSdkVersion = <إصدار SDK الخاص بك> // الافتراضي: 23buildToolsVersion = "<إصدار أدوات البناء الخاص بك>" // الافتراضي: "23.0.1"targetSdkVersion = <إصدار SDK المستهدف الخاص بك> // الافتراضي: 23supportLibVersion = "<إصدار lib الخاص بالدعم>" // الافتراضي: 23.1.1}
ملاحظة: يعمل localNotification() بدون تغييرات في جزء التطبيق، بينما يعمل localNotificationSchedule() فقط مع هذه التغييرات:
في ملف android/app/src/main/AndroidManifest.xml
..... <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application ....><!-- قم بتغيير القيمة إلى true لتمكين النافذة المنبثقة في المقدمة عند تلقي الإشعارات عن بعد (لمنع التكرار أثناء إظهار الإشعارات المحلية، اضبط هذا على false) --><meta-data android: name="com.dieam.reactnativepushnotification.notification_foreground"android:value="false"/><!-- قم بتغيير اسم المورد إلى لون تمييز تطبيقك - أو أي لون آخر تريده --><بيانات التعريف android:name="com.dieam.reactnativepushnotification.notification_color"android:resource="@color/white"/> <!-- أو @android:color/{name} لاستخدام لون قياسي --><receiver android: الاسم = "com.dieam.reactnativepushnotification.modules.RNPushNotificationActions" /> <المتلقي android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" /> <المتلقي android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver"> <مرشح النية> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> </ نية عامل التصفية> </المتلقي> <serviceandroid:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"android:exported="false" > <مرشح النية> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </ نية عامل التصفية> </الخدمة> .....
إذا لم تكن تستخدم لونًا مدمجًا في Android ( @android:color/{name}
) لعنصر meta-data
notification_color
. في android/app/src/main/res/values/colors.xml
(قم بإنشاء الملف إذا لم يكن موجودًا).
<الموارد> <color name="white">#FFF</color> </الموارد>
إذا كان تطبيقك يحتوي على @Override على onNewIntent في MainActivity.java
، فتأكد من أن الوظيفة تتضمن استدعاء فائق على onNewIntent (إذا لم يكن لدى MainActivity.java
الخاص بك @Override لـ onNewIntent، فتخطى هذا):
@Overridepublic void onNewIntent(Intentintent) { ...super.onNewIntent(intent); ... }
تأكد من تثبيت برنامج إعداد Firebase بشكل صحيح.
في android/build.gradle
نص البناء {... التبعيات {... classpath('com.google.gms:google-services:4.3.3')... } }
في android/app/build.gradle
التبعيات { ... التنفيذ "com.google.firebase:firebase-analytics:17.3.0" ... } تطبيق البرنامج المساعد: "com.google.gms.google-services"
ثم ضع google-services.json
في android/app/
.
ملاحظة: قاعدة النار/ملاحظات الإصدار
لم تعد هناك حاجة إلى
firebase-core
مكتبة Firebase Android. تتضمن حزمة تطوير البرامج (SDK) هذه حزمة Firebase SDK لبرنامج Google Analytics.الآن، لاستخدام Analytics أو أي منتج من منتجات Firebase يوصي باستخدام Analytics (انظر الجدول أدناه)، يتعين عليك إضافة تبعية Analytics بشكل صريح:
com.google.firebase:firebase-analytics:17.3.0
.
في android/settings.gradle
... include ':react-native-push-notification'project(':react-native-push-notification').projectDir = file('../node_modules/react-native-push-notification/android')
في جهاز android/app/build.gradle
التبعيات {... مشروع التنفيذ (': رد فعل أصلي - إشعار الدفع') ... }
قم بتسجيل الوحدة يدويًا في MainApplication.java
(إذا لم تستخدم react-native link
):
import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage; // <--- استيراد Packagepublic class MainApplication يمتد التطبيق ReactApplication { Private Final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override protected boolean getUseDeveloperSupport() {return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new ReactNativePushNotificationPackage() // <---- أضف الحزمة ); } }; .... }
لا تستخدم .configure()
داخل المكون، حتى App
إذا قمت بذلك، فلن يتم تشغيل معالجات الإشعارات، لأنه لم يتم تحميلها. بدلًا من ذلك، استخدم
.configure()
في الملف الأول للتطبيق، وعادةً ما يكونindex.js
.
import PushNotificationIOS from "@react-native-community/push-notification-ios";استيراد PushNotification من "react-native-push-notification";// يجب أن يكون خارج أي دورة حياة مكون (مثل `componentDidMount`).PushNotification. تكوين({ // (اختياري) يتم استدعاؤه عند إنشاء الرمز المميز (iOS وAndroid) onRegister: الوظيفة (الرمز المميز) {console.log("TOKEN:"، token); }, // (مطلوب) يتم الاتصال به عند استلام جهاز التحكم عن بعد أو فتحه، أو عند فتح إشعار محلي onNotification: الوظيفة (الإخطار) {console.log("NOTIFICATION:"، notification);// معالجة الإشعار// (مطلوب) يتم الاتصال به عند استلام جهاز التحكم عن بعد أو فتحه، أو عند فتح الإشعار المحليnotification.finish(PushNotificationIOS.FetchResult. NoData); }, // (اختياري) يتم الاتصال به عند الضغط على الإجراء المسجل ويكون استدعاء التطبيق خطأ، وإذا كان صحيحًا، سيتم استدعاء onNotification (Android) onAction: الوظيفة (الإخطار) {console.log("ACTION:"، notification.action);console.log("NOTIFICATION:"، notification);// معالجة الإجراء }, // (اختياري) يتم الاتصال به عندما يفشل المستخدم في التسجيل للإشعارات عن بعد. يحدث هذا عادةً عندما يواجه APNS مشكلات، أو عندما يكون الجهاز عبارة عن جهاز محاكاة. (آي أو إس) onRegistrationError: function(err) {console.error(err.message, err); }, // IOS فقط (اختياري): الافتراضي: الكل - أذونات التسجيل. الأذونات: {تنبيه: صحيح، شارة: صحيح، الصوت: صحيح، }, // هل يجب أن يظهر الإشعار الأولي تلقائيًا // الافتراضي: صحيح popInitialNotification: صحيح، /** * (اختياري) الافتراضي: صحيح * - محدد إذا كان سيتم طلب الأذونات (ios) والرمز المميز (android وios) أم لا، * - إذا لم يكن الأمر كذلك، فيجب عليك الاتصال بـ PushNotificationsHandler.requestPermissions() لاحقًا * - إذا لم تكن كذلك باستخدام الإعلام عن بعد أو لم يكن لديك Firebase مثبتًا، استخدم هذا: * requestPermissions: Platform.OS === 'ios' */ requestPermissions: true,});
يحتوي مجلد المثال على تطبيق مثال لتوضيح كيفية استخدام هذه الحزمة. تتم معالجة الإشعارات في NotifService.js
.
يرجى اختبار العلاقات العامة الخاصة بك باستخدام هذا التطبيق النموذجي قبل إرسالها. سوف يساعد في الحفاظ على هذا الريبو.
عند فتح أي إشعار أو تلقيه، يتم استدعاء رد الاتصال onNotification
بتمرير كائن مع بيانات الإشعار.
مثال لكائن الإعلام:
{المقدمة: خطأ، // منطقي: إذا تم استلام الإشعار في المقدمة أو ليس تفاعل المستخدم: خطأ، // منطقي: إذا تم فتح الإشعار من قبل المستخدم من منطقة الإعلام أو ليست رسالة: "رسالة الإشعار الخاصة بي"، // STRING: بيانات رسالة الإشعار: {}، // الكائن: بيانات الدفع أو معلومات المستخدم المحددة في الإشعارات المحلية}
PushNotification.localNotification(التفاصيل: الكائن)
مثال:
PushNotification.localNotification({ /* خصائص Android فقط */ معرف القناة: "your-channel-id"، // (مطلوب) معرف القناة، إذا لم تكن القناة موجودة، فلن يتم تشغيل الإشعار. شريط: "شريط الإشعارات الخاص بي"، // (اختياري) showWhen: صحيح، // (اختياري) الافتراضي: صحيح الإلغاء التلقائي: صحيح، // (اختياري) الافتراضي: صحيح LargeIcon: "ic_launcher"، // (اختياري) الافتراضي: "ic_launcher". استخدم "" لعدم وجود رمز كبير. LargeIconUrl: "https://www.example.tld/picture.jpg"، // (اختياري) الافتراضي: غير محدد SmallIcon: "ic_notification"، // (اختياري) الافتراضي: "ic_notification" مع خيار احتياطي لـ "ic_launcher". استخدم "" للرمز الصغير الافتراضي. bigText: "النص الكبير الذي سيظهر عند توسيع الإشعار. يمكن إجراء التصميم باستخدام علامات HTML (راجع مستندات android للحصول على التفاصيل)"، // (اختياري) الافتراضي: دعامة "الرسالة" نص فرعي: "هذا نص فرعي"، // (اختياري) الافتراضي: لا شيء bigPictureUrl: "https://www.example.tld/picture.jpg"، // (اختياري) الافتراضي: غير محدد bigLargeIcon: "ic_launcher"، // (اختياري) الافتراضي: غير محدد bigLargeIconUrl: "https://www.example.tld/bigicon.jpg"، // (اختياري) الافتراضي: غير محدد اللون: "أحمر"، // (اختياري) الافتراضي: النظام الافتراضي الاهتزاز: صحيح، // (اختياري) الافتراضي: صحيح الاهتزاز: 300، // طول الاهتزاز بالمللي ثانية، يتم تجاهله إذا كان الاهتزاز = خطأ، الافتراضي: 1000 العلامة: "some_tag"، // (اختياري) أضف علامة إلى الرسالة المجموعة: "مجموعة"، // (اختياري) أضف مجموعة إلى الرسالة groupSummary: false، // (اختياري) قم بتعيين هذا الإشعار ليكون ملخص المجموعة لمجموعة من الإشعارات، الافتراضي: false مستمر: خطأ، // (اختياري) قم بتعيين ما إذا كان هذا إشعارًا "مستمرًا". الأولوية: "عالية"، // (اختياري) قم بتعيين أولوية الإشعارات، الافتراضية: عالية الرؤية: "خاص"، // (اختياري) قم بتعيين رؤية الإشعارات، الافتراضي: خاص تجاهل InForeground: خطأ، // (اختياري) إذا كان صحيحًا، فلن يكون الإشعار مرئيًا عندما يكون التطبيق في المقدمة (مفيد للتكافؤ مع كيفية ظهور إشعارات iOS). ينبغي استخدامه مع الإعداد `com.dieam.reactnativepushnotification.notification_foreground` ShortcutId: "shortcut-id"، // (اختياري) إذا كان هذا الإشعار مكررًا لاختصار Launcher، فقم بتعيين معرف الاختصار، في حالة رغبة Launcher في إخفاء الاختصار، يكون الإعداد الافتراضي غير محدد OnlyAlertOnce: false، // (اختياري) سيتم فتح التنبيه مرة واحدة فقط بالصوت والإخطار، الافتراضي: false متى: فارغ، // (اختياري) أضف طابعًا زمنيًا (قيمة الطابع الزمني لنظام Unix بالمللي ثانية) يتعلق بالإشعار (عادةً وقت وقوع الحدث). بالنسبة إلى التطبيقات التي تستهدف Build.VERSION_CODES.N والإصدارات الأحدث، لم تعد هذه المرة تظهر بشكل افتراضي ويجب تمكينها باستخدام `showWhen`، الافتراضي: null. يستخدم الكرونومتر: خطأ، // (اختياري) إظهار الحقل "متى" كساعة توقيت. بدلاً من تقديم "متى" كطابع زمني، سيعرض الإشعار عرضًا يتم تحديثه تلقائيًا للدقائق والثواني منذ متى. مفيد عند إظهار الوقت المنقضي (مثل مكالمة هاتفية جارية)، الافتراضي: خطأ. timeoutAfter: null، // (اختياري) يحدد المدة بالمللي ثانية التي يجب بعدها إلغاء هذا الإشعار، إذا لم يتم إلغاؤه بالفعل، الافتراضي: null messageId: "google:message_id"، // (اختياري) تمت إضافته كـ "message_id" بغرض الإضافات بحيث يمكن لفتح إشعار الدفع العثور على البيانات المخزنة بواسطة وحدة @react-native-firebase/messaging. الإجراءات: ["Yes"، "No"]، // (Android فقط) راجع المستند للتعرف على إجراءات الإشعارات لمعرفة المزيد استدعاء التطبيق: صحيح، // (اختياري) يؤدي هذا إلى تمكين النقر على الإجراءات لإعادة التطبيق إلى المقدمة أو البقاء في الخلفية، الافتراضي: صحيح /* خصائص iOS فقط */ الفئة: ""، // (اختياري) الافتراضي: سلسلة فارغة عنوان فرعي: "العنوان الفرعي للإشعار"، // (اختياري) عنوان أصغر أسفل عنوان الإشعار /* خصائص iOS وAndroid */ المعرف: 0، // (اختياري) عدد صحيح فريد صالح مكون من 32 بت تم تحديده كسلسلة. الافتراضي: المعرف الفريد الذي تم إنشاؤه تلقائيًا العنوان: "عنوان الإشعار الخاص بي"، // (اختياري) الرسالة: "رسالة الإشعارات الخاصة بي"، // (مطلوب) الصورة: "https://www.example.tld/picture.jpg"، // (اختياري) اعرض صورة مع الإشعار، الاسم المستعار لـ `bigPictureUrl` لنظام Android. الافتراضي: غير محدد userInfo: {}، // (اختياري) الافتراضي: {} (يؤدي استخدام القيمة null إلى ظهور خطأ في قيمة JSON '<null>') playSound: خطأ، // (اختياري) الافتراضي: صحيح soundName: "افتراضي"، // (اختياري) صوت يتم تشغيله عند ظهور الإشعار. قيمة "الافتراضي" تلعب الصوت الافتراضي. ويمكن ضبطه على صوت مخصص مثل "android.resource://com.xyz/raw/my_sound". سيبحث عن الملف الصوتي "my_sound" في الدليل "res/raw" ويقوم بتشغيله. الافتراضي: "افتراضي" (يتم تشغيل الصوت الافتراضي) الرقم: 10، // (اختياري) عدد صحيح صالح 32 بت محدد كسلسلة. الافتراضي: لا شيء (لا يمكن أن يكون صفرًا) نوع التكرار: "اليوم"، // (اختياري) الفاصل الزمني للتكرار. تحقق من قسم "الإشعارات المتكررة" لمزيد من المعلومات.});
PushNotification.localNotificationSchedule (التفاصيل: الكائن)
مثال:
PushNotification.localNotificationSchedule({ //... يمكنك استخدام كافة الخيارات من localNotifications الرسالة: "رسالة الإشعارات الخاصة بي"، // (مطلوب) التاريخ: تاريخ جديد (Date.now() + 60 * 1000)، // خلال 60 ثانية allowWhileIdle: false، // (اختياري) قم بتعيين الإشعار للعمل أثناء النوم، الافتراضي: false /* خصائص Android فقط */ RepeatTime: 1، // (اختياري) زيادة نوع التكرار الذي تم تكوينه. تحقق من قسم "الإشعارات المتكررة" لمزيد من المعلومات.});
PushNotification.popInitialNotification(رد الاتصال)
مثال:
PushNotification.popInitialNotification((الإخطار) => { console.log('الإخطار الأولي'، الإخطار)؛})؛
في نظام Android، أضف ملف الصوت المخصص الخاص بك إلى [project_root]/android/app/src/main/res/raw
في iOS، أضف ملف الصوت المخصص الخاص بك إلى Resources
المشروع في xCode.
في إشعار الموقع json حدد اسم الملف الكامل:
soundName: 'my_sound.mp3'
لاستخدام القنوات، قم بإنشائها عند بدء التشغيل وقم بتمرير channelId
المطابق إلى PushNotification.localNotification
أو PushNotification.localNotificationSchedule
.
استيراد PushNotification، {أهمية} من 'react-native-push-notification'؛... PushNotification.createChannel({ معرف القناة: "معرف القناة"، // (مطلوب) اسم القناة: "قناتي"، // (مطلوب) وصف القناة: "قناة لتصنيف الإشعارات"، // (اختياري) الافتراضي: غير محدد playSound: خطأ، // (اختياري) الافتراضي: صحيح اسم الصوت: "افتراضي"، // (اختياري) راجع معلمة `soundName` لأهمية وظيفة `localNotification`: Importance.HIGH، // (اختياري) الافتراضي: قيمة Int لأهمية إشعار Android تهتز: true، // (اختياري) الافتراضي: true لإنشاء القيمة الافتراضية نمط الاهتزاز إذا كان صحيحًا.},(created) => console.log(`تم إرجاع createChannel '${created}'`) // (اختياري) يُرجع رد الاتصال ما إذا كانت القناة قد تم إنشاؤها أم لا، أم لا، يعني false أنها موجودة بالفعل. );
ملاحظة: بدون القناة، لا تعمل الإشعارات
في خيارات الإشعارات، يجب عليك تقديم معرف قناة مع channelId: "your-channel-id"
، إذا لم تكن القناة موجودة، فقد لا يتم تشغيل الإشعار. بمجرد إنشاء القناة، لا يمكن تحديث القناة. تأكد من أن channelId
الخاص بك مختلف إذا قمت بتغيير هذه الخيارات. إذا قمت بإنشاء قناة بطريقة أخرى، فسيتم تطبيق خيارات القناة.
إذا كنت تريد استخدام قناة افتراضية مختلفة للإشعارات عن بعد، فارجع إلى وثائق Firebase:
قم بإعداد تطبيق عميل Firebase Cloud Messaging على Android
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
بالنسبة للإشعارات المحلية، يتوفر نفس النوع من الخيار:
يمكنك استخدام:
<meta-data android:name="com.dieam.reactnativepushnotification.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
إذا لم يتم تعريفها، قم بالرجوع إلى قيمة Firebase المحددة في AndroidManifest
:
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="..." />
إذا لم يتم تحديده، يمكنك الرجوع إلى معرف قناة Firebase الافتراضي fcm_fallback_notification_channel
يمكنك سرد القنوات المتاحة مع:
PushNotification.getChannels(function (channel_ids) { console.log(channel_ids); // ['channel_id_1']});
يمكنك التحقق من وجود قناة باستخدام:
PushNotification.channelExists(channel_id, الوظيفة (موجود) { console.log(exists); // صحيح/خطأ });
يمكنك التحقق مما إذا كانت القناة محظورة باستخدام:
PushNotification.channelBlocked(channel_id, function (blocked) { console.log(blocked); // صحيح/خطأ });
يمكنك حذف قناة باستخدام:
PushNotification.deleteChannel(channel_id);
معلمة id
لـ PushNotification.localNotification
مطلوبة لهذه العملية. سيتم بعد ذلك استخدام المعرف المقدم لعملية الإلغاء.
PushNotification.localNotification({...id: '123'...});PushNotification.cancelLocalNotification('123'