zo0r / react-native-push-notification

React Native Local and Remote Notifications
MIT License
6.73k stars 2.05k forks source link

No device token, or permissions? #1065

Closed KemikalGeneral closed 3 years ago

KemikalGeneral commented 5 years ago

Hello,

I've been stuck on this for a good few days now, and I just can't find a way to get it to work. I know it's been brought up a few times over the years, with varying degrees of success, and I've tried all of the 'solutions', but with no luck.

NB... I haven't tried it on iOS yet, so this is mostly an Android issue.

I have followed the instructions, and searched the trouble shooting, but I cannot get the device token from onRegister.

I can get a local notification to fire on load, and onNotification is being called upon interaction, but no token.

I'm not sure how relevant this is, but I thought I'd have to give permission(?), but even though requestPermissions is true, I never get asked. I did a little digging, and in node_modules\react-native-push-notification\index.js there are two functions requesting permissions.

This is getting called automatically and has the correct senderID

// Prevent requestPermissions called twice if ios result is pending
Notifications._requestPermissions

This only gets called if I explicitly call PushNotifications.requestPermissions() but the senderID is undefined

// Stock requestPermissions function
Notifications.requestPermissions

I've tried lots of different combinations of adding or removing lines from Gradle and the Manifest, but nothing's worked, so I've started again with just the lines from the documentation. Originally, I had the call to configurePushNotifications() in my logIn function, but read that it should be called from the highest component before loading the JS, so i moved it to index.js, but it didn't make any difference, still no token.

I'm literally at my wits end, and could really do with some help please, there's a Ferrero Rocher Easter egg up for grabs for whoever solves it!

Thanks xxx

Testing on Windows Android Device, not emulator react-native-cli: 2.0.1 react-native: 0.59.5 react-native-push-notification": ^3.1.3,

AndroidManifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.myApp">

    <uses-permission android:name="android.permission.INTERNET" />
    <!-- < Only if you're using GCM or localNotificationSchedule() > -->
    <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" />
    <!-- < Only if you're using GCM or localNotificationSchedule() > -->

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

    <application
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
        <activity
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
                android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />

        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_channel_name"
                    android:value="YOUR NOTIFICATION CHANNEL NAME"/>
        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_channel_description"
                    android:value="YOUR NOTIFICATION CHANNEL DESCRIPTION"/>
        <!-- Change the resource name to your App's accent color - or any other color you want -->
        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_color"
                    android:resource="@android:color/white"/>

        <!-- < Only if you're using GCM or localNotificationSchedule() > -->
        <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>
        <!-- < Only if you're using GCM or localNotificationSchedule() > -->

        <!-- < Only if you're using GCM or localNotificationSchedule() > -->
        <service
                android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerServiceGcm"
                android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
        <!-- </ Only if you're using GCM or localNotificationSchedule() > -->

        <!-- < Else > -->
        <service
                android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
                android:exported="false" >
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
        <!-- </Else> -->
    </application>

</manifest>

app\build.gradle

apply plugin: "com.android.application"

import com.android.build.OutputFile

project.ext.react = [
    entryFile: "index.js"
]

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

def enableSeparateBuildPerCPUArchitecture = false

def enableProguardInReleaseBuilds = false

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId "com.sumoshift"
        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"
        }
    }
    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "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:
            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
            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
            }
        }
    }
}

dependencies {
    implementation ("com.google.android.gms:play-services-gcm:12.0.1") {
        force = true
    }
    implementation ("com.google.firebase:firebase-messaging:12.0.1") {
        force = true
    }
    implementation project(':react-native-push-notification')
    implementation project(':react-native-gesture-handler')
    implementation project(':react-native-vector-icons')
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
    implementation "com.facebook.react:react-native:+"  // From node_modules
}

// 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 plugin: 'com.google.gms.google-services'

android\build.gradle

buildscript {
    ext {
        buildToolsVersion = "28.0.3"
        minSdkVersion = 16
        compileSdkVersion = 28
        targetSdkVersion = 28
        supportLibVersion = "28.0.0"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
        classpath 'com.google.gms:google-services:4.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        google()
        jcenter()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
    }
}

notifications.js

configurePushNotifications(shouldRegisterDeviceDetails) {
        console.log('notifications Notification configurePushNotifications');

        Notification.create({message: 'Test message working'});

        PushNotification.configure({

            // (optional) called when Token is generated (Android & iOS)
            onRegister:  function (registrationToken) {
                console.log('notifications Notification configurePushNotifications onRegister registrationToken: ', registrationToken);

                if (shouldRegisterDeviceDetails) {
                    console.log('registering device');

                    API.editShifterData(8, {
                        device_token: registrationToken.token,
                        phone_type: registrationToken.os
                    })
                        .then((response) => {
                            console.log('notifications Notification configurePushNotifications onRegister response: ', response);
                        })
                        .catch((error) => {
                            console.log('notifications Notification configurePushNotifications onRegister error: ', error);
                        })
                }
            },

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

                if (notification.userInteraction) {
                    console.log('notifications Notification configurePushNotifications onNotification userInteraction TRUE');

                    Notification.open(notification);
                } else {
                    console.log('notifications Notification configurePushNotifications onNotification userInteraction FALSE');

                    Notification.create(notification);
                }
            },

            // ANDROID ONLY: GCM Sender ID (optional - not required for local notifications, but is need to receive remote push notifications)
            senderID: "xxxxxxxxxxx",

            // 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
             */
            requestPermissions: true,
        });
    }
matt-wright86 commented 5 years ago

I'm having this same issue of onRegister() not firing on Android, It works perfectly on iOS

matt-wright86 commented 5 years ago

@KemikalGeneral, I just resolved this, please ensure you've included your senderID

// ANDROID ONLY: GCM or FCM Sender ID (product_number) (optional - not required for local notifications, but is need to receive remote push notifications) senderID: "YOUR GCM (OR FCM) SENDER ID",

KemikalGeneral commented 5 years ago

I'm wondering if this package and/or setup still works now that GCM is deprecated in favour of FCM?

KemikalGeneral commented 5 years ago

@matt-wright86 yeah, it's in my notifications.js ☹️

ftKnox commented 5 years ago

@KemikalGeneral put this in your AndroidManifest.xml inside application block

        <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.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
LucienChu commented 5 years ago

@KemikalGeneral Hello, have you fixed this issue and make the android permission popped up or have the device token generated? I try everything and nothing about the device token worked. Thanks

KemikalGeneral commented 5 years ago

Hi @LucienChu

Yes i did, but i had to add some missing bits to the manifest. You can check out my question, and answer, on StackOverflow

https://stackoverflow.com/questions/56022476/why-isnt-a-device-token-being-generated

I must say though, from reading around, it seems like everyone had their own fix for this problem, so my solution may not work. I think the maintainers of this package need to give it a good going over and update the documentation to suit as it's pretty poor in its current state.

anuj-njoshi commented 4 years ago

Facing same issue for android version 8.0.1 Lg device Stylo 4. Do we have fixed solution. plugin version "react-native-push-notification": "^3.1.3",

github-actions[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 30 days if no further activity occurs. Thank you for your contributions.