React-native-onesignal: onIds مشكلة

تم إنشاؤها على ١٩ فبراير ٢٠١٧  ·  25تعليقات  ·  مصدر: OneSignal/react-native-onesignal

مرحبًا ، لدي OneSignalController الذي أدرجه في Main.js

class OneSignalController extends Component {
    props: Props

    constructor(props) {
        super(props);
    }
    componentWillMount() {
        OneSignal.addEventListener('opened', this.onOpened);
        OneSignal.addEventListener('ids', this.onIds);
    }

    componentWillUnmount() {
        OneSignal.removeEventListener('opened', this.onOpened);
        OneSignal.removeEventListener('ids', this.onIds);
    }

    onIds = (device) => {
        this.props.dispatch_set_device_id(device.userId);
    }

    render() {
        return null;
    }
}

أستخدم redux-persist ولا أريد بدء تشغيل التطبيق قبل الانتهاء من rehydration .
لذلك أريد القيام بذلك في index.android.js

...
        this.state = { rehydrated: false };
    }

    componentWillMount() {
      Storage.restoreData(store, {}, () => {
        this.setState({ rehydrated: true });
        });
    }

    render() {
        return (
            this.state.rehydrated === true
            ? <Provider store={store}>
                <View style={styles.container}>
                    <Main />
                </View>
            </Provider>
            : null
        );
    }

ولكن إذا قمت بإجراء oneSignal فلن يقوم بتشغيل وظيفة onIds بعد الآن.

Help Wanted

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

لقد بدأت للتو في استخدام هذا lib وتعرضت لنفس المشكلة. باستخدام redux-persist هنا أيضًا! وبعد بعض الحفر، وأعتقد جازما أنه لا علاقة له مع مسترجع، لا تزال قائمة. أو أي اشتراك مؤجل في الحدث ids .

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

//... other imports
import OneSignal from "react-native-onesignal";

OneSignal.addEventListener('ids', (device) => {
    console.log("[OneSignal]>>ids: ", device);
});

// ....

AppRegistry.registerComponent ....

