Cordova-plugin-firebase: (Android) انقر فوق إشعار لا يؤدي إلى رد اتصال onNotificationOpen

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

كوردوفا 6.3.1
البرنامج الإضافي Phonegap Firebase 0.1.12.0
الجهاز: LG G5 بنظام Android 6.0.1

هذا هو الكود الذي أستخدمه:
`تطبيق var = {
// منشئ التطبيق
تهيئة: function () {
this.bindEvents () ؛
} ،
// ربط مستمعي الأحداث
//
// ربط أي أحداث مطلوبة عند بدء التشغيل. الأحداث الشائعة هي:
// 'load' و 'deviceready' و 'offline' و 'online'.
bindEvents: الوظيفة () {
document.addEventListener ('deviceready، this.onDeviceReady، false) ؛
} ،
// deviceready Event Handler
//
// نطاق "هذا" هو الحدث. من أجل استدعاء "حدث المستلم"
// وظيفة ، يجب أن نستدعي صراحة "app.receivedEvent (...) ؛"
onDeviceReady: الوظيفة () {
console.log ("Estamos en onDeviceReady") ؛
إذا (navigator.connection.type == Connection.NONE) {
navigator.notification.alert ('Se Requiere conexión a Internet') ؛
} آخر {
window.FirebasePlugin.onNotificationOpen (الوظيفة (الإخطار) {
console.log (إعلام) ؛
navigator.notification.alert ("Recibido") ؛
} ، وظيفة (خطأ) {
console.log (خطأ) ؛
}) ؛
}
} ،

} ؛
app.initialize () ؛ `

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

هل هناك أي خطأ في الكود؟

شكرا لك مقدما.

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

لقد أعدت كتابة معالجة onNotificationOpen بالكامل وجعلتها تعمل تقريبًا كما أتوقع ، وهي:

  • يصل الإخطار مع العميل في forground ، وفتح الإخطار ويتم استدعاء onNotificationOpen في العميل الحالي (بدون إعادة التحميل)
  • يصل الإخطار مع العميل في الخلفية ، وإخطار مفتوح ويتم إحضار العميل إلى Forground ويتم استدعاء onNotificationOpen مع العميل الحالي (بدون إعادة التحميل)

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

أنا لست من مستخدمي Android قليلاً ، لذلك قد تكون هناك بعض التحسينات التي يمكن إجراؤها ، لكن يبدو أنها تعمل بشكل جيد ، لذلك اعتقدت أنني سأشاركها.

OnNotificationOpe nReceiver: مكالمات

FirebasePlugin.onBroadcastReceive(context, intent);

تم تغيير FirebasePlugin النحو التالي

  • إزالة WeakReference من callbackContext
  • add onBroadcastReceive طريقة تمرير البيانات المقصودة إلى onNotificationOpen
  • add onNewIntent ، يمرر بيانات النية إلى onNotificationOpen
  • استعادة الإصدار القديم من onNotificationOpen وتغييره على النحو التالي

    • تمت إزالة خط WeakReference

    • قم بتغيير عمليات الاسترجاعات لاستخدام PluginResult واستدعاء setKeepCallback (صحيح) على النتيجة لمنع إزالة رد الاتصال بعد المكالمة الأولى

    private static CallbackContext callbackContext;
    // ...
    private void registerOnNotificationOpen(final CallbackContext callbackContext) {
        FirebasePlugin.callbackContext = callbackContext;
    }

    // called when in foreground
    public static void onBroadcastReceive(Context context, Intent intent) {
        Log.d("FirebasePlugin", "onBroadcastReceive");
        Bundle data = intent.getExtras();
        FirebasePlugin.onNotificationOpen(data);
    }

    // called when in background
    <strong i="32">@Override</strong>
    public void onNewIntent(Intent intent) {
        Log.d(TAG, "new intent " + intent);
        super.onNewIntent(intent);
        FirebasePlugin.onNotificationOpen(intent.getExtras());
    }

    public static void onNotificationOpen(Bundle bundle) {
        if (FirebasePlugin.callbackContext == null ) {
            Log.d("FirebasePlugin", "no callback context, onNotificationOpen ignored");
            return;
        }
        if (callbackContext != null && bundle != null) {
            JSONObject json = new JSONObject();
            Set<String> keys = bundle.keySet();
            for (String key : keys) {
                try {
                    json.put(key, bundle.get(key));
                } catch (JSONException e) {
                    Log.d("FirebasePlugin", "onNotificationOpen: json exception");
                    PluginResult result = new PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage());
                    result.setKeepCallback(true);
                    callbackContext.sendPluginResult(result);
                    return;
                }
            }
            Log.d("FirebasePlugin", "onNotificationOpen: send notification to javascript");
            PluginResult result = new PluginResult(PluginResult.Status.OK, json);
            result.setKeepCallback(true);
            callbackContext.sendPluginResult(result);
        }
    }

