Skip to content
This repository was archived by the owner on Jan 14, 2025. It is now read-only.
This repository was archived by the owner on Jan 14, 2025. It is now read-only.

onNotification not running for a remote notification #2017

Open
@Ruzen1

Description

@Ruzen1

Question

Hey I am trying to get the onNotification to run from a remote notification. However I am not being able to get the onNotification to run. Could you suggest me? I have checked the example but it only contains the localNotification codes right? Can you please guide me to a remote notification example?

React native version : 0.61.3
"react-native-push-notification": "^3.5.2",

Here are my codes.

index.js

import {AppRegistry} from 'react-native'
import App from './src/App'
import {name as appName} from './app.json'
import BackgroundGeolocation from 'react-native-background-geolocation'
import PassingBooksProcessor from './src/services/passingBooksProcessorService'

AppRegistry.registerComponent(appName, () => App)

import PushNotificationIOS from '@react-native-community/push-notification-ios'
import PushNotification from 'react-native-push-notification'

// Must be outside of any component LifeCycle (such as `componentDidMount`).
PushNotification.configure({
   // (optional) Called when Token is generated (iOS and Android)
   onRegister: function(token) {
       console.log('TOKEN:', token)
   },

   // (required) Called when a remote is received or opened, or local notification is opened
   onNotification: function(notification) {
       console.log('NOTIFICATION:', notification)

       // process the notification

       // (required) Called when a remote is received or opened, or local notification is opened
       notification.finish(PushNotificationIOS.FetchResult.NoData)
   },

   // (optional) Called when Registered Action is pressed and invokeApp is false, if true onNotification will be called (Android)
   onAction: function(notification) {
       console.log('ACTION:', notification.action)
       console.log('NOTIFICATION:', notification)

       // process the action
   },

   // (optional) Called when the user fails to register for remote notifications. Typically occurs when APNS is having issues, or the device is a simulator. (iOS)
   onRegistrationError: function(err) {
       console.error(err.message, err)
   },

   // IOS ONLY (optional): default: all - Permissions to register.
   permissions: {
       alert: true,
       badge: true,
       sound: true,
   },

   // Should the initial notification be popped automatically
   // default: true
   popInitialNotification: true,

   /**
    * (optional) default: true
    * - Specified if permissions (ios) and token (android and ios) will requested or not,
    * - if not, you must call PushNotificationsHandler.requestPermissions() later
    * - if you are not using remote notification or do not have Firebase installed, use this:
    *     requestPermissions: Platform.OS === 'ios'
    */
   requestPermissions: true,
})


MainApplication.java

package com.taknal.app.dev;

import android.app.Application;
import android.content.Context;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader;
import co.apptailor.googlesignin.RNGoogleSigninPackage;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import com.reactnativecommunity.netinfo.NetInfoPackage;
import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage;  // <--- Import Package

public class MainApplication extends Application implements ReactApplication {

 private final ReactNativeHost mReactNativeHost =
     new ReactNativeHost(this) {
       @Override
       public boolean getUseDeveloperSupport() {
         return BuildConfig.DEBUG;
       }

       @Override
       protected List<ReactPackage> getPackages() {
         @SuppressWarnings("UnnecessaryLocalVariable")
         List<ReactPackage> packages = new PackageList(this).getPackages();
         // Packages that cannot be autolinked yet can be added manually here, for example:
         packages.add(new BuildConfigPackage());
         packages.add(new ReactNativePushNotificationPackage()) // <---- Add the Package
         // packages.add(new NetInfoPackage());
         return packages;
       }

       @Override
       protected String getJSMainModuleName() {
         return "index";
       }
     };

 @Override
 public ReactNativeHost getReactNativeHost() {
   return mReactNativeHost;
 }

 @Override
 public void onCreate() {
   super.onCreate();
   SoLoader.init(this, /* native exopackage */ false);
   initializeFlipper(this); // Remove this line if you don't want Flipper enabled
 }