ومع ذلك ، إذا تم استدعاء OneSignal.addEventListener('ids' ... بعد الإماهة المتكررة => قبّل وداعًا لمعاودة الاتصال.

FIX هنا هو كيف (الإختراق؟) ثابتة، في الوقت الراهن (الحالي الافراج الرد أصلية-onesignal 3.0.3):

هناك طريقة غير موثقة من جانب js تسمى OneSignal.configure() تجعل الجانب الأصلي ( android و ios ) يبث حدث ids مرة أخرى إلى الجانب js.

لذلك ، سمها مباشرة بعد إضافة مستمع الحدث لـ 'ids':

// ... after store rehydration complete ...

OneSignal.addEventListener('ids', (device) => {
   // ... do whatever with device
});

OneSignal.configure();  // add this to trigger `ids` event

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

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

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

ال 25 كومينتر

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

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

كنت أتحقق مرة أخرى من جهاز المحاكاة اليوم واستغرق الأمر 10 ثوانٍ للحصول على حدث "onIds" ، بعد قبول الأذونات من خلال OneSignal.requestPermissions ().

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

علاوة على ذلك ، ليس من الواضح ما الذي يجب أن يكون عليه الحدث "المسجل" بشأن السبب الذي لم يتم تشغيله على أي حال.

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

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

لقد بدأت للتو في استخدام هذا lib وتعرضت لنفس المشكلة. باستخدام redux-persist هنا أيضًا! وبعد بعض الحفر، وأعتقد جازما أنه لا علاقة له مع مسترجع، لا تزال قائمة. أو أي اشتراك مؤجل في الحدث ids .

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

//... other imports
import OneSignal from "react-native-onesignal";

OneSignal.addEventListener('ids', (device) => {
    console.log("[OneSignal]>>ids: ", device);
});

// ....

AppRegistry.registerComponent ....

ومع ذلك ، إذا تم استدعاء OneSignal.addEventListener('ids' ... بعد الإماهة المتكررة => قبّل وداعًا لمعاودة الاتصال.

FIX هنا هو كيف (الإختراق؟) ثابتة، في الوقت الراهن (الحالي الافراج الرد أصلية-onesignal 3.0.3):

هناك طريقة غير موثقة من جانب js تسمى OneSignal.configure() تجعل الجانب الأصلي ( android و ios ) يبث حدث ids مرة أخرى إلى الجانب js.

لذلك ، سمها مباشرة بعد إضافة مستمع الحدث لـ 'ids':

// ... after store rehydration complete ...

OneSignal.addEventListener('ids', (device) => {
   // ... do whatever with device
});

OneSignal.configure();  // add this to trigger `ids` event

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

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

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

إذا اتصلت بـ OneSignal.configure () ؛ قبل مستمع الحدث هذا يعمل بشكل جيد. لست متأكدًا حتى مما إذا كان الأمر يتعلق بإعادة الاستمرارية.

مجرد ملاحظة سريعة لقد واجهت للتو هذه المشكلة مع السلوك غير المنتظم مع عدم إطلاق حدث onIds.

الآن بعد إضافة وظيفة التكوين إلى مكون آخر يتم تحميله لاحقًا قليلاً في بدء تشغيل التطبيق ، أحصل أحيانًا على حدث onIds واحد وفي بعض الأحيان يتم إطلاق حدثين (نظرًا لأن العنصر الأصلي يتم إطلاقه في بعض الأحيان).

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

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

إذا كان هناك نوع من النتائج السلبية للقيام بذلك (بخلاف عدم الكفاءة) ، فيرجى إبلاغي بذلك لأن هذا ليس مجال خبرة بالنسبة لي.

لدي نفس الشيء ونحن في الإنتاج. ؛) نعم ، أنا أستدعي API مرتين. :(

مرحبًا @ edo1493 ، لدي نفس المشكلة أيضًا. كيف تستدعي API مرتين؟

لقد لاحظت أنه بدون إعادة تحميل التطبيق (وضع Dev) ، لن ينطلق الحدث إلا بعد 35 ثانية

يحرر:
يحدث هذا عند أول تحميل للتطبيق
النظام الأساسي: Android

ربما سيتمكن @ jkasten2 من المساعدة هنا ، أعتقد أنها ليست مشكلة في هذه المكتبة المحددة ،

@ edo1493 onIds لن يتم إطلاقه ما لم يتم الحصول على معرف مستخدم / لاعب من خادم OneSignal. هذا يعني أن userId لن يكون أبدًا null ومع ذلك فإن pushToken قد يحدث إذا لم تستجب APNs / FCM في الوقت المناسب. يبدو أن المشكلة التي تراها مرتبطة بالاتصال. هل يمكنك محاولة استدعاء setLogLevel بالرمز الأصلي لتمكين تسجيل مكالمات الشبكة؟ إذا كنت قادرًا على إعادة إظهار المشكلة مع Android ، فستوفر مزيدًا من التفاصيل حول المكالمات التي يتم إجراؤها في logcat مقابل سجل Xcode مع iOS.

ومع ذلك ، يبدو أن المشكلة الأكثر ملاحظة تتعلق بـ redux-persist مما يعني على الأرجح وجود مشكلة في طبقة جافا سكريبت مع المكون الإضافي OneSignal. avishayil هل يمكنك محاولة إعادة redux-persist ومحاولة تحديد المشكلة؟ شارك المشروع بمجرد القيام بذلك ، يمكنني محاولة تصحيحه أيضًا.

@ jkasten2 لا مشاريعي ، لذا سيكون من الصعب إيجاد الوقت لإعادة الإنتاج. أعتقد أنه سيكون من الأسهل أن يشارك أحد الأشخاص هنا الريبو باستخدام redux-persist مع إعادة إنتاج المشكلة.

عدم استخدام الإعادة وما زالت هذه مشكلة.

شكرا rcugut ! OneSignal.configure() أصلحه على الفور! أنا أستخدم redux-persist أيضًا! تحتاج هذا لإصلاح!

عند إضافة .configure ، تم إصلاحه بالنسبة لي أيضًا ، فأنا لا أستخدم رد الفعل المستمر.

بالنسبة لي ، يعمل الاختراق أيضًا OneSignal.configure() ، لكنني لاحظت أن OneSignal.removeEventListener("ids", this.onIds) لا يعمل. لست متأكدًا مما إذا كان هذا مرتبطًا. أي أفكار كيفية إصلاح هذا؟

تواجه نفس الشيء مثلjunedomingo

في Android ، عند التحميل الأول للتطبيق ، يتم استدعاء حدث المعرفات بعد 35 ثانية

ليس لدي أي مشكلة على Android ، ينطلق الحدث دون أي مشكلة.
لكنني أعاني على نظام iOS ، حيث لا ، أبدًا ، لا أدخل في وظيفة onIds() ...
لم تساعد إضافة OneSignal.configure() قبل أو بعد مستمعي الحدث وقبل أو بعد اكتمال إعادة الترطيب (نعم ، أنا أستخدم redux-persist ).
هل عند احدكم فكرة؟

@ jkasten2 لدي نفس المشكلة التي ذكرها junedomingo هنا على مستمع ids. أضع سجل خارج وداخل هذه الطريقة

     OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
            public void idsAvailable(String userId, String registrationId) {
                final WritableMap params = Arguments.createMap();

                params.putString("userId", userId);
                params.putString("pushToken", registrationId);

                sendEvent("OneSignal-idsAvailable", params);
            }
        });

يستجيب بعد 30 ثانية!
هل لديك فكرة / حل؟

إذا كان لديك OneSignal.setRequiresUserPrivacyConsent (صحيح) ؛
لن يعمل حتى تقدم الموافقة!
OneSignal.provideUserConsent (صحيح) ،

اتصل أيضًا بـ OneSignal.configure () بعد إضافة مستمعين.
الأمل يعمل من أجلك !!!

نفس المشكلة
الإصدار: v3.3.1
النظام الأساسي: iOS

كما ترى هنا userId فارغ ، فقط بعد 29 ثانية يقوم مستمع الحدث بتشغيل userId. هذا عند التشغيل الأول بعد التثبيت النظيف للتطبيق.
Screen Shot 2019-08-05 at 3 04 59 PM

أي شخص ما زال يعاني من هذه المشكلة؟
يتم تشغيل الحدث فقط بعد 30 ثانية تقريبًا في التمهيد الشفاف في android.

damathryx مرحبًا ، أواجه نفس userId فارغًا عند إصدار أول مرة. هل وجدت حلا لذلك؟

يجب إعادة فتح هذه المشكلة 😩

بالنسبة لي ، لا تأتي إشعارات الدفع على Android بدون .configure . يتم تشغيل المعرفات بشكل جيد الآن ، ويتم تلقي معلومات الجهاز ، لكن الإشعارات نفسها لا تعمل.

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