Cordova-plugin-firebase: onNotificationOpen لا يتم تشغيله إذا كان التطبيق مغلقًا - تتوقف عملية التطبيق في الخلفية.

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

أهلا،

لا أعرف ما إذا كان هذا السلوك الافتراضي أم لا. ولكن عندما يكون التطبيق مغلقًا (يتم إيقاف عملية التطبيق) ، فإن إشعار الدفع قادم والنقر عليه ، ولا يتم تشغيل onNotificationOpen. هل هذا كما هو متوقع أم شيء بحاجة للعمل عليه؟

messaging

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

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

ال 46 كومينتر

أنا أيضا أواجه نفس المشكلة :(

استخدم حدث استئناف كوردوفا لربط رد الاتصال مرة أخرى. راجع مستندات كوردوفا حول دورة حياة أندرويد: http://cordova.apache.org/docs/en/6.x/guide/platforms/android/index.html#lifecycle -guide

robertarnesson هل تمانع في شرح إجابتك أكثر من ذلك بقليل؟ أواجه نفس المشكلة على iOS. يمكنني تلقي الإشعارات أثناء تشغيل التطبيق في المقدمة والخلفية ، ولكن بمجرد إغلاق / إنهاء تطبيقي ، لا يمكنني تلقي الإشعارات بعد الآن.

أتلقى إشعارات على كل من الخلفية والمقدمة (Android 6.0.1) ... لكن الإخطار المفتوح لا يؤدي إلى إطلاق التطبيق ، ويتم مسح إشعار الدرج بعد النقر وفقدان بيانات الإخطار. (يحدث هذا حتى عندما يكون التطبيق في وضع الإيقاف المؤقت). هل يمكن أن يكون بسبب ممر المشاة؟ هل هناك أي حل؟

تضمين التغريدة

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

هذا تفسير أساسي لما لدي في index.html الخاص بي وهذا ينطبق على iOS و Android مع نقل الحمولة إلى التطبيق للتلاعب بها.

لقد وجدت أنه مع نظام التشغيل iOS ، كنت بحاجة فقط إلى استخدام وظيفة `` deviceready '' الخاصة بـ cordova.js حيث يبدو أن هذا ينطلق كلما تم تلقي إشعار عندما كانت التطبيقات في المقدمة وبعد استئناف تطبيق كان في الخلفية سواء كان ذلك عن طريق النقر فوق الزر أو مجرد فتح التطبيق.

بالنسبة لنظام Android ، كنت بحاجة إلى استخدام "استئناف" حيث يبدو أن "deviceready" بدأ تشغيله مرة واحدة فقط عند تحميل التطبيق لأول مرة (أفترض أنه من المنطقي).

function onLoad(){

    //fire this with load of the HTML page
    document.addEventListener("deviceready", onDeviceReady, false);

    }

    function onDeviceReady(){

    // this will fire when the app first runs (iOS and Android)
    // iOS will run this after tapping a notification as well but not Android

    // Create the resume as soon as the device is ready.
    document.addEventListener("resume", onResume, false); 

    // add initial cordova-plugin-firebase function calls here
    // e.g TokenRefresh, onNotificationOpen etc

    window.FirebasePlugin.onTokenRefresh(function(token){

    //Do something with the token server-side if it exists

    });

    // get any initial or resume notification (used for iOS)
    var payload = getNotification();

    }

    function getNotification(){

    // get any notification variables for use in your app
    window.FirebasePlugin.onNotificationOpen(function(notification){

    //Check if notification exists then do something with the payload vars
    var str = JSON.stringify(notification);
    console.log(str);

    });

    return str;

    }

    function onResume(){
    //Add plugin functions here after app has resumed from background
    // or after notification is tapped (needed for Android)

    //get resume notification and payload (needed for Android)

    var payload = getNotification();

    }

مرحباً يا رفاق ، أعتقد أننا نفتقد النقطة هنا. التطبيق نفسه ولا حتى في الخلفية أو في المقدمة. حاولت إيقاف التطبيق ولم يتم تشغيل الوظيفة ، لا يمكننا استخدامها في الاستئناف لأن التطبيق لم يتم تعليقه ، التطبيق لا ينتقل إلى المقدمة ولكن يتم بدء تشغيله. حتى بعد أن يكون الجهاز جاهزًا ، لا يتم إطلاق onNotification open.

لست متأكدًا من فهمي ولكن هل هذا صحيح.

1: تطبيقك غير نشط تمامًا
2: تتلقى إخطارًا محليًا للتطبيق
3 النقر فوق الإعلام
4 يتم تحميل التطبيق
5 onNotificationOpen لا يطلق النار

هل هذا صحيح؟

ما هو نظام التشغيل هذا؟

هل يمكنك تقديم بعض التعليمات البرمجية الخاصة بك؟

هل قمت بتضمين Cordova.js في البرنامج النصي الخاص بك؟

هل أنت متأكد بنسبة 100٪ من عدم وجود أخطاء js في صفحة التحميل؟

@ device68 أود معرفة ما إذا تم تشغيل onNotificationOpen عندما لا يتم تشغيل التطبيق في البداية ، مثل nikrhes قال.
لقد اختبرت على كل من Android و iOS مع استدعاء onNotificationOpen للاستئناف والتجهيز. وفقط الحالة التي ذكرتها أعلاه لم تنجح. هناك أيضًا بعض السلوكيات غير المتوقعة مع المواقف الأخرى أيضًا.
يمكنك التحقق من العدد رقم 137 الذي فتحته.

@ chanphillip ، سآخذ نظرة في الصباح. لا يمكنني تأكيد iOS 10 لأنني أستخدم إصدارًا أقدم من XCODE ، لكنني سأرى ما يحدث بالضبط على Android.

يستخدم تطبيقي بشكل كبير كلا من البرودة بدءًا من الحمولات من الإشعارات والاستئناف ، ولكن لم يلاحظ أي مشاكل.

@ device68 كل الوضع يعمل بشكل جيد فقط عندما يكون التطبيق غير نشط ، لا يتم تشغيل الوظيفة على الإطلاق. لقد تم اختباري ، تقريبًا على كل نظام تشغيل IOS و android يمكنني الاستيلاء عليه. لا يزال لا يعمل.

مما أتذكره خلال الاختبارات التي أجريتها اليوم على Android ، هذا ما يحدث.

1 تطبيق غير نشط

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

أي رمز داخل السيرة الذاتية لن يلتقط الحمولة.

أي إشعارات أخرى عندما يكون التطبيق لا يزال نشطًا ولم يتم تصغيره بعد ، يتم تلقيها بواسطة الوظائف الموجودة داخل onDeviceReady.

2 تصغير التطبيق لأول مرة.

في المرة الأولى التي أقوم فيها بتصغير التطبيق ، يتوقف هذا onDeviceReady لأن القرار جاهز بالفعل وينتظر الآن حالة الاستئناف.

إذا تلقيت إشعارًا وقمت بالنقر فوقه ، فسيتم فتح التطبيق وكود المكون الإضافي داخل السيرة الذاتية يلتقط الآن الحمولة.

يتم استلام جميع الإخطارات اللاحقة عن طريق استئناف.

3 تطبيق مصغر (بشكل عام)

إذا تم تصغير تطبيقي في أي وقت وقمت بالنقر فوق إشعار ، يقوم استئناف بالتقاط هذا ، ولكن إذا لم أنقر فوقه وفتح التطبيق يدويًا بدلاً من ذلك ، فإن السيرة الذاتية لا تفعل شيئًا ولا يتم تشغيل onNotificationOpen في أي مكان في الكود الخاص بي.

لاحظ أن هذا النشاط مختلف تمامًا في iOS 9.3

4 التطبيق الأمامي

إذا تلقيت إشعارًا بعد الاستئناف أثناء التواجد في التطبيق ، فإن السيرة الذاتية تلتقط الحمولة.

5 قتل التطبيق

إذا قتلت التطبيق ، سنبدأ من رقم 1

6 حمولات

يعتمد الاختلافان اللذان رأيهما في البيانات التي يرسلها GCM على Android على ما إذا تم النقر فوق الإشعار خارج التطبيق أو تلقيه أثناء وجوده في المقدمة.

تضيف Google الرمز الزمني ، من ، ومعرف الرسالة وما إلى ذلك إذا تم النقر على الإشعار.

تزيل Google ما سبق ولكنها تضيف فقط اضغط = خطأ في جميع الظروف الأخرى.

أي متغيرات بيانات ترسلها موجودة في جميع الحالات.

أنا أستخدم Curl API من جانب الخادم لإرسال رسائل بين الويب و Android و iOS

في النهاية ، يبدو كل شيء منطقيًا على نظام Android ، إنه في الواقع تطبيق iOS خاطئ وغير منطقي.

يعمل كل شيء على iOS مع onDeviceReady و onNotificationOpen في كل مرة يتم فيها تلقي إشعار حتى عند فتح تطبيق يدويًا بعد تلقي الإشعارات أو النقر فوق رسالة أو تلقي إشعار أثناء وجود التطبيق في المقدمة.

أتمنى أن يساعدك هذا.

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

@ device68 شكرًا على شرحك التفصيلي.
في الواقع ، لقد قلت ذلك بشكل خاطئ ، كنت أقوم أيضًا بوضع NotificationOpen في كل من استئناف الجهاز وجاهز ، لكن حالة الاستخدام 1 (النقر فوق الإشعار عندما لا يتم تشغيل التطبيق) لم تنجح من جانبي ، بينما تعمل حالات الاستخدام الأخرى مثل ما وصفته.

أفترض أنك لا تستخدم إطار عمل أيوني أثناء الاختبار. أنا أستخدم المنصة.

هل يمكنك التأكيد مرتين على تشغيل onNotificationOpen حتى عندما لا يتم تشغيل التطبيق (تم إيقاف التطبيق) من جانبك؟ هل من الممكن أيضًا اختبار ذلك على iOS أيضًا؟ شكرا لك.

chanphillip لا توجد مشكلة سعيد لأنني أستطيع المساعدة.

صحيح ، أنا فقط أستخدم البرنامج المساعد phonegap الخام المثبت عبر CLI ثم تم تثبيت هذا المكون الإضافي بداخله.

حسنًا ، لقد أجريت بعض الاختبارات الإضافية وأنشأت مقطع فيديو لجهازي مع تنبيهات في 4 أماكن.

https://www.youtube.com/watch؟v=xrWQH2wE8Fo

يبدو أن هذا يؤكد ما تراه. لا يتم تشغيل onNotificationOpen على الإطلاق عند النقر على إشعار يتسبب في بدء تشغيل التطبيق. بعد ذلك فقط يتم جمع الإشعارات من الوظيفة onNotificationOpen.

يطلق المستمعون النار كما هو متوقع ولكن ليس onNotificationOpen.

بالنسبة لي ، هذه ليست مشكلة خاصة بتطبيقي وهو ما يفسر على الأرجح سبب عدم رؤيتي له حتى الآن.

لقد اختبرت على الأجهزة التي تعمل بنظام Android 4+ و 6+ و 7+ ، وكلها نفس النتيجة.

لسوء الحظ ، لا أعتقد أنه يمكنني المساعدة كثيرًا مع iOS ، فأنا أستخدم Virtualbox مع Yosemite و XCODE 7.1 (مجبر على تضمين iOS 9.3 SDK) وجدت أن الإشعارات تعمل حصريًا مع onDeviceRedy ولم أحتاج حتى إلى استخدام Resume. كان هذا للأجهزة التي تعمل بنظام iOS 9+ ولكن أقل من 10+

ومع ذلك ، قام المستخدمون النهائيون بتحديث هواتفهم إلى 10.2 وتوقفت الإشعارات عن العمل. أعتقد أن هذا بسبب بناء XCODE الخاص بي مع 9.3 SDK ، فأنا الآن بحاجة لشراء جهاز Mac :-(

اسمحوا لي أن أعرف إذا كان الفيديو يساعد.

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

يرجى ملاحظة: عند تقييم الوظيفة عبر مقبس المنضدة الضوئية ، فإنها تعمل. إنه يعمل فقط عندما أقوم بتقييمه على IDE. لكن الوظيفة لا يتم تشغيلها أبدًا ، مثل إصدار البرنامج المساعد للطريقة "غير مسمى". لماذا يعمل تقييم الوظيفة؟

أهلا،
أواجه نفس المشكلة ، لذا أحاول فهم ما يحدث في الكود.
بالنسبة لحالة استخدام البداية الباردة ، يقول المستند أنه يجب استخدام onNewIntent.
كود البرنامج المساعد يبدو جيدا.

    <strong i="9">@Override</strong>
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        FirebasePlugin.sendNotification(intent.getExtras());
    }

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

{
  "to": "/topics/news",
  "notification": {
    "title": "Click Action Message",
    "text": "Sample message",
    "click_action": "android.intent.action.MAIN"
  }
}

أحاول القيام بذلك ولكن دون نجاح ، لست متأكدًا من الرغبة في النقر فوق الإجراء.
مهما كانت القيمة التي قمت بتعيينها ، لا يتم تشغيل التطبيق

        <activity android:name="MainActivity" >
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

<strong i="21">@Override</strong>
    protected void pluginInitialize() {
        final Context context = this.cordova.getActivity().getApplicationContext();
        final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
        this.cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                Log.d(TAG, "Starting Firebase plugin");
                mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
                if(extras != null && extras.size()>1) {
                    FirebasePlugin.sendNotification(extras);

                }
            }
        });
    }