 /**
  * Loads Flipper in React Native templates.
  *
  * @param context
  */
 private static void initializeFlipper(Context context) {
   if (BuildConfig.DEBUG) {
     try {
       /*
        We use reflection here to pick up the class that initializes Flipper,
       since Flipper library is not available in release mode
       */
       Class<?> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper");
       aClass.getMethod("initializeFlipper", Context.class).invoke(null, context);
     } catch (ClassNotFoundException e) {
       e.printStackTrace();
     } catch (NoSuchMethodException e) {
       e.printStackTrace();
     } catch (IllegalAccessException e) {
       e.printStackTrace();
     } catch (InvocationTargetException e) {
       e.printStackTrace();
     }
   }
 }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools">

   <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

   <uses-permission android:name="android.permission.WAKE_LOCK" />
   <permission
       android:name="${applicationId}.permission.C2D_MESSAGE"
       android:protectionLevel="signature" />
   <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
   <uses-permission android:name="android.permission.VIBRATE" />
   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

   <application>
       <receiver
           android:name="com.google.android.gms.gcm.GcmReceiver"
           android:exported="true"
           android:permission="com.google.android.c2dm.permission.SEND" >
           <intent-filter>
               <action android:name="com.google.android.c2dm.intent.RECEIVE" />
               <category android:name="${applicationId}" />
           </intent-filter>
       </receiver>
       
       <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
       <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
           <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED" />
           </intent-filter>
       </receiver>
       <service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationRegistrationService"/>
       <service
           android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
           android:exported="false" >
           <intent-filter>
               <action android:name="com.google.android.c2dm.intent.RECEIVE" />
           </intent-filter>
       </service>

   <application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" />
</manifest>

build.gradle

apply plugin: "com.android.application"
apply plugin: 'io.fabric'

import com.android.build.OutputFile

/**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
* and bundleReleaseJsAndAssets).
* These basically call `react-native bundle` with the correct arguments during the Android build
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
* bundle directly from the development server. Below you can see all the possible configurations
* and their defaults. If you decide to add a configuration block, make sure to add it before the
* `apply from: "../../node_modules/react-native/react.gradle"` line.
*
* project.ext.react = [
*   // the name of the generated asset file containing your JS bundle
*   bundleAssetName: "index.android.bundle",
*
*   // the entry file for bundle generation
*   entryFile: "index.android.js",
*
*   // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
*   bundleCommand: "ram-bundle",
*
*   // whether to bundle JS and assets in debug mode
*   bundleInDebug: false,
*
*   // whether to bundle JS and assets in release mode
*   bundleInRelease: true,
*
*   // whether to bundle JS and assets in another build variant (if configured).
*   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
*   // The configuration property can be in the following formats
*   //         'bundleIn${productFlavor}${buildType}'
*   //         'bundleIn${buildType}'
*   // bundleInFreeDebug: true,
*   // bundleInPaidRelease: true,
*   // bundleInBeta: true,
*
*   // whether to disable dev mode in custom build variants (by default only disabled in release)
*   // for example: to disable dev mode in the staging build type (if configured)
*   devDisabledInStaging: true,
*   // The configuration property can be in the following formats
*   //         'devDisabledIn${productFlavor}${buildType}'
*   //         'devDisabledIn${buildType}'
*
*   // the root of your project, i.e. where "package.json" lives
*   root: "../../",
*
*   // where to put the JS bundle asset in debug mode
*   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
*
*   // where to put the JS bundle asset in release mode
*   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
*
*   // where to put drawable resources / React Native assets, e.g. the ones you use via
*   // require('./image.png')), in debug mode
*   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
*
*   // where to put drawable resources / React Native assets, e.g. the ones you use via
*   // require('./image.png')), in release mode
*   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
*
*   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
*   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
*   // date; if you have any other folders that you want to ignore for performance reasons (gradle
*   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
*   // for example, you might want to remove it from here.
*   inputExcludes: ["android/**", "ios/**"],
*
*   // override which node gets called and with what additional arguments
*   nodeExecutableAndArgs: ["node"],
*
*   // supply additional arguments to the packager
*   extraPackagerArgs: []
* ]
*/

project.ext.react = [
   entryFile: "index.js",
   enableHermes: false,  // clean and rebuild if changing
]

apply from: "../../node_modules/react-native/react.gradle"

Project background_geolocation = project(':react-native-background-geolocation')
apply from: "${background_geolocation.projectDir}/app.gradle"

def useIntlJsc = false

/**
* Set this to true to create two separate APKs instead of one:
*   - An APK that only works on ARM devices
*   - An APK that only works on x86 devices
* The advantage is the size of the APK is reduced by about 4MB.
* Upload all the APKs to the Play Store and people will download
* the correct one based on the CPU architecture of their device.
*/
def enableSeparateBuildPerCPUArchitecture = false

/**
* Run Proguard to shrink the Java bytecode in release builds.
*/
def enableProguardInReleaseBuilds = false

/**
* The preferred build flavor of JavaScriptCore.
*
* For example, to use the international variant, you can use:
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
*
* The international variant includes ICU i18n library and necessary data
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
* give correct results when using with locales other than en-US.  Note that
* this variant is about 6MiB larger per architecture than default.
*/
def jscFlavor = 'org.webkit:android-jsc:+'

/**
* Whether to enable the Hermes VM.
*
* This should be set on project.ext.react and mirrored here.  If it is not set
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
* and the benefits of using Hermes will therefore be sharply reduced.
*/
def enableHermes = project.ext.react.get("enableHermes", false);

android {
   compileSdkVersion rootProject.ext.compileSdkVersion

   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

   defaultConfig {
       applicationId "com.taknal.app.dev"
       minSdkVersion rootProject.ext.minSdkVersion
       targetSdkVersion rootProject.ext.targetSdkVersion
       versionCode 1
       versionName "1.0"
   }
   splits {
       abi {
           reset()
           enable enableSeparateBuildPerCPUArchitecture
           universalApk false  // If true, also generate a universal APK
           include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
       }
   }
   signingConfigs {
       debug {
           storeFile file('debug.keystore')
           storePassword 'android'
           keyAlias 'androiddebugkey'
           keyPassword 'android'
       }
       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
           }
       }
   }
   flavorDimensions "env"
   productFlavors {
       dev {
           dimension "env"
           applicationId "com.taknal.app.dev"
           buildConfigField "String", "ENV", "\"dev\""
       }
       prd {
           dimension "env"
           applicationId "com.taknal.app.dev"
           buildConfigField "String", "ENV", "\"prd\""
       }
   }
   buildTypes {
       debug {
           signingConfig signingConfigs.debug
       }
       release {
           // Caution! In production, you need to generate your own keystore file.
           // see https://facebook.github.io/react-native/docs/signed-apk-android.
           signingConfig signingConfigs.release
           minifyEnabled enableProguardInReleaseBuilds
           proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
           // Add following proguardFiles (leave existing one above untouched)
           // proguardFiles "${background_geolocation.projectDir}/proguard-rules.pro"
       }
   }
   // 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:
           // https://developer.android.com/studio/build/configure-apk-splits.html
           def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
           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
           }

       }
   }
   dexOptions {
       javaMaxHeapSize "4g"
   }
}