ال 28 كومينتر

نفس المشكلة ، في إشعارات android ، ولكن لا يتم استدعاء أي رد اتصال داخل التطبيق.
الإصدار 0.1.12

voidbrainKibukita من فضلك، اختبار أحدث نسخة من الريبو. حاولت تحسين الإخطار المفتوح. شكرا.

BugsBunnyBR لقد حاولت للتو التحديث إلى أحدث إصدار من الريبو واختبرته للتو. على نظام Android ، لا يزال قيد التنفيذ onNotificationOpen.

superheroben ، هل يمكنك تقديم الريبو مع عينة من كيفية استدعاء رمز المكون الإضافي؟ كيف ترسل الإخطارات؟ اختبرت مع رسائل الموضوع.

نفس المشكلة هنا.
يتم استدعاء رد الاتصال getInstanceId () ، ويصل الإخطار ، ولكن لم يتم استدعاء onNotificationOpen () مطلقًا.

رمز العميل:

if (window.FirebasePlugin)
{
  window.FirebasePlugin.getInstanceId(
    function(token) {
        thiss.saveToken(token);
    }, 
    function(error) {
        console.log(error);
    }
  );

  window.FirebasePlugin.onNotificationOpen(
    function(notification) {                  
      alert("Yeah!!!");                  
    }, 
    function(error) {
      alert("Error!");
      console.error(error);
    }
  );

  window.FirebasePlugin.grantPermission();
}

هيكل بيانات إخطاري:

(
    [to] => (device token)
    [notification] => Array
        (
            [title] => Title
            [text] => Test message
            [sound] => default
            [vibrate] => 1
            [badge] => 2
        )
)

الكود الجانبي للخادم (PHP):

$jsonData = json_encode($data);

$ch     = curl_init("https://fcm.googleapis.com/fcm/send");
$header = array(
    'Content-Type: application/json',
    "Authorization: key=".MY_GCM_API_KEY
);

curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, true);
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);

$result = curl_exec($ch);
curl_close($ch);

يعمل على كوردوفا اندرويد 5.2.2. الجهاز المستخدم للاختبار يعمل بنظام Android 4.4.2. إصدار البرنامج المساعد 0.1.12.

arivanbastos ، هل حاولت الإشارة إلى

التثبيت من جيثب حل المشكلة جزئيًا. شكرا لك.

cordova plugin remove cordova-plugin-firebase
cordova plugin add https://github.com/arnesson/cordova-plugin-firebase/

الآن يتم استدعاء رد الاتصال onNotificationOpen () عندما يكون التطبيق في الخلفية.
عندما يكون التطبيق في المقدمة ، بدلاً من الإشارة إلى المستندات ، يصل الإشعار ولا يتم استدعاء onNotificationOpen ():