على أي حال يبدو وكأنه اختراق قذر.

حسنًا ، تمكنت من استخدام click_action عن طريق إضافة فئة افتراضية في ملف manifest.xml ولكن لم يتم استدعاء onNewIntent.

            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

واجهت نفس المشكلة كما هو موضح أعلاه ، بشكل أساسي ، لم يتم تسليم حمولة الإشعارات عند بدء تشغيل التطبيق عن طريق النقر فوق إشعار. يبدو أن اقتراح @ huny0522 يحل المشكلة. 👍

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

تم إصلاح هذه المشكلة أو سيتم إصلاحها في الإصدار القادم !؟

التصحيح من @ huny0522 لم يحل المشكلة بالنسبة لي. onNotification تم تجاهل رد الاتصال المتلقى مع بدء التشغيل البارد لنظام Android. تعمل كافة السيناريوهات الأخرى بالشكل المتوقع.

أدت إعادة تثبيت المكون الإضافي من github إلى حل المشكلة التي تم إصدارها لي ، بعد تجربة جميع الحلول المقترحة

إضافة كوردوفا المساعد https://github.com/arnesson/cordova-plugin-firebase.git - حفظ

بعض واحد قد حل

الخطوة 3 التي كتب @ device68 ؟؟

التطبيق المصغر (بشكل عام)

إذا تم تصغير تطبيقي في أي وقت وقمت بالنقر فوق إشعار ، يقوم استئناف بالتقاط هذا ، ولكن إذا لم أنقر فوقه وفتح التطبيق يدويًا بدلاً من ذلك ، فإن السيرة الذاتية لا تفعل شيئًا ولا يتم تشغيل onNotificationOpen في أي مكان في الكود الخاص بي.

هذه هي مشكلتي الوحيدة الآن.

مشكلة مماثلة هنا.

اضطررت إلى إزالة هذا السطر من الكائن المرسل: "click_action": "YOUR_DATA_HERE".

الآن ، تشغيل التطبيق بشكل صحيح عندما أتطرق إلى الإشعار المستلم في الخلفية.

آمل أن يساعد.

لدي أيضًا نفس المشكلات في تطبيق أيوني / كوردوفا ، ولكن فقط على جهاز يعمل بنظام Android 6.0. في هذا الجهاز ، يتم تشغيل الإشعار دائمًا في شريط الحالة ، سواء كان لدي التطبيق في الخلفية أو في المقدمة (!) ولا يتم تشغيل رد الاتصال عند فتح الإشعار ، وبالتالي لا أحصل على الحمولة.
كان كل جهاز آخر اختبرته جيدًا (android 5 و iOS 9 و 10): في المقدمة ، يتم تشغيل بيانات رد الاتصال وأرد عليها ، وفي الخلفية يتلقى الإشعار بشكل طبيعي في شريط الحالة كما هو موضح في المستندات.

