React-native-onesignal: [CRASH] [ANDROID] NullPointerException في getDeviceState

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

وصف:
نتلقى عددًا من تقارير الأعطال الناشئة في RNOneSignal.getDeviceState ، تتبع المكدس المرفق أدناه.

يؤثر على كل إصدار Android SDK والشركة المصنعة.

بيئة
"react-native-onesignal": "^4.0.2",
react: 17.0.1 => 17.0.1 react-native: 0.64.0-rc.2 => 0.64.0-rc.2

خطوات إعادة إنتاج المشكلة:
لم نتمكن من إعادة إظهار المشكلة ، فقد تم الإبلاغ عنها على لوحة تحكم التعطل في Google Play.

هل من شيء آخر:

  at com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:4)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:147)
  at com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:21)
  at com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
  at android.os.Handler.handleCallback (Handler.java:883)
  at android.os.Handler.dispatchMessage (Handler.java:100)
  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java)
  at android.os.Looper.loop (Looper.java:237)
  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:37)
  at java.lang.Thread.run (Thread.java:919)
Android Possible Bug

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

@ diego-paired كان الحل المؤقت لدينا هو تأخير المكالمة إلى getDeviceState() بعد بدء OneSingal (أضفنا تأخيرًا لمدة ثانيتين)

شكرا على الاكرامية

ال 28 كومينتر

+1.

java.lang.NullPointerException: at com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:4) at java.lang.reflect.Method.invoke (Method.java) at com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:147) at com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:21) at com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java) at android.os.Handler.handleCallback (Handler.java:873) at android.os.Handler.dispatchMessage (Handler.java:99) at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java) at android.os.Looper.loop (Looper.java:224) at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:37) at java.lang.Thread.run (Thread.java:764)

مرحبا دييغو ،
شكرا لك على الإبلاغ عن هذه المشكلة.

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

هتافات

مرحبا دييغو ،
شكرا لك على الإبلاغ عن هذه المشكلة.

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

هتافات

شكرا لردك.

يتم الإبلاغ عنها على وحدة تحكم Google Play الخاصة بنا بمعدل حوالي 50 تعطلًا في الأسبوع ، وليس لدي أي طريقة لإعادة إنتاجها.

image

كذلك هنا.

معلومات جلب معلومات النظام والمكتبات ...
نظام:
نظام التشغيل: macOS 10.15.7
وحدة المعالجة المركزية: (4) x64 Intel (R) Core (TM) i5-5257U CPU @ 2.70GHz
الذاكرة: 36.86 ميجا بايت / 8.00 جيجا بايت
شل: 5.7.1 - / bin / zsh
الثنائيات:
العقدة: 10.22.0 - ~ / .nvm / الإصدارات / العقدة / v10.22.0 / bin / العقدة
الغزل: 1.22.4 - / usr / local / bin / yarn
npm: 6.14.6 - ~ / .nvm / الإصدارات / العقدة / v10.22.0 / bin / npm
حارس: 4.9.0 - / usr / local / bin / حارس
المدراء:
CocoaPods: 1.10.0 - / usr / local / bin / pod
مجموعات SDK:
iOS SDK:
المنصات: iOS 13.6 ، DriverKit 19.0 ، macOS 10.15 ، tvOS 13.4 ، watchOS 6.2
أندرويد سك:
مستويات API: 23 ، 25 ، 26 ، 28 ، 29
أدوات البناء: 28.0.3 ، 29.0.2 ، 29.0.3
Android NDK: غير موجود
IDEs:
ستوديو أندرويد: 3.6 AI-192.7142.36.36.6308749
Xcode: 11.6 / 11E708- / usr / bin / xcodebuild
اللغات:
جافا: 1.8.0_242 - / usr / bin / javac
بايثون: 2.7.16 - / usr / bin / python
الحزم:
@ رد فعل المجتمع الأصلي / cli: غير موجود
رد فعل: 16.13.1 => 16.13.1
رد فعل أصلي: 0.63.3 => 0.63.3
رد فعل - أصلي - macos: غير موجود
الحزم:
رد فعل أصلي : غير موجود

"تفاعل أصلي": "0.63.3"،
"رد فعل أصلي إشارة واحدة": "^ 4.0.1"،

استثناء فادح: java.lang.NullPointerException
محاولة استدعاء الأسلوب الظاهري 'org.json.JSONObject com.onesignal.OSDeviceState.toJSONObject ()' في مرجع كائن فارغ

com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:239)
java.lang.reflect.Method.invoke (Method.java)
com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:372)
com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:151)
com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
android.os.Handler.handleCallback (Handler.java:883)
android.os.Handler.dispatchMessage (Handler.java:100)
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:27)
android.os.Looper.loop (Looper.java:241)
com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 4.run (MessageQueueThreadImpl.java:226)
java.lang.Thread.run (Thread.java:919)