التطبيق في المقدمة:
يتلقى المستخدم بيانات الإشعار في رد اتصال JavaScript دون أي إخطار على الجهاز نفسه (هذا هو السلوك العادي لإشعارات الدفع ، الأمر متروك لك ، المطور ، لإعلام المستخدم)

إذا قمت بإرسال دفعة من نوع "الإعلام" (بدون نص بيانات) ، فلن يتم عرض الإشعار عندما يكون التطبيق في المقدمة.

آسف لم أفهم. هل ينبغي لي فقط إضافة قسم "البيانات" إلى بيانات التنبيه الخاصة بي؟

(
    [to] => (device token)
    [notification] => Array
        (
            [title] => Title
            [text] => Test message
        )
    [data] => Array
        (
            [test] => 1
        )
)

إلا أن ذلك لم يحل المشكلة.

تؤدي إعادة تسمية قسم "الإشعارات" حسب "البيانات" إلى تعطل التطبيق ("توقف التطبيق") عند وصول الإشعار:

(
    [to] => (device token)
    [data] => Array
        (
            [title] => Title
            [text] => Test message
        )
)

https://firebase.google.com/docs/cloud-messaging/android/receive
هنا موصوفة بشكل جيد للغاية.
ينتقل إخطارك إلى علبة النظام إذا كان التطبيق في الخلفية وإلى onMessageReceived () إذا كان التطبيق في المقدمة.
إذا كانت رسالتك تحتوي على بيانات ، فسيتم تمريرها دائمًا إلى onMessageReceived ().

أعتقد أن هناك مشكلة في تنفيذ onMessageReceived ().
عندما أنظر إلى الكود الذي أفسره يكون على النحو التالي:

  • استخراج البيانات
  • بناء إشعار مع NotificationBuilder
  • يخطر عبر NotificationManager

يقوم NotificationManager.notify (معرف ، إعلام) بنشر الإخطار ليتم عرضه في شريط الحالة.

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

حسنًا ، لقد وجدت قطعة الكود التي تستدعي رد الاتصال.
مع آخر التزام من BugsBunnyBR ، كان هناك تغيير في OnNotificationOpenReceiver والذي يوضح أن arivanbastos يحصل على رد الاتصال الخاص به عند الإشارة إلى github repo.

ولكن مع ذلك ، يتم إرسال الإشعار فقط (إلى OnNotificationOpenReceiver و NotificationManager) إذا كان هناك نص أو عنوان (في الإخطار أو في البيانات). هذا يعني أنه لا يمكن إرسال البيانات إلى التطبيق الخاص بك دون إرسال الإشعار إلى NotificationManager والذي يعرضه في شريط المعلومات.

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

تضمين التغريدة حسنًا ، سيحاول تطبيقي دائمًا إظهار الإشعار. أو سيتم عرض إشعار Firebase التلقائي المعروض أو الإصدار داخل onMessageReceived .
سيتم استدعاء رد الاتصال onNotificationOpen عندما يتم استدعاء onMessageReceived أو عندما يكون للإعلام هيئات بيانات وإشعارات في نفس الوقت. في العلاقات العامة الخاصة بي التي قدمت onNotificationOpen حاولت توضيح أن دفع الإخطارات من نوع الإخطار لن يؤدي إلى إعادة الاتصال. يوصى دائمًا بتضمين Data body و Notification body ، بحيث يمكن للمكوِّن الإضافي اكتشاف وإعادة الاتصال وإطلاقه.

أعلم أن عرض الإشعار دائمًا ليس سلوك إشعار Firebase القياسي.

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

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

2) ما عليك سوى التعليق على هذا السطر وتعطيل الإشعار عندما يكون التطبيق في المقدمة.

_Always_ -> إذا عثر البرنامج المساعد على "نص" أو "عنوان" في نص الإشعار.

BugsBunnyBR تعجبني فكرة وجود علم لاختيار السلوك.
أود فصل NotificationManager عن OnNotificationOpenReceiver الذي يقوم باستدعاء JS-callback الخاص بك. توصيتي بتقديم فحص ، إذا كانت هناك بيانات في الرسالة وإذا كان الأمر كذلك ، فاتصل بمعاودة الاتصال بالبيانات.
بالنسبة للإشعار ، سيكون من الجيد الحصول على العلم.
شكرا لك.

BugsBunnyBR لقد اختبرت للتو التبديل إلى github repo ووجدت أن النقر على إشعار
لكن رد الاتصال يعمل الآن ؛)

نفس الشيء هنا ، بالنسبة لي ، يتسبب الإصدار 0.1.13 في إعادة تشغيل تطبيقي فقط عندما يكون في المقدمة. الإصدار 0.1.12 يعمل بشكل جيد.

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

https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/android/FirebasePlugin.java#L123

في registerOnNotificationOpen يسجل رد الاتصال فقط إذا كان هناك انتظار notificationBundle

أيضًا ، يبدو أن سبب إعادة تحميل التطبيق إذا كان مفتوحًا بالفعل هو OnNotificationOpenReceiver هو واضح

launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

https://github.com/arnesson/cordova-plugin-firebase/blob/master/src/android/OnNotificationOpenReceiver.java#L17

مما يفرض على العميل إعادة التحميل ، حيث يتوفر notificationBundle عندما يتم تسجيل رد الاتصال onNotificationOpen حتى يحصل العميل بعد ذلك على الإشعار.

لقد أعدت كتابة معالجة onNotificationOpen بالكامل وجعلتها تعمل تقريبًا كما أتوقع ، وهي:

  • يصل الإخطار مع العميل في forground ، وفتح الإخطار ويتم استدعاء onNotificationOpen في العميل الحالي (بدون إعادة التحميل)
  • يصل الإخطار مع العميل في الخلفية ، وإخطار مفتوح ويتم إحضار العميل إلى Forground ويتم استدعاء onNotificationOpen مع العميل الحالي (بدون إعادة التحميل)

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

أنا لست من مستخدمي Android قليلاً ، لذلك قد تكون هناك بعض التحسينات التي يمكن إجراؤها ، لكن يبدو أنها تعمل بشكل جيد ، لذلك اعتقدت أنني سأشاركها.

OnNotificationOpe nReceiver: مكالمات

FirebasePlugin.onBroadcastReceive(context, intent);

تم تغيير FirebasePlugin النحو التالي

  • إزالة WeakReference من callbackContext
  • add onBroadcastReceive طريقة تمرير البيانات المقصودة إلى onNotificationOpen
  • add onNewIntent ، يمرر بيانات النية إلى onNotificationOpen
  • استعادة الإصدار القديم من onNotificationOpen وتغييره على النحو التالي

    • تمت إزالة خط WeakReference

    • قم بتغيير عمليات الاسترجاعات لاستخدام PluginResult واستدعاء setKeepCallback (صحيح) على النتيجة لمنع إزالة رد الاتصال بعد المكالمة الأولى

    private static CallbackContext callbackContext;
    // ...
    private void registerOnNotificationOpen(final CallbackContext callbackContext) {
        FirebasePlugin.callbackContext = callbackContext;
    }

    // called when in foreground
    public static void onBroadcastReceive(Context context, Intent intent) {
        Log.d("FirebasePlugin", "onBroadcastReceive");
        Bundle data = intent.getExtras();
        FirebasePlugin.onNotificationOpen(data);
    }

    // called when in background
    <strong i="32">@Override</strong>
    public void onNewIntent(Intent intent) {
        Log.d(TAG, "new intent " + intent);
        super.onNewIntent(intent);
        FirebasePlugin.onNotificationOpen(intent.getExtras());
    }

    public static void onNotificationOpen(Bundle bundle) {
        if (FirebasePlugin.callbackContext == null ) {
            Log.d("FirebasePlugin", "no callback context, onNotificationOpen ignored");
            return;
        }
        if (callbackContext != null && bundle != null) {
            JSONObject json = new JSONObject();
            Set<String> keys = bundle.keySet();
            for (String key : keys) {
                try {
                    json.put(key, bundle.get(key));
                } catch (JSONException e) {
                    Log.d("FirebasePlugin", "onNotificationOpen: json exception");
                    PluginResult result = new PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage());
                    result.setKeepCallback(true);
                    callbackContext.sendPluginResult(result);
                    return;
                }
            }
            Log.d("FirebasePlugin", "onNotificationOpen: send notification to javascript");
            PluginResult result = new PluginResult(PluginResult.Status.OK, json);
            result.setKeepCallback(true);
            callbackContext.sendPluginResult(result);
        }
    }