@ abhishek-kollipara ، فإن المشكلة التي تمت مناقشتها ليست كيفية التقاط الحمولة في حالة المقدمة / الخلفية ، بل عندما يكون التطبيق باردًا من خلال النقر على إشعار والتقاط حمولة الإخطار منه. ليست هذه هي المشكلة المتعلقة بكيفية تشكيل الحمولة خاصةً عندما يتم وصفها في مستندات مكون إضافي آخر وليس هذا.

لقد حققت نجاحي الأول في التقاط الحمولة على صندوق بارد منذ اليومين الماضيين عندما بدأت في مطاردته. الحصول على البرنامج المساعد الأيوني الأصلي "هدف الويب". قم بتثبيته كما هو موثق واستخدم وظيفة getIntent () المضمنة في التمهيد. إذا تم تمهيد التطبيق بواسطة إشعار ، فستكون بيانات الإشعار في مكان ما داخل الكائن الذي تم إرجاعه.

heidji هذا يعمل على IOS؟

في حالتي:

ذكري المظهر:
-بداية باردة: تشغيل OnNotificationOpen
-تطبيق مصغر: قم بتشغيل OnNotificationOpen
-Foreground التطبيق: قم بتشغيل OnNotificationOpen

IOS:
-بداية باردة: لا تقم بتشغيل OnNotificationOpen
-تطبيق مصغر: قم بتشغيل OnNotificationOpen
-Foreground التطبيق: قم بتشغيل OnNotificationOpen