يرجى تقديم مقتطف الشفرة لتسهيل إعادة الإنتاج.

هتافات

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

حدث الخطأ في استدعاء OneSignal.getDeviceState ():

const getDeviceState =  async () => {
     const deviceState = await OneSignal.getDeviceState();
     console.log({ deviceState });
}

الاستثناء هو:

Fatal Exception: java.lang.NullPointerException
Attempt to invoke virtual method 'org.json.JSONObject com.onesignal.OSDeviceState.toJSONObject()' on a null object reference

com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:239)
java.lang.reflect.Method.invoke (Method.java)
com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:372)
com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:151)
com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
android.os.Handler.handleCallback (Handler.java:883)
android.os.Handler.dispatchMessage (Handler.java:100)
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:27)
android.os.Looper.loop (Looper.java:241)
com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:226)
java.lang.Thread.run (Thread.java:919)

حزم OneSignal و React Native هي:

"react-native": "0.63.3",
"react-native-onesignal": "^4.0.1",
````

The react native info:

```typescript
info Fetching system and libraries information...
System:
OS: macOS 10.15.7
CPU: (4) x64 Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
Memory: 36.86 MB / 8.00 GB
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 10.22.0 - ~/.nvm/versions/node/v10.22.0/bin/node
Yarn: 1.22.4 - /usr/local/bin/yarn
npm: 6.14.6 - ~/.nvm/versions/node/v10.22.0/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
Managers:
CocoaPods: 1.10.0 - /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms: iOS 13.6, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
Android SDK:
API Levels: 23, 25, 26, 28, 29
Build Tools: 28.0.3, 29.0.2, 29.0.3
Android NDK: Not Found
IDEs:
Android Studio: 3.6 AI-192.7142.36.36.6308749
Xcode: 11.6/11E708 - /usr/bin/xcodebuild
Languages:
Java: 1.8.0_242 - /usr/bin/javac
Python: 2.7.16 - /usr/bin/python
npmPackages:
@react-native-community/cli: Not Found
react: 16.13.1 => 16.13.1
react-native: 0.63.3 => 0.63.3
react-native-macos: Not Found
npmGlobalPackages:
react-native: Not Found

الحصول على نفس المشكلة.

"تفاعل أصلي": "^ 0.63.4" ،
"رد فعل أصلي إشارة واحدة": "^ 4.0.3"

لقد قمت بالترقية من "رد فعل - أصلية - إشارة واحدة": "^ 3.9.3" إلى "رد فعل أصلي - إشارة واحدة": "^ 4.0.3". أنا أتعرض لحوادث الآن. لقد قمت بتحديث رمز التهيئة كما هو مذكور أعلاه. أضفت حديثا.

...
اسمح للجهاز = انتظار OneSignal.getDeviceState () ؛
...

من Play Store Crash Log

java.lang.NullPointerException:
على com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java)
على java.lang.reflect.Method.invoke (Method.java)
في com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java)
في com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java)
في com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
على android.os.Handler.handleCallback (Handler.java:739)
على android.os.Handler.dispatchMessage (Handler.java:95)
على com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java)
على android.os.Looper.loop (Looper.java:148)
في com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 4.run (MessageQueueThreadImpl.java)
في java.lang.Thread.run (Thread.java:818)

سجل تعطل Firebase

استثناء فادح: java.lang.NullPointerException: محاولة استدعاء الأسلوب الظاهري 'org.json.JSONObject com.onesignal.g0.a ()' على مرجع كائن فارغ
على com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState (RNOneSignal.java:4)
على java.lang.reflect.Method.invoke (Method.java)

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

const getDeviceState = غير متزامن () => {
const deviceState = await OneSignal.getDeviceState () ،
console.log ({deviceState}) ؛
}

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

على سبيل المثال: كيف يرتبط استدعاء getDeviceState بتهيئة OneSignal؟ أو ما هي وظيفة دورة حياة RN التي يتم استدعاؤها؟

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

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

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

المرجعي

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

مرحبًا ، في App.tsx ، نقطة الدخول لدينا ، لدينا:

const oneSignalIntialize = async () => {
  OneSignal.setAppId('xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx');
}

const App = () => {
  useEffect(() => {
    oneSignalIntialize();

  }, []);

return (
    <LoginFlow />
);

}

بعد تدفق تسجيل الدخول ، إذا نجح ذلك ، فلدينا شاشة ترحيب:

const getDeviceState = async () => {
    const deviceState = await OneSignal.getDeviceState(); 
    console.log({ deviceState });
}

const WelcomeScreen = () => {
  useEffect(() => {
    getDeviceState();

  }, []);

return (
    <Components />
);

}

Screen Shot 2021-02-18 at 10 59 35

مرحبا renatobentorocha ،
شكرا لمشاركتك الكود معنا!
قد يتم استدعاء الخطاف useEffect هنا لتهيئة SDK داخل مكون التطبيق الرئيسي. هذا في الأساس عبارة عن مكالمة غير متزامنة يتم استدعاؤها بمجرد تركيب المكون ، ولكن لا توجد حالة تتحقق مما إذا كانت التهيئة قد اكتملت أم لا.

يمكنك استخدام الخطاف useState لإضافة حالة للتحقق من حالة البادئ قبل عرض شاشة الترحيب.

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

أخبرنا إذا كان هذا يساعد في حل المشكلة ،

شكرا

مرحبًا @ tyang1 شكرًا من خلال الاهتمام ، ولكن المستندات ذات الإشارة الواحدة لمعاودة الاتصال (getPermissionSubscriptionState) تقول:

Screen Shot 2021-02-22 at 09 07 47

سأختبر باستخدام addSubscriptionObserver وسأخبرك بما سيحدث

الحصول على هذا أيضا. لا أعرف كيف تتكاثر. rgomezp ربما تكون مشكلة خيوط؟ يحدث هذا بشكل عشوائي ، لكن كثيرًا. نرى العديد من الآثار في تقرير الأعطال

image

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

من المثير للاهتمام renatobentorocha أنك

oferRoundsdijinshopwise وهذا شيء كنت ترى أيضا؟

+1

image

rgomezp اتبع الكود:

async componentDidMount() {
        this._isMounted = true

        /* O N E S I G N A L   S E T U P */
        OneSignal.setAppId('***********************************')
        OneSignal.setLogLevel(0, 0)
        OneSignal.setRequiresUserPrivacyConsent(false)

        /* O N E S I G N A L  H A N D L E R S */
        OneSignal.setNotificationWillShowInForegroundHandler(notifReceivedEvent => {
            let notification = notifReceivedEvent.getNotification()

            const buttonOk = {
                text: 'OK', onPress: () => {
                    notifReceivedEvent.complete()
                },
            }

            Alert.alert(notification.title, notification.body, [buttonOk])

            if (notification.additionalData) {
                //
            }

        })
        OneSignal.setNotificationOpenedHandler(notification => {
            //
        })


        OneSignal.disablePush(true)

        const deviceState = await OneSignal.getDeviceState()

        if (Platform.OS === 'ios' && !deviceState.isSubscribed) {
            OneSignal.promptForPushNotificationsWithUserResponse(function(accepted) {
                //
            });
        }

        // ...
}

لقد رجعت إلى الإصدار القديم ويحذر Google Play من نفس الخطأ.

com.geektime.rnonesignalandroid.RNOneSignal.getDeviceState

أي اقتراح؟ أي حل مؤقت؟

ما زلنا نتلقى المئات من هذه الحوادث ، أي أخبار؟
image

@ diego-paired كان الحل المؤقت لدينا هو تأخير المكالمة إلى getDeviceState() بعد بدء OneSingal (أضفنا تأخيرًا لمدة ثانيتين)

@ diego-paired كان الحل المؤقت لدينا هو تأخير المكالمة إلى getDeviceState() بعد بدء OneSingal (أضفنا تأخيرًا لمدة ثانيتين)

شكرا على الاكرامية

مرحبا renatobentorocha ،
شكرا لمشاركتك الكود معنا!
قد يتم استدعاء الخطاف useEffect هنا لتهيئة SDK داخل مكون التطبيق الرئيسي. هذا في الأساس عبارة عن مكالمة غير متزامنة يتم استدعاؤها بمجرد تركيب المكون ، ولكن لا توجد حالة تتحقق مما إذا كانت التهيئة قد اكتملت أم لا.

يمكنك استخدام الخطاف useState لإضافة حالة للتحقق من حالة البادئ قبل عرض شاشة الترحيب.

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

أخبرنا إذا كان هذا يساعد في حل المشكلة ،

شكرا

@ diego-paired @ dan-developer

لقد اتبعت اقتراح rgomezp وتوقف حدوث الأعطال في الوقت الحالي.

OneSignal.addSubscriptionObserver(() => {
    OneSignal.getDeviceState().then((deviceState) => {
      console.log({deviceState})
    });
  });

باستخدام تطبيق الاختبار ، أضف هذا الرمز إلى زر:

الموقف 1

let getDeviceStateButton = this.renderButtonView(
"Get Device State",
isExternalUserIdLoading || isPrivacyConsentLoading,
() => {

console.log("Attempting to get device state");
this.setState({ isExternalUserIdLoading: true }, () => {
// OneSignal getDeviceState
let deviceState = OneSignal.getDeviceState();
console.log("deviceState: ", deviceState);
console.log("deviceState.isSubscribed: ", deviceState.isSubscribed);
this.setState({ isExternalUserIdLoading: false, isSubscribed: deviceState.isSubscribed });
console.log("this.state.isSubscribed after calling setState: ", this.state.isSubscribed);
console.log("deviceState.userId: ", deviceState.userId)
});
});

يظهر السجل:

2021-03-25 20:06:14.589544-0700 jonexample[751:27269] [javascript] Attempting to get device state
2021-03-25 20:06:14.645290-0700 jonexample[751:27269] [javascript] 'deviceState: ', { _U: 0, _V: 0, _W: null, _X: null }
2021-03-25 20:06:14.647385-0700 jonexample[751:27269] [javascript] 'deviceState.isSubscribed: ', undefined
2021-03-25 20:06:14.647768-0700 jonexample[751:27269] [javascript] 'this.state.isSubscribed after calling setState: ', undefined
2021-03-25 20:06:14.647897-0700 jonexample[751:27269] [javascript] 'deviceState.userId: ', undefined

ومع ذلك ، عند استخدام رمز المثال المقدم في componentDidMount :

الموقف 2

async componentDidMount(){
 const deviceState = await OneSignal.getDeviceState();
this.setState({ isSubscribed : deviceState.isSubscribed});
console.log("componentDidMount deviceState: ", deviceState);
console.log("componentDidMount deviceState.isSubscribed: ", deviceState.isSubscribed);
console.log("componentDidMount deviceState.userId: ", deviceState.userId);
}

يظهر السجل:

2021-03-25 20:14:46.521099-0700 jonexample[1326:55465] [javascript] 'componentDidMount deviceState: ', { userId: '92aa2978-3f53-454e-b1a6-652c43f0dba4',
2021-03-25 20:14:46.521328-0700 jonexample[1326:55465] [javascript] 'componentDidMount deviceState.isSubscribed: ', true
2021-03-25 20:14:46.521435-0700 jonexample[1326:55465] [javascript] 'componentDidMount deviceState.userId: ', '92aa2978-3f53-454e-b1a6-652c43f0dba4'

rgomezp هو السيناريو 1 السلوك المتوقع؟

@ diego- pairedrenatobentorocha @ dan-developer هل تستطيع مشاركة الأمثلة الخاصة بك أو تأكيد ما إذا كان كلا

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

@ jfishman1 ألق نظرة على الوثائق . ستلاحظ أن getDeviceState هي وظيفة غير متزامنة ، لذا تأكد من انتظارها ، أو استخدم then .

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

عند البحث في هذا الأمر أكثر قليلاً ، يبدو أن السبب الأكثر ترجيحًا لذلك هو أن الجانب الأصلي يحاول الحصول على حالة الجهاز قبل تحميل السياق.

if (appContext == null) {
         logger.error("OneSignal.initWithContext has not been called. Could not get OSDeviceState");
         return null;
      }

مصدر

للتأكيد ، يرجى البحث عن OneSignal.initWithContext has not been called. Could not get OSDeviceState في logcat الأصلي الخاص بك (على سبيل المثال: افتح Android Studio).

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

بغض النظر ، يرجى ملاحظة:
ما زلنا نوصي بالحصول على حالة الجهاز فقط عبر مراقب تغيير الاشتراك للتأكد من أنك لا تحصل على حالة الجهاز في وقت مبكر جدًا

شكرا لكم على صبركم.


من # 1085:
بدلاً من تأخير أداة الحصول على حالة الجهاز عبر مؤقت ، حاول وضع استدعاء الوظيفة getDeviceState في مراقب الاشتراك. بهذه الطريقة ، ستعرف أنه مشترك. على سبيل المثال:

OneSignal.addSubscriptionObserver(async (event) => {
    this.OSLog("OneSignal: subscription changed:", event);
    if (event.to.isSubscribed) {
        const state = await OneSignal.getDeviceState();
        // do something with the device state
    }
});

التحديث: تم إصلاح هذا الآن في أحدث إصدار 4.0.7

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

{"rootTag":21,"initialProps":{}}
 WARN  {"hasNotificationPermission": false, "isEmailSubscribed": false, "isPushDisabled": false, "isSMSSubscribed": false, "isSubscribed": false, "notificationPermissionStatus": 0}
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات