Keterangan:
Hai semuanya. Saya mengalami masalah dengan acara onOpened/onReceived di Android. Perilaku berbeda pada emulator dan perangkat nyata, tetapi pesan push yang tepat dikirimkan dalam kedua kasus.
Pada emulator:
Pada perangkat nyata:
Lingkungan
Langkah-langkah untuk Mereproduksi Masalah:
Tidak dapat memberikan langkah-langkah untuk mereproduksi karena kebijakan kerahasiaan perusahaan saya.
Ada yang lain:
android/build.gradle
```// File build tingkat atas tempat Anda dapat menambahkan opsi konfigurasi yang umum untuk semua sub-proyek/modul.
skrip bangunan {
tempat penyimpanan {
jcenter()
google()
}
dependensi {
classpath 'com.android.tools. build:gradle :3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
semua proyek {
tempat penyimpanan {
maven { url " https://jitpack.io " } // digunakan untuk MPAndroidChart
mavenLokal()
google()
jcenter()
ahli {
// Semua React Native (JS, sumber Obj-C, binari Android) diinstal dari npm
url "$rootDir/../node_modules/react-native/android"
}
}
}
`android/app/build.gradle`
terapkan plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
terapkan plugin: "com.android.application"
impor com.android.build.OutputFile
skrip bangunan {
tempat penyimpanan {
maven { url ' https://plugins.gradle.org/m2/ ' } // Portal Plugin Gradle
}
dependensi {
classpath 'gradle.plugin.com. onesignal: onesignal-gradle-plugin :[0.10.0, 0.99.99]'
}
}
terapkan plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
/**
react-native bundle
dengan argumen yang benar selama Android buildapply from: "../../node_modules/react-native/react.gradle"
baris.proyek.ext.react = [
cliPath: "node_modules/haul/bin/cli.js"
]
terapkan dari: "../../node_modules/react-native/react.gradle"
/**
/**
android {
kompilasiSdkVersion 27
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
}
}
}
}
dependensi {
kompilasi (proyek(':react-native-onesignal')){
mengecualikan grup: "com.google.android.gms"
}
kompilasi ("com.google.android.gms:play-services-base:12.0.1") {
kekuatan = benar;
}
kompilasi proyek(':react-native-sound')
kompilasi proyek(':react-native-audio')
kompilasi proyek(':react-native-fetch-blob')
kompilasi proyek(':react-native-fs')
kompilasi proyek(':react-native-geocoder')
kompilasi proyek(':react-native-image-crop-picker')
kompilasi proyek(':react-native-version-check')
kompilasi proyek(':react-native-charts-wrapper')
kompilasi proyek(':react-native-spinkit')
kompilasi proyek(':react-native-svg')
kompilasi proyek(':react-native-maps')
kompilasi fileTree(dir: "libs", sertakan: ["*.jar"])
kompilasi "com.android.support:appcompat-v7 : 23.0.1 "
kompilasi "com.facebook. react:react-native :+" // Dari node_modules
}
// Jalankan ini sekali untuk dapat menjalankan aplikasi dengan BUCK
// menempatkan semua dependensi kompilasi ke dalam folder libs untuk digunakan BUCK
tugas copyDownloadableDepsToLibs(ketik: Salin) {
dari configurations.compile
ke dalam 'libs'
}
`android/app/src/main/java/com/binomysteryshopper/MainApplication.java`
paket com.binomysteryshopper;
impor android.app.Application;
impor com.facebook.react.ReactApplication;
impor com.geektime.rnonesignalandroid.ReactNativeOneSignalPackage;
impor com.zmxv.RNSound.RNSoundPackage;
impor com.rnim.rn.audio.ReactNativeAudioPackage;
impor com.RNFetchBlob.RNFetchBlobPackage;
impor com.rnfs.RNFSPackage;
impor com.reactnative.ivpusic.imagepicker.PickerPackage;
impor io.xogus.reactnative.versioncheck.RNVersionCheckPackage;
impor com.github.wuxudong.rncharts.MPAndroidChartPackage;
impor com.react.rnspinkit.RNSpinkitPackage;
impor com.horcrux.svg.SvgPackage;
impor com.facebook.react.ReactNativeHost;
impor com.facebook.react.ReactPackage;
impor com.facebook.react.shell.MainReactPackage;
impor com.devfd.RNGeocoder.RNGeocoderPackage;
impor com.facebook.soloader.SoLoader;
impor com.airbnb.android.react.maps.MapsPackage;
impor java.util.Arrays;
impor java.util.List;
MainApplication kelas publik meluas Aplikasi mengimplementasikan ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(ini) {
@Mengesampingkan
getUseDeveloperSupport () boolean publik {
kembalikan 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";
}
};
@Mengesampingkan
publik ReactNativeHost getReactNativeHost() {
kembalikan mReactNativeHost;
}
@Mengesampingkan
public void onCreate() {
super.onBuat();
SoLoader.init(ini, /* exopackage asli */ false);
}
}
`AndroidManifest.xml`
android:targetSdkVersion="22" />
android:allowBackup="benar"
android:label="@string/nama_aplikasi"
android:icon="@mipmap/ic_launcher"
android:largeHeap="benar"
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`
komponenWillMount() {
OneSignal.init(ONESIGNAL_APP_ID, {
kOSSettingsKeyAutoPrompt: benar,
kOSSettingsKeyInAppLaunchURL: salah,
kOSSSettingsKeyPromptBeforeOpeningPushURL: benar,
})
OneSignal.inFocusDisplaying(2)
OneSignal.addEventListener('received', this.onPushNotificationReceived)
OneSignal.addEventListener('opened', this.onPushNotificationOpened)
}
componentWillUnmount() {
OneSignal.removeEventListener('diterima', this.onPushNotificationReceived)
OneSignal.removeEventListener('dibuka', this.onPushNotificationOpened)
}
onPushNotificationReceived(pemberitahuan) {
Alert.alert('onReceived') // untuk pengujian pada perangkat nyata
}
onPushNotificationOpened(openResult) {
Alert.alert('onOpened') // untuk pengujian pada perangkat nyata
}
```
Di IOS itu bekerja dengan sempurna. Sayangnya saya tidak dapat memberikan log dari logcat android, karena saya tidak memiliki perangkat yang sebenarnya. Saya sedang menguji di perangkat teman saya yang jauh karena TeamViewer.
Saya juga mencoba OneSignal.setLogLevel(0, 6)
pada perangkat nyata. Tetapi tidak ada kesalahan yang ditemukan, semua permintaan berhasil, hanya acara yang tidak diaktifkan.
Hai @Ble3k , kami cukup sibuk mengerjakan Flutter SDK baru-baru ini dan belum sempat menyelidiki masalah Anda, namun saya akan menyelidikinya besok dan akan segera menghubungi Anda kembali, mohon maaf atas keterlambatannya!
Hai,
Hanya ingin mengatakan saya melihat perilaku yang sama pada 3.2.5 pada perangkat dev. Aneh karena saya belum mengubah apa pun baru-baru ini dan saya cukup yakin itu berhasil beberapa hari yang lalu, karena dorongan terfokus saya ditampilkan sebagai roti panggang dalam aplikasi, saya ingat telah menguji ini dan itu berhasil.
Saya tidak akan menyelidiki lebih lanjut karena kami memutuskan untuk beralih ke pemberitahuan push normal bahkan ketika aplikasi difokuskan
@Nightsd01 Thx, akan menunggu penyelidikan Anda.
Di Android menghadapi keterlambatan dalam menerima notifikasi, diuji di ponsel Android saya dan menerima notifikasi setelah 30-40 menit, beberapa kali diuji
Ada pembaruan tentang ini? Saya mengalami masalah yang sama pada perangkat Android (Samsung Galaxy S7).
Tak satu pun dari acara onOpened atau onReceived yang diaktifkan, namun, notifikasi sedang diterima. Kita harus dapat menavigasi pengguna ke layar tertentu saat event onOpened diaktifkan.
Adakah yang punya masalah dengan acara (diterima, dibuka) tidak dipecat setelah memuat ulang aplikasi Android asli reaksi dengan menekan dua kali R, atau menggunakan paket react-native-restart.
@ackosumane Saya benar-benar menggunakan Expo dan Updates.reload()
sangat sering dalam alur kerja dev saya.
Dan Anda benar:
@Nightsd01 Jadi sepertinya integrasi Android OneSignal RN saat ini tidak mendukung pemuatan ulang aplikasi dengan baik. Ini tidak berdampak seperti yang saya kira karena sebagian besar waktu pengguna tidak akan memuat ulang aplikasi, tetapi ada kasus produksi di mana kami ingin pengguna memuat ulang aplikasi (pembaruan OverTheAir seperti Expo/CodePush, atau pengguna logout?). Dalam kasus seperti itu, alangkah baiknya setelah memuat ulang dorongan tidak rusak;)
@Nightsd01 Hai, ada pembaruan?
Halo, saya juga menghadapi masalah yang sama. Adakah solusi untuk ini ???
Sebagai pembaruan tentang masalah ini: kami berencana untuk memperbaikinya di pembaruan berikutnya!
@Nightsd01 Setiap tanggal? Apakah ada cabang yang bisa kami perbaiki?
@sofianegargouri Ini PRnya: https://github.com/geektimecoil/react-native-onesignal/pull/592
Kami akan merilis pembaruan besok atau lusa.
terima kasih @Nightsd01 , masalah ini bisa ditutup saya kira
bisakah Anda mempublikasikan rilis npm baru dengan perbaikannya?
Bagi siapa saja yang terjebak dengan masalah ini, kode dari master berfungsi dengan baik sekarang.
Jalankan saja yang berikut ini:
npm install git+ https://github.com/geektimecoil/react-native-onesignal#master --save
@eabuslaiman30 Masih menghadapi masalah. Saya menggunakan git+ https://github.com/geektimecoil/react-native-onesignal#master seperti yang Anda sebutkan di atas. Masih tidak ada peristiwa yang dipicu di Android. Adakah yang bisa menyarankan versi terbaru mana yang stabil? Sebelumnya saya menggunakan versi 3.0.5 yang berfungsi dengan baik kecuali aplikasi dimatikan dan pemberitahuan tidak diterima di Android 8.0 (Oreo). Untuk memperbaiki masalah itu saya memperbarui ke versi terbaru dan saya mendapatkan kesalahan ini.
@eabuslaiman30 @Nightsd01 Saya juga mencoba dan menyukai @shahchaitanya saya masih menghadapi masalah.
Saya telah membuat PR yang tampaknya memperbaiki pendengar yang tidak berlangganan lagi: https://github.com/geektimecoil/react-native-onesignal/pull/593
@shahchaitanya Anda dapat mengedit kode Java proyek lokal dengan perubahan kecil ini dan ini akan menyelesaikan masalah Anda untuk sementara.
Hai @slorber Solusi Anda memicu metode onOpened dan onReceived. Tapi event onIds belum terpicu? Apakah Anda memeriksa acara onIds dipicu atau tidak dalam kode Anda? Saya berpikir untuk tetap menggunakan react-native-onesignal versi 3.0.5 hingga versi terbaru menjadi stabil.
Saya baru saja menguji dan semua 3 panggilan balik diaktifkan pada aplikasi restart untuk saya, dimulai dengan onIds.
Bahkan jika onIds tidak menyala, itu tidak akan menjadi masalah besar bagi saya karena id tidak mungkin berubah saat restart dan mereka telah dikirim ke backend saya.
@slorber Bagi saya itu masalah besar jika onIds tidak menyala saat memulai ulang aplikasi. Saya menyimpan idToken di penyimpanan lokal dan juga backend. Saat keluar saya menghapusnya dari backend Dan Entah bagaimana jika pengguna menghapus penyimpanan lokal, lalu bagaimana saya bisa mendapatkan idToken pengguna jika onIds tidak menyala setiap saat. Di versi sebelumnya hingga 3.2.0 (Pembaruan Utama), onIds dipicu setiap kali saat memulai ulang aplikasi.
Hai teman-teman @slorber @shahchaitanya. Biarkan saya menyalin beberapa kode implementasi saya, mungkin itu akan membantu Anda (saya perlu menambahkan beberapa baris kode yang tidak diperlukan dengan versi sebelumnya).
OneSignal.init('YOUR_APP_ID');
OneSignal.addEventListener('ids', this.onIds);
OneSignal.configure();
Misalnya, saya tidak menggunakan fungsi "init" di versi sebelumnya karena inisialisasi tampaknya dilakukan dari kode Java.
Juga, saya menggunakan npm install git+https://github.com/geektimecoil/react-native-onesignal\#master --save
sebagai ketergantungan dan saya menerima tiga acara dengan benar (onIds, diterima, dibuka).
Saya juga menggunakan init dan mengkonfigurasi dan ingat ada masalah dengan id tidak aktif saat tidak memanggil configure
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 Sekarang berfungsi dengan baik. Saya melewatkan untuk menambahkan OneSignal.configure(). Sebelumnya saya tidak membutuhkannya untuk memicu pendengar onIds. Hai @slorber sekarang saya tidak perlu menambahkan tambalan yang Anda sebutkan di atas. @eabuslaiman30 solusi bekerja dengan baik.
Sempurna @shahchaitanya , saya senang itu berhasil!
Kami akan segera merilis rilis resmi termasuk perbaikan ini.
Saya baru-baru ini memperbaiki masalah yang agak signifikan dengan Android SDK, jadi saya menunggu PR itu ditinjau sebelum saya merilis pembaruan asli reaksi resmi.
Terima kasih atas kesabaran Anda semuanya! Sementara itu Anda cukup menggunakan master
@shahchaitanya acara ids
dimaksudkan untuk hanya memecat setiap kali ID pengguna atau token push dengan OneSignal berubah. Jika mereka tidak berubah sejak terakhir kali mereka menggunakan aplikasi Anda, acara tidak akan diaktifkan secara default.
Ini membingungkan kode warisan, saya bermaksud untuk memperbaikinya di rilis besar berikutnya agar jauh lebih intuitif.
Anda dapat memaksa mereka untuk menembak dengan memanggil configure()
, tetapi saya tidak akan merekomendasikannya. Solusi yang lebih elegan adalah dengan memanggil OneSignal.getPermissionSubscriptionState()
yang akan berisi ID OneSignal pengguna
Masalah sekarang harus diperbaiki di 3.2.6 (bersama dengan beberapa hal lainnya). Terima kasih atas kesabaran Anda semuanya!
Hai! Saya masih mendapatkan masalah ini di Android (tidak sepenuhnya memeriksa iOS).
Saya menggunakan rilis 3.2.6 dan penyiapan pendengar acara saya adalah...
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 Saya tidak dapat mereproduksi masalah Anda, dapatkah Anda mencoba menjalankan yarn remove react-native onesignal
dan yarn add react-native-onesignal
hanya untuk memastikan itu diperbarui ke 3.2.6? Jika demikian saya akan membuka kembali masalah ini.
Apakah masalah terjadi 100% untuk Anda?
Apakah Anda dapat mereproduksi masalah ini dalam proyek demo kami?
Itu terjadi 100% dari waktu dan masih terjadi setelah menghapus dan membaca.
Saya akan mencoba mereproduksi nanti hari ini dan saya akan mengedit komentar ini dengan temuan saya.
Saya tidak tahu seberapa relevan itu, tetapi dalam proyek yang saya kerjakan, kami menggunakan versi 3.0.9 dan memutakhirkan sepenuhnya ke 3.2.6. Saya menjalankan react-native unlink dan kemudian menautkan kembali, memutakhirkan iOS secara manual dan menghapus semua inisialisasi asli untuk menggunakan metode OneSignal.init().
EDIT: Tidak yakin apa yang terjadi tetapi ini berfungsi 100% di Android sekarang terima kasih atas bantuan Anda, maaf untuk mengomentari masalah yang ditutup
Jika ada yang melihat masalah ini lagi di 3.2.6 atau lebih tinggi, silakan buka edisi baru.
@joefazz Senang mendengarnya! Saya memperbaiki masalah yang menyebabkan masalah awal tetapi sangat mungkin ada semacam kondisi balapan yang terjadi. Jika Anda melihat masalah ini lagi, silakan buka edisi baru
Di aplikasi saya, versi baru memperbaiki masalah saya dan saya tidak melihat perilaku yang dilaporkan oleh @joefazz
Hai semua, saya memiliki masalah yang sama OneSignal.addEventListener('opened', (result) => console.log(result));
tidak dipecat dari peluncuran aplikasi kedua. Dalam mode latar belakang, pemberitahuan pertama adalah acara 'dibuka', matikan aplikasi => dapatkan pemberitahuan => 'dibuka' tidak akan pernah menyala lagi.
hanya android - versi 8
hanya setelah pemberitahuan kedua saat aplikasi berada di latar belakang
reaksi-asli-onesignal - 3.9.1
Saya mengalami masalah yang sama. dibuka tidak akan menelepon ketika aplikasi berada di latar belakang apakah ada perbaikan?
@kostiantyn-solianyk @shrolr ,
Jadi untuk meringkas, acara 'dibuka' tidak menyala saat kedua kali aplikasi dibuka di Android 8.
Acara tradisi tidak digunakan lagi dalam rilis utama yang akan datang (sekarang dalam versi Beta). Saya sarankan untuk bermigrasi ke versi beta dan mencoba mereproduksi masalah.
Jika masalah berlanjut, beri tahu kami dengan membuka edisi baru.
Bersulang
Komentar yang paling membantu
@sofianegargouri Ini PRnya: https://github.com/geektimecoil/react-native-onesignal/pull/592
Kami akan merilis pembaruan besok atau lusa.