شكرا للمساعدة

Hanzofm لا أعرف ما إذا كان يعمل على نظام iOS لأكون صادقًا. فقط حاول استخدام المكون الإضافي Web Intent وتسجيل مخرجاته في وحدة التحكم عند التشغيل.

لدي نفس السلوك في iOS الذي وصفته Hanzofm

لدي نفس السلوك في iOS. لا يتم استدعاء onNotificationOpen عند البدء البارد لتطبيق iOS عند النقر فوق الإشعار. باستخدام إصدار البرنامج المساعد 0.1.25.

تحديث:
كنت أستخدم "cordova-plugin-local-notifications" أيضًا مع المكوّن الإضافي Firebase والذي تسبب في حدوث المشكلة. عندما أزلت المكوّن الإضافي "cordova-plugin-local-notifications" ، فقد كان يعمل بشكل جيد.

أواجه أيضًا مشكلة في الحصول على noNotificationOpen للنار عند التشغيل البارد (iOS). هل يوجد حل هناك؟

شكرا

في حالتي تم حل إزالة المكون الإضافي للإشعارات المحلية. هناك عدم توافق مع هذا المكون الإضافي وإضافات إشعارات الدفع

ليس لدي هذا المكون الإضافي ، للأسف :)

هل من المفترض أن يكون هذا في؟

skjermbilde 2018-04-27 kl 09 22 50

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

