وصف:
نتلقى عددًا من تقارير الأعطال الناشئة في 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)
+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 تعطلًا في الأسبوع ، وليس لدي أي طريقة لإعادة إنتاجها.
كذلك هنا.
معلومات جلب معلومات النظام والمكتبات ...
نظام:
نظام التشغيل: 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 />
);
}
مرحبا renatobentorocha ،
شكرا لمشاركتك الكود معنا!
قد يتم استدعاء الخطاف useEffect هنا لتهيئة SDK داخل مكون التطبيق الرئيسي. هذا في الأساس عبارة عن مكالمة غير متزامنة يتم استدعاؤها بمجرد تركيب المكون ، ولكن لا توجد حالة تتحقق مما إذا كانت التهيئة قد اكتملت أم لا.
يمكنك استخدام الخطاف useState لإضافة حالة للتحقق من حالة البادئ قبل عرض شاشة الترحيب.
هناك توصية أخرى ، كما اقترحها rgomezp ، وهي تشغيلها في رد الاتصال إلى addSubscriptionObserver (آسف بالنسبة لي للتحدث بسرعة كبيرة عن getPermissionSubscriptionState الذي تم إيقافه سابقًا) ، مما يضمن أن SDK قد تمت تهيئته بنجاح قبل الوصول إلى حالة الجهاز.
أخبرنا إذا كان هذا يساعد في حل المشكلة ،
شكرا
مرحبًا @ tyang1 شكرًا من خلال الاهتمام ، ولكن المستندات ذات الإشارة الواحدة لمعاودة الاتصال (getPermissionSubscriptionState) تقول:
سأختبر باستخدام addSubscriptionObserver
وسأخبرك بما سيحدث
الحصول على هذا أيضا. لا أعرف كيف تتكاثر. rgomezp ربما تكون مشكلة خيوط؟ يحدث هذا بشكل عشوائي ، لكن كثيرًا. نرى العديد من الآثار في تقرير الأعطال
مرحبًا ،
لا أعتقد أن هذه مشكلة تتعلق بالترابط حيث تشير آثار المكدس إلى احتمال حدوثها على مستوى الغلاف. يمكن أن يكون هذا بالتأكيد خطأ. نحتاج فقط إلى خطوات إعادة إنتاج موثوقة للمضي قدمًا في الحل.
من المثير للاهتمام renatobentorocha أنك
oferRoundsdijinshopwise وهذا شيء كنت ترى أيضا؟
+1
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
أي اقتراح؟ أي حل مؤقت؟
ما زلنا نتلقى المئات من هذه الحوادث ، أي أخبار؟
@ 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}
التعليق الأكثر فائدة
شكرا على الاكرامية