question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

No device token, or permissions?

See original GitHub issue

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,
        });
    }

Issue Analytics

  • State:closed
  • Created 4 years ago
  • Comments:9

github_iconTop GitHub Comments

5reactions
ftKnoxcommented, May 8, 2019

@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>
1reaction
matt-wright86commented, May 6, 2019

@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”,

Read more comments on GitHub >

github_iconTop Results From Across the Web

iOS-13 Unable to receive Device Token. - Apple Developer
Hello There, After upgrade to iOS-13, we are unable to receive Device Token (intermittent) when we perform UIApplication.shared.
Read more >
Does APN device token depend on push notification permission
You will be able to send silent push notifications to your app using this token (a push with ... No, you need to...
Read more >
Why can I not register for push notifications? - Hacking with Swift
When you register for push notifications, one of two methods ought to be called: didRegisterForRemoteNotificationsWithDeviceToken is called ...
Read more >
Push Notifications Setup - Expo Documentation
For permissions, use requestPermissionsAsync , and for the ExpoPushToken, use getExpoPushTokenAsync . In the managed workflow, you don't need to pass any ...
Read more >
Push notification permissions - Swrve Help Center
The first time a push-enabled app requests the device token, iOS displays a dialog that requests permission for your app to send ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found