heidji دعنا نقول أننا قمنا بحل المشكلة باستخدام طريقتك ، هل لديك أي شيء حول كيفية الحصول على بيانات الإشعار في الموقف التالي؟

التطبيق مغلق تماما. يتلقى المستخدم إشعار الدفع. لا ينقر المستخدم على الإشعار ولكنه يزيله من شريط الإشعارات بدلاً من ذلك. يفتح المستخدم التطبيق لاحقًا وينتقل إلى صفحة الإشعارات ولا يرى شيئًا. لأن المستخدم لم يحصل على الإشعار في المقدمة ولم ينقر عليه لفتح التطبيق. لكننا ما زلنا بحاجة إلى معرفة أن هذا الإشعار موجود لإظهار المستخدم. كيف تفعل هذا في ionic3؟

akildemir لا توجد طريقة للقيام بذلك في Ionic ، سيكون عليك تسجيل الإشعارات على الخادم الخاص بك واستعادتها عندما يفتح المستخدم التطبيق كما يفعل أي شخص عادةً.

heidji كيف سأقوم بتسجيل الإشعارات إلى الخادم الخاص بي لاستردادها ، إذا كنت لا أعرف أن هذا الإشعار موجود؟
هل هناك طريقة يرسل بها Firebase أيضًا الإشعارات إلى خادمي مع الجهاز أو هل تقصد عدم استخدام Firebase ولكن استخدام الخادم الخاص بك للإشعارات؟

akildemir أعني عندما تنشئ إشعار دفع ، فإنك تسجل أيضًا وجوده في مكان آخر ، مثل الخادم الخاص بك أو أي خادم تستخدمه لمشروعك. أعتقد أن Firebase يوفر أيضًا هذه الخدمات.
لا أعرف كيف تنشئ هذه الإخطارات ولكن في مشروعي عندما يحدث شيء ما على خادم PHP الخاص بي ، على سبيل المثال ، أرسل شخص ما لك رسالة ، أتصل بـ firebase لإرسال إشعار وأنا أيضًا أحفظ هذا الحدث بـ "is_read = 0" علامة ، لذلك إذا لم ينقر المستخدم مطلقًا على الإشعار ، فيمكنه استعادته على موقع الويب أو إذا كان التطبيق يستخدم خدمتك الخاصة للاتصال بهذه الإشعارات أو أيًا كان ، فقط عناصر التطوير القياسية ..

heidji ليس لدي موقع ويب لتطبيقي ، لكن ما قلته منطقي للغاية يمكنني تخزين الإشعار في خادمي في نفس الوقت واستعادته لاحقًا. شكرا! ونعم ، يمكن اعتبارني مبتدئًا في عناصر تطوير الأجهزة المحمولة. أيضا هل يمكنني أن أسأل شيئا آخر؟ كيف يمكنني تسجيل نفس الإخطار لأجهزة متعددة من خلال Firebase؟ يمكنك التفكير في الأمر مثل الدردشة الجماعية. عندما يكتب شخص ما شيئًا ما في المجموعة ، يدردش كل فرد في المجموعة عليه. أستخدم هذا التنسيق لتسجيل إشعار:

دع الجسم = {
"تنبيه":{
"title": "title" , "body":"body" ،
} ،
"بيانات":{
"param1": "value1"
} ،
"إلى": DeviceId ،
"الأولوية": "عالية"،
"اسم_حزمة_مقيدة": ""
}

  let options = new HttpHeaders().set('Content-Type','application/json');
  this.http.post("https://fcm.googleapis.com/fcm/send",body,{
    headers: options.set('Authorization', 'key=),
  })

هنا إذا قمت بتمرير deviceId إلى قسم "to" فإنه يرسل إلى الجهاز. ولكن هل يمكنني تمرير عدة أجهزة هنا؟

nikrhes @ يمكنك التحقق من ذلك في البيانات الوصفية:
window.FirebasePlugin.onNotificationOpen (). Subscribe ((data) => {
إذا (data.tap) {
// ينقر المستخدم على الإخطار
} آخر {
// التطبيق قيد التشغيل في المقدمة
}
}) ؛

لست متأكدًا من أن هذا قد تم حله على الإطلاق ولكني كنت أبحث عن الإجابة لعدة أشهر من خلال المواضيع المختلفة الموجودة حول هذا الموضوع. لكي نكون واضحين ، فإن المشكلة في Not Notification لا يتم إطلاقها على وجه التحديد في حالة iOS حيث يتم إغلاق / إيقاف / إيقاف التطبيق تمامًا. يأتي الإشعار ، قم بتشغيل التطبيق ، لكن الوظيفة لا تنطلق ولا يتم تسليم الحمولة.

heidji - عملك حول حل تخزين أحداث الدفع على الخادم والتحقق مما إذا كانت قد تمت قراءتها أمر منطقي. ومع ذلك ، يوجد في تطبيقنا سيناريوهات لن تعمل من أجلها (على سبيل المثال ، نحتاج إلى تحديد ما إذا كان سيتم تشغيل الإشعار استنادًا إلى ما إذا كان المستخدم قد نقر عليه بالفعل وليس ما إذا كان قد قرأه أم لا.)

لكن الشيء الرئيسي ، كما ذكر العديد من الآخرين ، هو أن هذا يبدو سلوكًا نقديًا يجب أن يكون هناك حل له؟

wwwguy الحل الخاص بي ليس حلاً. إنها ممارسة قياسية يستخدمها الجميع ، كبيرة كانت أم صغيرة.
لا يمكنك الاعتماد على مكابس الإخطار ، فهذه ليست أحداث مضمونة. أعني عندما أضغط على إشعار facebook على هاتفي xiaomi أحيانًا لا يفتح التطبيق أبدًا.

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

على أي حال ... لم أكن بالضرورة أنشر للدخول في نقاش فلسفي كبير (كنت في الواقع أعطي إيماءة لـ heidji من أجل الفكرة الجيدة لأن ذلك سيهتم بالمسألة في كثير من الحالات). لكن بالتأكيد يمكننا أن نتفق جميعًا على أن هذا:

تطبيق Android المفتوح = يعمل
iOS Open App = يعمل
تطبيق Android في الخلفية = يعمل
تطبيق الخلفية لنظام iOS = يعمل
Android Cold Boot From Killed App = يعمل
iOS Cold Boot From Killed App = لا يعمل

... ليس هو التصميم المقصود للمكوِّن الإضافي. لذلك فهو إما خطأ لم يعالجه المطور (ربما بسبب الارتباك الذي يسببه كل هذه الخيوط المختلفة والأشخاص المختلفين الذين يخطئون في تشخيص المشكلة) ، أو شيء آخر مثل المتغيرات التي تم تمريرها في هيكل PUSH أو الوظيفة التي تم تجميعها في xCode مما تسبب في هذا السلوك.

بصرف النظر عن إصلاح الأخطاء للمكون الإضافي من قبل المطور ... هل تمكن أي شخص من عزل إصلاح التعليمات البرمجية يدويًا لهذا الغرض؟

بصراحة الإخطار من Cold boot على iOS يعمل بالنسبة لي بنسبة 100٪. لقد استخدمت المكون الإضافي webintent لنظام Android فقط لأن onNotificationOpen لم يعمل معي هناك ولم يكن webintent موجودًا على iOS.
إذا كنت بحاجة إلى أي تفاصيل حول الإعداد الخاص بي ، فأعلمني بذلك

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

القضايا ذات الصلة

ghost picture ghost  ·  3تعليقات

stephan-nordnes-eriksen picture stephan-nordnes-eriksen  ·  5تعليقات

Zrnik picture Zrnik  ·  3تعليقات

rlz picture rlz  ·  4تعليقات

rolinger picture rolinger  ·  5تعليقات