هام ... لقد لاحظت عدم تسليم الإشعارات (إلى الجهاز) عندما لا يعمل العميل (تم قتل).

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

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

أي أخبار ؟

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

لماذا لا ننشئ طلب سحب بهذا الرمز Mehuge منشور؟ إنه يعمل مثل السحر على android بالنسبة لي.

اضطررت إلى تحديث onNewIntent في FirebasePlugin لتصفية أهداف التشغيل العادية ، لذلك يبدو رمز onNewIntent الآن على هذا النحو

<strong i="6">@Override</strong>
public void onNewIntent(Intent intent) {
  Log.d(TAG, "new intent " + intent);
  super.onNewIntent(intent);
  Bundle data = intent.getExtras();
  if (data != null) {
    String id = data.getString("id");
    if (null != id) {
      FirebasePlugin.handleNotificationBundle(data);
    } else {
      Log.d(TAG, "Not a notification intent, ignored");
    }
  }
}

أنا لست سعيدًا تمامًا به. إنه يعمل من خلال البحث عن خاصية معرف في حزمة الهدف التي يرسلها رمز الخادم الخاص بي دائمًا. لا يبدو أن هناك أي شيء تضيفه GCM أو FBM بشكل موثوق إلى الحزمة التي يمكن استخدامها لتحديد النية كإشعار / رسالة. في بعض الأحيان نضيف بعض خصائص google (إذا كنا نفتح إشعارًا من الدرج) ولكن بالنسبة للرسائل والإشعارات التي يتم تسليمها مباشرة إلى العميل عندما تكون في المقدمة ، لا يوجد شيء آخر غير البيانات الموجودة في الرسالة التي تخبرك بأنها نية إطلاق بسبب إشعار ، على الأقل يمكنني رؤيته.

ربما هناك طريقة أفضل للتعامل مع هذا.

Mehuge ، هل تمانع في إنشاء قوائم مع جميع الملفات التي لديك؟

حسنًا ، ها هو https://gist.github.com/Mehuge/374ee24d9e18a6c7ccc171d3e521b7ad

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

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

<strong i="9">@Override</strong>
protected void onResume() {
    FirebasePlugin.setPaused(false);
    super.onResume();
}

<strong i="10">@Override</strong>
protected void onPause() {
    FirebasePlugin.setPaused(true);
    super.onPause();
}

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

لست سعيدًا تمامًا بالنتيجة النهائية ، فبعض المفاتيح الإضافية التي تمت إضافتها على سبيل المثال كانت تجريبية ولا يتم استخدامها بالفعل ، ولم أتمكن من إزالتها.

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

انظر # 108

بالنسبة لي ، يمكنني حل إجراء الطلب على النحو التالي:

{
  "registration_ids": [...tokens],
  "notification" : {
        "title": "Notf title",
        "body": "Notification body"
     },
     "data": {
        "click_action": "/call/dwEugLJ9PTVdcFb064CX"
     }
}

لكن كان علي أن أتخذ click_action كمعامل وأقوم بإعادة التوجيه يدويًا (كنت أستخدم cordova مع تطبيق رد الفعل).

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