La description:
Salut tout le monde. J'ai des problèmes avec les événements onOpened/onReceived sur Android. Le comportement est différent sur l'émulateur et sur un appareil réel, mais le message push exact est délivré dans les deux cas.
Sur émulateur :
Sur un appareil réel :
Environnement
Étapes pour reproduire le problème :
Impossible de fournir des étapes à reproduire en raison de la politique de confidentialité de mon entreprise.
Rien d'autre:
android/build.gradle
```// Fichier de construction de niveau supérieur où vous pouvez ajouter des options de configuration communes à tous les sous-projets/modules.
script de construction {
dépôts {
jcenter()
Google()
}
dépendances {
chemin de classe 'com.android.tools. build:grade :3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
tous les projets {
dépôts {
maven { url " https://jitpack.io " } // utilisé pour MPAndroidChart
mavenLocal()
Google()
jcenter()
maven {
// Tout React Native (JS, sources Obj-C, binaires Android) est installé à partir de npm
url "$rootDir/../node_modules/react-native/android"
}
}
}
`android/app/build.gradle`
appliquer le plugin : 'com.onesignal.androidsdk.onesignal-gradle-plugin'
plugin d'application : "com.android.application"
importer com.android.build.OutputFile
script de construction {
dépôts {
maven { url ' https://plugins.gradle.org/m2/ ' } // Portail de plugin Gradle
}
dépendances {
chemin de classe 'gradle.plugin.com. onesignal:onesignal-gradle-plugin :[0.10.0, 0.99.99]'
}
}
appliquer le plugin : 'com.onesignal.androidsdk.onesignal-gradle-plugin'
/**
react-native bundle
avec les bons arguments lors de la construction d'Androidapply from: "../../node_modules/react-native/react.gradle"
.projet.ext.react = [
cliPath : "node_modules/haul/bin/cli.js"
]
appliquer depuis : "../../node_modules/react-native/react.gradle"
/**
/**
Android {
compileSdkVersion 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
}
}
}
}
dépendances {
compiler (projet(':react-native-onesignal')){
groupe d'exclusion : "com.google.android.gms"
}
compiler ("com.google.android.gms:play-services-base:12.0.1") {
forcer = vrai ;
}
compiler le projet(':react-native-sound')
compiler le projet(':react-native-audio')
compiler le projet(':react-native-fetch-blob')
compiler le projet(':react-native-fs')
compiler le projet(':react-native-geocoder')
compiler le projet(':react-native-image-crop-picker')
compiler le projet(':react-native-version-check')
compiler le projet(':react-native-charts-wrapper')
compiler le projet(':react-native-spinkit')
compiler le projet(':react-native-svg')
compiler le projet(':react-native-maps')
compiler fileTree(dir : "libs", inclure : ["*.jar"])
compiler "com.android.support:appcompat-v7 : 23.0.1 "
compile "com.facebook.react :react-native :+" // Depuis node_modules
}
// Exécutez ceci une fois pour pouvoir exécuter l'application avec BUCK
// met toutes les dépendances de compilation dans le dossier libs pour que BUCK les utilise
tâche copyDownloadableDepsToLibs(type : Copy) {
depuis configurations.compile
dans 'libs'
}
`android/app/src/main/java/com/binomysteryshopper/MainApplication.java`
package com.binomysteryshopper ;
importer android.app.Application ;
importer com.facebook.react.ReactApplication ;
importer com.geektime.rnosignalandroid.ReactNativeOneSignalPackage ;
importer com.zmxv.RNSound.RNSoundPackage ;
importer com.rnim.rn.audio.ReactNativeAudioPackage ;
import com.RNFetchBlob.RNFetchBlobPackage ;
import com.rnfs.RNFSPackage ;
importer com.reactnative.ivpusic.imagepicker.PickerPackage ;
importer io.xogus.reactnative.versioncheck.RNVersionCheckPackage ;
importer com.github.wuxudong.rncharts.MPAndroidChartPackage ;
importer com.react.rnspinkit.RNSpinkitPackage ;
importer com.horcrux.svg.SvgPackage ;
importer com.facebook.react.ReactNativeHost ;
importer com.facebook.react.ReactPackage ;
importer com.facebook.react.shell.MainReactPackage ;
import com.devfd.RNGeocoder.RNGeocoderPackage ;
importer com.facebook.soloader.SoLoader ;
importer com.airbnb.android.react.maps.MapsPackage ;
importer java.util.Arrays ;
importer java.util.List ;
la classe publique MainApplication étend l'application implémente ReactApplication {
privé final ReactNativeHost mReactNativeHost = nouveau ReactNativeHost(this) {
@Passer outre
public booléen getUseDeveloperSupport() {
renvoie 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";
}
} ;
@Passer outre
public ReactNativeHost getReactNativeHost() {
retourner mReactNativeHost ;
}
@Passer outre
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* exopackage natif */ false);
}
}
`AndroidManifest.xml`
Android :targetSdkVersion="22" />
android:allowBackup="true"
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`
composantWillMount() {
OneSignal.init(ONESIGNAL_APP_ID, {
kOSSettingsKeyAutoPrompt : vrai,
kOSSettingsKeyInAppLaunchURL : faux,
kOSSSettingsKeyPromptBeforeOpeningPushURL : vrai,
})
Affichage OneSignal.inFocus(2)
OneSignal.addEventListener('received', this.onPushNotificationReceived)
OneSignal.addEventListener('opened', this.onPushNotificationOpened)
}
componentWillUnmount() {
OneSignal.removeEventListener('reçu', this.onPushNotificationReceived)
OneSignal.removeEventListener('ouvert', this.onPushNotificationOpened)
}
onPushNotificationReceived(notification) {
Alert.alert('onReceived') // pour les tests sur un appareil réel
}
onPushNotificationOpened(openResult) {
Alert.alert('onOpened') // pour les tests sur un appareil réel
}
```
Sur IOS ça marche parfaitement. Malheureusement, je ne peux pas fournir de journaux d'Android Logcat, car je n'ai pas de véritable appareil. Je testais sur l'appareil de mon ami lointain grâce à TeamViewer.
J'ai aussi essayé de OneSignal.setLogLevel(0, 6)
sur un vrai appareil. Mais aucune erreur n'a été trouvée, toutes les requêtes ont réussi, seuls les événements n'ont pas été déclenchés.
Salut @Ble3k , nous avons été très occupés à travailler sur un nouveau SDK Flutter récemment et nous n'avons pas encore eu le temps d'enquêter sur votre problème, mais j'enquêterai demain et je vous répondrai sous peu, excusez-moi pour le retard !
Salut,
Je voulais juste dire que je vois le même comportement sur 3.2.5 sur un appareil de développement. Bizarre parce que je n'ai rien changé récemment et je suis presque sûr que cela a fonctionné il y a quelques jours, car mes poussées ciblées sont affichées sous forme de toasts intégrés à l'application. Je me souviens les avoir testés et cela fonctionnait.
Je n'enquêterai pas plus loin car nous avons décidé de passer aux notifications push normales même lorsque l'application est ciblée
@ Nightsd01 Thx, attendra votre enquête.
Sur Android confronté à un retard dans la réception des notifications, testé sur mon téléphone Android et reçu une notification après 30 à 40 minutes, testé plusieurs fois
Une mise à jour pour ceci? J'ai le même problème sur un appareil Android (Samsung Galaxy S7).
Aucun des événements onOpened ou onReceived n'est déclenché, cependant, la notification est en cours de réception. Nous devons pouvoir diriger l'utilisateur vers un écran spécifique lorsque l'événement onOpened est déclenché.
Quelqu'un a-t-il un problème avec les événements (reçus, ouverts) qui ne sont pas déclenchés après le rechargement de l'application Android native de réaction en appuyant deux fois sur R ou en utilisant le package react-native-restart.
@ackosumane J'utilise en fait Expo et Updates.reload()
très souvent dans mon workflow de développement.
Et tu as raison :
@ Nightsd01 Il semble donc que l'intégration Android OneSignal RN ne supporte actuellement pas très bien les rechargements d'applications. Ce n'est pas aussi percutant que je le pensais car la plupart du temps, l'utilisateur ne rechargera pas l'application, mais il existe des cas de production dans lesquels nous voulons que l'utilisateur recharge l'application (mises à jour OverTheAir comme Expo/CodePush, ou déconnexion de l'utilisateur ?). Dans de tels cas, ce serait formidable qu'après un rechargement, les poussées ne soient pas cassées ;)
@Nightsd01 Salut, des mises à jour ?
Bonjour, je suis également confronté au même problème. Des solutions pour cela ???
En tant que mise à jour sur ce problème : nous prévoyons de résoudre ce problème dans la prochaine mise à jour !
@Nightsd01 Une date ? Y a-t-il une branche que nous pouvons bifurquer avec le correctif ?
@sofianegargouri Voici le PR : https://github.com/geektimecoil/react-native-onesignal/pull/592
Nous publierons une mise à jour demain ou après-demain.
merci @ Nightsd01 , ce problème peut être fermé je suppose
pouvez-vous publier une nouvelle version de npm avec le correctif, s'il vous plaît ?
Pour tous ceux qui sont bloqués avec ce problème, le code de master fonctionne bien maintenant.
Exécutez simplement ce qui suit :
npm installer git + https://github.com/geektimecoil/react-native-onesignal#master --save
@ eabuslaiman30 Toujours confronté à un problème. J'utilise git+ https://github.com/geektimecoil/react-native-onesignal#master comme vous l'avez mentionné ci-dessus. Toujours aucun des événements n'est déclenché dans Android. Quelqu'un peut-il suggérer quelle dernière version est stable ? Auparavant, j'utilisais la version 3.0.5 qui fonctionnait bien, sauf que l'application est tuée et que la notification n'est pas reçue dans Android 8.0 (Oreo). Pour résoudre ce problème, je mets à jour la dernière version et j'obtiens cette erreur.
@ eabuslaiman30 @ Nightsd01 J'ai aussi essayé et comme @shahchaitanya, je suis toujours confronté au problème.
J'ai fait un PR qui semble réparer les auditeurs qui ne s'abonnent plus : https://github.com/geektimecoil/react-native-onesignal/pull/593
@shahchaitanya , vous pouvez modifier le code Java du projet local avec ce petit changement et cela devrait résoudre temporairement votre problème.
Hey @slorber Votre solution déclenche les méthodes onOpened et onReceived. Mais l'événement onIds n'est pas encore déclenché ? Avez-vous vérifié que l'événement onIds est déclenché ou non dans votre code ? Je pensais rester fidèle à la version 3.0.5 de react-native-onesignal jusqu'à ce que la dernière version devienne stable.
Je viens de tester et les 3 rappels se déclenchent au redémarrage de l'application pour moi, en commençant par onIds.
Même si onIds ne se déclenche pas, ce ne serait pas un gros problème pour moi, car il est peu probable que les identifiants changent lors des redémarrages et ils ont déjà été envoyés à mon backend.
@slorber Pour moi, c'est un gros problème si onIds ne s'est pas déclenché lors du redémarrage d'une application. Je stocke idToken dans le stockage local et le backend également. Lors de la déconnexion, je l'ai supprimé du backend et, d'une manière ou d'une autre, si l'utilisateur efface le stockage local, comment puis-je obtenir l'idToken d'un utilisateur si onIds ne s'est pas déclenché à chaque fois. Dans la version précédente jusqu'à 3.2.0 (mise à jour majeure), onIds est déclenché à chaque fois lors du redémarrage d'une application.
Salut les gars @slorber @shahchaitanya. Permettez-moi de copier une partie de mon code d'implémentation, cela vous aidera peut-être (j'avais besoin d'ajouter quelques lignes de code qui n'étaient pas nécessaires avec une version précédente).
OneSignal.init('YOUR_APP_ID');
OneSignal.addEventListener('ids', this.onIds);
OneSignal.configure();
Par exemple, je n'utilisais pas la fonction "init" dans les versions précédentes car l'initialisation se faisait apparemment à partir du code Java.
De plus, j'utilise npm install git+https://github.com/geektimecoil/react-native-onesignal\#master --save
comme dépendance et je reçois correctement trois événements (onIds, reçu, ouvert).
J'utilise également init et configure et je me souviens qu'il y avait un problème avec les identifiants qui ne se déclenchaient pas lorsque je n'appelais pas 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 Maintenant ça marche bien. J'ai manqué d'ajouter OneSignal.configure(). Auparavant, je n'en avais pas besoin pour déclencher l'écouteur onIds. Hey @slorber maintenant je n'ai pas besoin d'ajouter ce patch que vous avez mentionné ci-dessus. La solution @ eabuslaiman30 fonctionne parfaitement.
Parfait @shahchaitanya , je suis content que ça ait fonctionné !
Nous publierons bientôt une version officielle incluant ce correctif.
J'ai récemment corrigé un problème quelque peu important avec le SDK Android, j'attends donc que ce PR soit examiné avant de publier une mise à jour officielle réactive.
Merci à tous pour votre patience! En attendant, vous pouvez simplement utiliser master
@shahchaitanya l'événement ids
est destiné à se déclencher simplement chaque fois que l'ID de l'utilisateur ou le jeton push avec OneSignal change. S'ils n'ont pas changé depuis la dernière fois qu'ils ont utilisé votre application, les événements ne se déclencheront pas par défaut.
C'est un code hérité déroutant, j'ai l'intention de le refactoriser dans la prochaine version majeure pour qu'il soit beaucoup plus intuitif.
Vous pouvez les forcer à tirer en appelant configure()
, mais je ne le recommanderais pas. Une solution plus élégante consiste à appeler OneSignal.getPermissionSubscriptionState()
qui contiendra l'identifiant OneSignal de l'utilisateur
Le problème devrait maintenant être résolu dans 3.2.6 (ainsi que plusieurs autres choses). Merci à tous pour votre patience!
Salut! J'ai toujours ce problème sur Android (iOS non entièrement vérifié).
Je suis sur la version 3.2.6 et la configuration de mon écouteur d'événements est ...
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 Je ne suis pas en mesure de reproduire votre problème, pouvez-vous essayer d'exécuter yarn remove react-native onesignal
et yarn add react-native-onesignal
juste pour vous assurer qu'il est mis à jour vers 3.2.6 ? Si c'est le cas, je rouvrirai le sujet.
Le problème se produit-il 100 % du temps pour vous ?
Pouvez-vous reproduire ce problème dans notre projet de démonstration ?
Cela se produit 100% du temps et se produit toujours après la suppression et la lecture.
Je vais essayer de reproduire un peu plus tard dans la journée et j'éditerai ce commentaire avec mes conclusions.
Je ne sais pas à quel point c'est pertinent, mais dans le projet sur lequel je travaille, nous étions sur la version 3.0.9 et mis à niveau jusqu'à la 3.2.6. J'ai exécuté un lien réactif natif, puis reconnecté, mis à jour iOS manuellement et supprimé toute l'initialisation native pour utiliser la méthode OneSignal.init().
EDIT : Je ne sais pas ce qui s'est passé, mais cela fonctionne à 100 % du temps sur Android maintenant, merci pour votre aide, désolé de commenter un problème clos 😅
Si quelqu'un voit à nouveau ce problème dans la version 3.2.6 ou supérieure, n'hésitez pas à ouvrir un nouveau problème.
@joefazz Heureux de l'entendre! J'ai résolu le problème à l'origine du problème initial, mais il est tout à fait possible qu'il y ait une sorte de condition de concurrence. Si vous voyez à nouveau ce problème, n'hésitez pas à ouvrir un nouveau sujet
Dans mon application, la nouvelle version corrige mes problèmes et je ne vois pas le comportement signalé par @joefazz
Salut à tous, j'ai le même problème OneSignal.addEventListener('opened', (result) => console.log(result));
n'est pas déclenché à partir du deuxième lancement de l'application. En mode arrière -plan, la première notification reçoit l'événement 'opened', tuez l'application => get notification => 'opened' ne se déclenchera plus jamais.
seulement android - version 8
seulement après la deuxième notification lorsque l'application était en arrière-plan
réagir-natif-unsignal - 3.9.1
J'ai le même problème. ouvert n'appellera pas lorsque l'application est en arrière-plan, y a-t-il un correctif
@kostiantyn-solianyk @shrolr ,
Donc, pour résumer, l'événement 'opened' ne se déclenche pas la deuxième fois que l'application est ouverte dans Android 8.
Les événements traditionnels sont obsolètes dans la prochaine version majeure (maintenant en version bêta). Je recommande de migrer vers la version bêta et d'essayer de reproduire le problème.
Si le problème persiste, merci de nous le signaler en ouvrant un nouveau numéro.
Acclamations
Commentaire le plus utile
@sofianegargouri Voici le PR : https://github.com/geektimecoil/react-native-onesignal/pull/592
Nous publierons une mise à jour demain ou après-demain.