dependencies {
   implementation project(':react-native-android-open-settings')
   compile project(':react-native-push-notification')
   compile ('com.google.android.gms:play-services-gcm:8.1.0') {
       force = true;
   }
   implementation project(':react-native-device-info')
   implementation project(':react-native-gesture-handler')
   // implementation project(':react-native-firebase')
   // implementation project(':@react-native-community_netinfo')
   implementation fileTree(dir: "libs", include: ["*.jar"])
   implementation "com.facebook.react:react-native:+"  // From node_modules
   implementation 'com.google.firebase:firebase-analytics:17.2.0'
   compile 'com.facebook.android:facebook-android-sdk:[4,5)'
   implementation 'com.android.support:support-annotations:28.0.0'
   implementation project(':react-native-community-netinfo')
   implementation "com.google.firebase:firebase-messaging:21.1.0"

   if (enableHermes) {
       def hermesPath = "../../node_modules/hermes-engine/android/";
       debugImplementation files(hermesPath + "hermes-debug.aar")
       releaseImplementation files(hermesPath + "hermes-release.aar")
   } else {
       implementation jscFlavor
   }

   if (useIntlJsc) {
       implementation 'org.webkit:android-jsc-intl:+'
   } else {
       implementation 'org.webkit:android-jsc:+'
   }
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
   from configurations.compile
   into 'libs'
}

apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
apply plugin: 'com.google.gms.google-services'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions