وصف:
أهلا بالجميع. أواجه مشاكل مع أحداث onOpened / onReceived على android. يختلف السلوك في المحاكي وعلى جهاز حقيقي ، ولكن يتم تسليم رسالة دفع دقيقة في كلتا الحالتين.
على المحاكي:
على جهاز حقيقي:
بيئة
خطوات إعادة إنتاج المشكلة:
لا يمكنني تقديم خطوات لإعادة الإنتاج بسبب سياسة الثقة في شركتي.
أي شيء آخر:
android/build.gradle
"// ملف بناء المستوى الأعلى حيث يمكنك إضافة خيارات التكوين المشتركة لجميع المشاريع الفرعية / الوحدات النمطية.
بناء {
مستودعات {
jcenter ()
متصفح الجوجل()
}
التبعيات {
classpath 'com.android.tools. البناء: gradle : 3.0.1 '
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
جميع المشاريع {
مستودعات {
maven {url " https://jitpack.io "} // المستخدمة لـ MPAndroidChart
mavenLocal ()
متصفح الجوجل()
jcenter ()
مخضرم {
يتم تثبيت // All of React Native (JS ، ومصادر Obj-C ، وثنائيات Android) من npm
url "$ rootDir /../ node_modules / رد فعل أصلي / android"
}
}
}
`android/app/build.gradle`
تطبيق البرنامج المساعد: "com.onesignal.androidsdk.onesignal-gradle-plugin"
تطبيق المكون الإضافي: "com.android.application"
استيراد com.android.build.OutputFile
بناء {
مستودعات {
maven {url ' https://plugins.gradle.org/m2/ '} // Gradle Plugin Portal
}
التبعيات {
classpath "gradle.plugin.com. oneSignal: one-gradle-plugin : [0.10.0، 0.99.99] '
}
}
تطبيق البرنامج المساعد: "com.onesignal.androidsdk.onesignal-gradle-plugin"
/ **
react-native bundle
مع الوسيطات الصحيحة أثناء إصدار Androidapply from: "../../node_modules/react-native/react.gradle"
.project.ext.react = [
cliPath: "node_modules / haul / bin / cli.js"
]
تطبيق من: "../../node_modules/react-native/react.gradle"
/ **
/ **
ذكري المظهر {
الإصدار 27 من برنامج compileSdk
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.binomysteryshopper"
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
signingConfigs {
release {
if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
storeFile file(MYAPP_RELEASE_STORE_FILE)
storePassword MYAPP_RELEASE_STORE_PASSWORD
keyAlias MYAPP_RELEASE_KEY_ALIAS
keyPassword MYAPP_RELEASE_KEY_PASSWORD
}
}
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86"
}
}
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
def versionCodes = ["armeabi-v7a":1, "x86":2]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
}
}
}
}
التبعيات {
تجميع (مشروع (': رد فعل أصلي-واحد إشارة')) {
استبعاد المجموعة: "com.google.android.gms"
}
تجميع ("com.google.android.gms: play-services-base: 12.0.1") {
القوة = صحيح ؛
}
مشروع تجميع (': رد فعل أصلي الصوت')
ترجمة المشروع (': رد فعل أصلي الصوت')
مشروع تجميع (': رد فعل-أصلي-جلب-النقطة')
مشروع تجميع (': رد فعل أصلي fs')
مشروع تجميع (': تفاعل-أصلية-مشفر جغرافي')
مشروع تجميع (': React-native-image-crop-picker')
ترجمة المشروع (': رد فعل أصلي-التحقق من الإصدار')
مشروع تجميع (': رد فعل-أصلية-مخططات-غلاف')
مشروع تجميع (': رد فعل أصلي-سبينكيت')
مشروع تجميع (': رد فعل أصلي-svg')
تجميع المشروع (': خرائط تفاعلية أصلية')
تجميع fileTree (dir: "libs" ، بما في ذلك: ["* .jar"])
ترجمة "com.android. support: appcompat-v7 : 23.0.1"
تجميع "com.facebook. رد فعل: رد فعل أصلي : +" // من node_modules
}
// قم بتشغيل هذا مرة واحدة لتتمكن من تشغيل التطبيق باستخدام BUCK
// يضع جميع تبعيات الترجمة في libs المجلد ليستخدمها BUCK
مهمة copyDownloadableDepsToLibs (نوع: نسخ) {
من configurations.compile
في 'libs'
}
`android/app/src/main/java/com/binomysteryshopper/MainApplication.java`
حزمة com.binomysteryshopper ؛
استيراد android.app.Application ؛
استيراد com.facebook.react.ReactApplication ؛
استيراد com.geektime.rnonesignalandroid.ReactNativeOneSignalPackage ؛
استيراد com.zmxv.RNSound.RNSoundPackage ؛
استيراد com.rnim.rn.audio.ReactNativeAudioPackage ؛
استيراد com.RNFetchBlob.RNFetchBlobPackage ؛
استيراد com.rnfs.RNFSPackage ؛
استيراد com.reactnative.ivpusic.imagepicker.PickerPackage ؛
استيراد io.xogus.reactnative.versioncheck.RNVersionCheckPackage ؛
استيراد com.github.wuxudong.rncharts.MPAndroidChartPackage ؛
استيراد com.react.rnspinkit.RNSpinkitPackage ،
استيراد com.horcrux.svg.SvgPackage ؛
استيراد com.facebook.react.ReactNativeHost ؛
استيراد com.facebook.react.ReactPackage ؛
استيراد com.facebook.react.shell.MainReactPackage ؛
استيراد com.devfd.RNGeocoder.RNGeocoderPackage ؛
استيراد com.facebook.soloader.SoLoader ؛
استيراد com.airbnb.android.react.maps.MapsPackage ؛
استيراد java.util.Arrays ؛
استيراد java.util.List ؛
تطبيق MainApplication للفئة العامة يوسع تطبيقات التطبيق ReactApplication {
ReactNativeHost النهائي الخاص mReactNativeHost = new ReactNativeHost (this) {
@تجاوز
getUseDeveloperSupport () منطقية عامة {
إرجاع BuildConfig.DEBUG ؛
}
<strong i="13">@Override</strong>
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new ReactNativeOneSignalPackage(),
new RNSoundPackage(),
new ReactNativeAudioPackage(),
new RNFetchBlobPackage(),
new RNFSPackage(),
new PickerPackage(),
new RNVersionCheckPackage(),
new MPAndroidChartPackage(),
new RNSpinkitPackage(),
new RNGeocoderPackage(),
new SvgPackage(),
new MapsPackage()
);
}
<strong i="14">@Override</strong>
protected String getJSMainModuleName() {
return "index";
}
} ؛
@تجاوز
العامة ReactNativeHost getReactNativeHost () {
إرجاع mReactNativeHost ؛
}
@تجاوز
الفراغ العام عند الإنشاء () {
super.onCreate () ؛
SoLoader.init (هذا ، / * exopackage الأصلي * / false) ؛
}
}
`AndroidManifest.xml`
android: targetSdkVersion = "22" />
android: allowBackup = "صحيح"
android: label = "@ string / app_name"
android: icon = "@ mipmap / ic_launcher"
android: largeHeap = "true"
android: theme = "@ style / AppTheme">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="binoshopper" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
`my OneSignal init`
componentWillMount () {
OneSignal.init (ONESIGNAL_APP_ID ، {
kOSSettingsKeyAutoPrompt: صحيح ،
kOSSettingsKeyInAppLaunchURL: خطأ ،
kOSSettingsKeyPromptBeforeOpeningPushURL: صحيح ،
})
عرض (2)
OneSignal.addEventListener('received', this.onPushNotificationReceived)
OneSignal.addEventListener('opened', this.onPushNotificationOpened)
}
componentWillUnmount () {
OneSignal.removeEventListener ('مستلم' ، this.onPushNotificationReceived)
OneSignal.removeEventListener ('مفتوح' ، this.onPushNotificationOpened)
}
onPushNotificationReceived (إعلام) {
Alert.alert ('onReceived') // للاختبارات على جهاز حقيقي
}
onPushNotificationOpened (openResult) {
Alert.alert ('onOpened') // للاختبارات على جهاز حقيقي
}
""
على IOS ، إنه يعمل بشكل مثالي. لسوء الحظ ، لا يمكنني تقديم سجلات من android logcat ، لأنني لا أمتلك جهازًا حقيقيًا. كنت أختبر جهاز صديقي البعيد بسبب برنامج TeamViewer.
حاولت أيضًا الحصول على OneSignal.setLogLevel(0, 6)
على جهاز حقيقي. ولكن لم يتم العثور على أي أخطاء ، ونجحت جميع الطلبات ، ولم يتم تشغيل الأحداث فقط.
مرحبًا @ Ble3k ، لقد كنا مشغولين جدًا في العمل على Flutter SDK مؤخرًا ولم يكن لدينا وقت للتحقيق في مشكلتك حتى الآن ، ومع ذلك سأحقق في مشكلتك غدًا وسأعود إليك قريبًا ، نعتذر عن التأخير!
مرحبا،
أردت فقط أن أقول أنني أرى نفس السلوك على 3.2.5 على جهاز مطور. غريب لأنني لم أغير أي شيء مؤخرًا وأنا متأكد من أنه نجح منذ بضعة أيام ، حيث يتم عرض دفعاتي المركزة على أنها نخب داخل التطبيق أتذكر أنني اختبرت هذه وكانت تعمل.
لن أقوم بإجراء مزيد من التحقيق لأننا قررنا الانتقال إلى دفع الإشعارات العادية حتى عندما يكون التطبيق مركّزًا
@ Nightsd01 Thx ، سينتظر التحقيق الخاص بك.
على Android يواجه تأخيرًا في تلقي الإشعارات ، وتم اختباره على هاتفي الذي يعمل بنظام Android وتلقي إشعارًا بعد 30-40 دقيقة ، واختباره عدة مرات
أي تحديث على هذا؟ أواجه نفس المشكلة على جهاز Android (Samsung Galaxy S7).
لم يتم إطلاق أي من أحداث onOpened أو onReceived ، ومع ذلك ، يتم تلقي الإخطار. نحتاج إلى أن نكون قادرين على توجيه المستخدم إلى شاشة معينة عند إطلاق الحدث onOpened.
هل يعاني أي شخص من مشكلة في الأحداث (المستلمة ، المفتوحة) التي لم يتم إطلاقها بعد إعادة التحميل ، رد فعل تطبيق android الأصلي عن طريق الضغط مرتين على R ، أو باستخدام حزمة رد فعل - أصلي - إعادة تشغيل.
ackosumane أنا في الواقع أستخدم Expo و Updates.reload()
في كثير من الأحيان في سير عمل التطوير الخاص بي.
وأنت على حق:
@ Nightsd01 لذا يبدو أن تكامل OneSignal RN Android لا يدعم حاليًا إعادة تحميل التطبيق جيدًا. إنه ليس مؤثرًا كما كنت أعتقد أنه في معظم الأوقات لن يقوم المستخدم بإعادة تحميل التطبيق ، ولكن هناك حالات إنتاج نريد من المستخدم فيها إعادة تحميل التطبيق (تحديثات OverTheAir مثل Expo / CodePush ، أو تسجيل خروج المستخدم؟). في مثل هذه الحالات ، سيكون من الرائع عدم كسر الدفعات بعد إعادة التحميل ؛)
@ Nightsd01 مرحبا ، أي تحديثات؟
مرحبًا بكم ، أنا أيضًا أواجه نفس المشكلة ، أي حلول لهذا ؟؟؟
كتحديث لهذه المشكلة: نخطط لإصلاح هذا في التحديث القادم!
@ Nightsd01 أي تاريخ؟ هل يوجد فرع يمكننا تفرع منه مع الإصلاح؟
sofianegargouri ها هي العلاقات العامة: https://github.com/geektimecoil/react-native-onesignal/pull/592
سنصدر تحديثًا إما غدًا أو بعد غد.
شكرًا @ Nightsd01 ، يمكن إغلاق هذه المشكلة على ما أعتقد
هل يمكنك نشر إصدار npm جديد مع الإصلاح من فضلك؟
بالنسبة لأي شخص عالق في هذه المشكلة ، يعمل الكود من السيد بشكل جيد الآن.
فقط قم بتشغيل ما يلي:
npm تثبيت git + https://github.com/geektimecoil/react-native-onesignal#master - حفظ
@ eabuslaiman30 لا تزال تواجه مشكلة. أنا أستخدم git + https://github.com/geektimecoil/react-native-onesignal#master كما ذكرت أعلاه. لم يتم تشغيل أي من الأحداث في android. يمكن لأي شخص أن يقترح أي إصدار مستقر؟ في السابق كنت أستخدم الإصدار 3.0.5 الذي كان يعمل بشكل جيد باستثناء توقف التطبيق ولم يتم تلقي الإخطار في نظام أندرويد 8.0 (أوريو). لإصلاح هذه المشكلة ، أقوم بالتحديث إلى أحدث إصدار وأتلقى هذا الخطأ.
@ eabuslaiman30 @ Nightsd01 حاولت أيضًا ومثل shahchaitanya ما زلت أواجه المشكلة.
لقد قمت بعمل علاقات عامة يبدو أنها تصلح المستمعين الذين لم يشتركوا مرة أخرى: https://github.com/geektimecoil/react-native-onesignal/pull/593
shahchaitanya يمكنك تحرير كود Java الخاص بالمشروع المحلي بهذا التغيير الصغير وهذا من شأنه أن يحل مشكلتك مؤقتًا.
مرحبًا slorber ، أطلق الحل الخاص بك على طريقة الفتح والتلقي. لكن حدث onIds لم يتم تشغيله بعد؟ هل تحققت من تشغيل حدث onIds أم لا في التعليمات البرمجية الخاصة بك؟ كنت أفكر في التمسك بالإصدار 3.0.5 من إشارات النرد الأصلية حتى يصبح الإصدار الأخير مستقرًا.
لقد اختبرت للتو وتم إطلاق جميع عمليات الاسترجاعات الثلاثة عند إعادة تشغيل التطبيق بالنسبة لي ، بدءًا من onIds.
حتى إذا لم يتم إطلاق onIds ، فلن يكون الأمر كبيرًا بالنسبة لي حيث من غير المرجح أن تتغير المعرفات عبر إعادة التشغيل وقد تم إرسالها بالفعل إلى الواجهة الخلفية الخاصة بي.
slorber بالنسبة لي ، يعد الأمر مهمًا إذا لم يتم تشغيل onIds عند إعادة تشغيل أحد التطبيقات. أقوم بتخزين idToken في التخزين المحلي والخلفية أيضًا. عند تسجيل الخروج ، قمت بإزالته من الخلفية وبطريقة ما إذا قام المستخدم بمسح التخزين المحلي ، فكيف يمكنني الحصول على معرف المستخدم إذا لم يتم تشغيل onIds في كل مرة. في الإصدار السابق حتى 3.2.0 (تحديث رئيسي) ، يتم تشغيل onIds في كل مرة أثناء إعادة تشغيل التطبيق.
يا شباب slorber shahchaitanya. اسمح لي بنسخ بعض كود التنفيذ الخاص بي ، ربما سيساعدك (كنت بحاجة إلى إضافة بعض سطور التعليمات البرمجية التي لم تكن مطلوبة في إصدار سابق).
OneSignal.init('YOUR_APP_ID');
OneSignal.addEventListener('ids', this.onIds);
OneSignal.configure();
على سبيل المثال ، لم أكن أستخدم وظيفة "init" في الإصدارات السابقة حيث يبدو أن التهيئة كانت تتم من كود Java.
أيضًا ، أنا أستخدم npm install git+https://github.com/geektimecoil/react-native-onesignal\#master --save
كتبعية وأتلقى ثلاثة أحداث بشكل صحيح (onIds ، المستلمة ، المفتوحة).
أنا أستخدم أيضًا init والتهيئة وأتذكر أنه كانت هناك مشكلة في عدم إطلاق المعرفات عند عدم استدعاء التكوين
OneSignal.init(OneSignalAppId, OneSignalSettings);
OneSignal.addEventListener('received', onReceived);
OneSignal.addEventListener('opened', onOpened);
OneSignal.addEventListener('ids', onIds);
// Quickfix for ids event not firing!
// See https://github.com/geektimecoil/react-native-onesignal/issues/200#issuecomment-288579373
OneSignal.configure();
OneSignal.inFocusDisplaying(inFocusDisplaying);
OneSignal.setSubscription(true);
OneSignal.syncHashedEmail(email);
OneSignal.sendTags(tags);
slorber @ eabuslaiman30 الآن تعمل بشكل جيد. فاتني إضافة OneSignal.configure (). في السابق لم أكن بحاجة إليه لتشغيل مستمع onIds. مرحبًا slorber الآن لست بحاجة إلى إضافة هذا التصحيح الذي ذكرته أعلاه. حل @ eabuslaiman30 يعمل بشكل جيد.
shahchaitanya رائع ، أنا سعيد لأنه نجح!
سنخرج بإصدار رسمي قريبًا بما في ذلك هذا الإصلاح.
لقد أصلحت مؤخرًا مشكلة مهمة إلى حد ما في Android SDK ، لذلك أنا في انتظار مراجعة هذه العلاقات العامة قبل إصدار تحديث رسمي أصلي.
شكرا لسعة صدرك الجميع! في هذه الأثناء يمكنك ببساطة استخدام المعلم
shahchaitanya الحدث ids
يهدف ببساطة إلى إطلاق النار عندما يكون معرّف المستخدم أو رمز الدفع مع تغيير OneSignal. إذا لم يتغيروا منذ آخر مرة استخدموا فيها تطبيقك ، فلن يتم إطلاق الأحداث افتراضيًا.
هذا رمز قديم محير ، وأعتزم إعادة تشكيله في الإصدار الرئيسي التالي ليكون أكثر سهولة.
يمكنك إجبارهم على إطلاق النار عن طريق الاتصال بـ configure()
، لكنني لا أوصي بذلك. الحل الأكثر أناقة هو استدعاء OneSignal.getPermissionSubscriptionState()
والذي سيحتوي على معرف OneSignal الخاص بالمستخدم
يجب الآن إصلاح المشكلة في 3.2.6 (مع العديد من الأشياء الأخرى). شكرا لسعة صدرك الجميع!
مرحبا! ما زلت أتلقى هذه المشكلة على Android (لم يتم فحص نظام iOS بالكامل).
أنا في الإصدار 3.2.6 وإعداد مستمع الحدث الخاص بي هو ...
componentDidMount() {
OneSignal.init(APP_ID, { kOSSettingsKeyAutoPrompt: true });
OneSignal.addEventListener('ids', this.onIds);
OneSignal.addEventListener('opened', (result) => alert('text'));
OneSignal.inFocusDisplaying(2);
// OneSignal.setLogLevel(0, 6);
OneSignal.configure();
}
componentWillUnmount() {
OneSignal.removeEventListener('ids', this.onIds);
OneSignal.removeEventListener('opened', (result) => alert('text'));
}
joefazz لا يمكنني إعادة إظهار مشكلتك ، هل يمكنك محاولة تشغيل yarn remove react-native onesignal
و yarn add react-native-onesignal
فقط للتأكد من تحديثه إلى 3.2.6؟ إذا كان الأمر كذلك ، فسأعيد فتح المشكلة.
هل تحدث المشكلة لك بنسبة 100٪؟
هل أنت قادر على إعادة إنتاج هذه المشكلة في مشروعنا التجريبي؟
يحدث 100٪ من الوقت ولا يزال يحدث بعد الإزالة والقراءة.
سأحاول إعادة الإنتاج في وقت لاحق اليوم وسأقوم بتحرير هذا التعليق مع النتائج التي توصلت إليها.
لا أعرف مدى ملاءمتها ولكن في المشروع الذي أعمل عليه كنا على الإصدار 3.0.9 وقمنا بالترقية حتى 3.2.6. قمت بتشغيل إلغاء ارتباط التفاعل الأصلي ثم قمت بإعادة ربط نظام iOS وترقيته يدويًا وإزالة جميع عمليات التهيئة الأصلية لاستخدام طريقة OneSignal.init ().
تحرير: لست متأكدًا مما حدث ولكنه يعمل بنسبة 100٪ على Android الآن ، شكرًا على مساعدتك آسف للتعليق على مشكلة مغلقة 😅
إذا رأى أي شخص هذه المشكلة مرة أخرى في الإصدار 3.2.6 أو أعلى ، فلا تتردد في فتح إصدار جديد.
joefazz سعيد لسماع ذلك! لقد أصلحت المشكلة التي تسببت في المشكلة الأولية ، لكن من المحتمل تمامًا أن يكون هناك نوع من حالة السباق مستمرة. إذا رأيت هذه المشكلة مرة أخرى ، فلا تتردد في فتح إصدار جديد
في تطبيقي ، يعمل الإصدار الجديد على إصلاح مشكلاتي ولا أرى السلوك الذي تم الإبلاغ عنه بواسطة joefazz
مرحبًا بالجميع ، لدي نفس المشكلة لم يتم إطلاق OneSignal.addEventListener('opened', (result) => console.log(result));
من الإطلاق الثاني للتطبيق. في وضع الخلفية ، أول إشعار يتم فيه فتح حدث "فتح" ، قم بإغلاق التطبيق => الحصول على إشعار => لن يتم إطلاق "الفتح" مرة أخرى.
فقط android - 8 verison
فقط بعد الإشعار الثاني عندما يكون التطبيق في الخلفية
رد فعل - أصلية - إشارة واحدة - 3.9.1
أواجه نفس المشكلة. لن يتم فتح الاتصال عندما يكون التطبيق في الخلفية هل هناك أي إصلاح
@ kostiantyn-solianyk shrolr ،
للتلخيص ، لا يتم تشغيل حدث "الفتح" في المرة الثانية التي يتم فيها فتح التطبيق في Android 8.
يتم إهمال الأحداث التقليدية في الإصدار الرئيسي القادم (الآن في بيتا). أوصي بالترحيل إلى الإصدار التجريبي ومحاولة إعادة إظهار المشكلة.
إذا استمرت المشكلة ، فيرجى إخبارنا بفتح مشكلة جديدة.
هتافات
التعليق الأكثر فائدة
sofianegargouri ها هي العلاقات العامة: https://github.com/geektimecoil/react-native-onesignal/pull/592
سنصدر تحديثًا إما غدًا أو بعد غد.