Forum Xamarin.Android
We are excited to announce that the Xamarin Forums are moving to the new Microsoft Q&A experience. Q&A is the home for technical questions and answers at across all products at Microsoft now including Xamarin!

We encourage you to head over to Microsoft Q&A for .NET for posting new questions and get involved today.

FirebaseInstanceIdService is deprecated and OnNewToken() not working

I want to implement OnNewToken() method from FirebaseMessagingService in my Xamarin Android project that uses Firebase Cloud Messaging since FirebaseInstanceIdService and OnTokenRefreshed() are deprecated.

I tried this

[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class MessagingService : FirebaseMessagingService
{
    const string TAG = "MyFirebaseMsgService";
    public override void OnNewToken(string token)
    {
        Log.Debug(TAG, "Refreshed token: " + token);
        SendRegistrationToServer(token);
    }

    public void SendRegistrationToServer(string token)
    {
        ...
    }

}

But my OnNewToken() is not hit. What am I doing wroing. Do i need to include anything in my Android manifest file? I cannot find any documents specific to Xamarin Android about this update. Please help. Thank you so much.

Answers

  • jezhjezh Member, Xamarin Team Xamurai

    The onNewToken method will only be called when a new token is generated.
    Quite often (especially during development) your app already have generated a token before you added the service. So onNewToken will not be called.
    If you want to get the token directly , the class FirebaseInstanceId may be helpful.

  • borge_rodsjoborge_rodsjo NOMember ✭✭

    @prabesh I have the same code as you, and I have the same problem; OnNewToken(string token) is not being called. I'm using all of the newest packages like:

    <package id="Xamarin.Firebase.Iid" version="70.1620.0-preview2" targetFramework="monoandroid90" />
    <package id="Xamarin.Firebase.Messaging" version="70.1710.0-preview2" targetFramework="monoandroid90" />
    <package id="Xamarin.Firebase.Config" version="70.1600.0-preview2" targetFramework="monoandroid90" />
    

    In my manifest I have this:

    <receiver android:exported="false" android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"/>
    <receiver android:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" 
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
            <category android:name="${applicationId}"/>
        </intent-filter>
    </receiver>
    

    Please, someone, look into the new way of getting FCM token

  • SagarPanwalaSagarPanwala USMember ✭✭✭

    @borge_rodsjo
    I personally didn't try , but this can be useful.
    https://forums.xamarin.com/discussion/136721/firebaseinstanceidservice-is-deprecated-and-onnewtoken-not-working

    If you try , please let us know the feedback.

  • GautamJainGautamJain INMember ✭✭✭

    Fixed in latest Xamarin.Firebase.Messaging (still in preview) - Version 70.1710.0-preview2

  • DooksDooks ZAMember ✭✭✭

    It is now May 2019. Did you figure it out @prabesh

    I'm getting the following error:

    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.internal.firebase-perf.zzq.zzb(boolean)' on a null object reference
    

    I have tried adding the following to the Manifest:

    <service android:name="com.google.firebase.components.ComponentDiscoveryService" >
      <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar" />
    </service>
    
  • DeepfreezedDeepfreezed Member ✭✭
    edited August 2019

    Got this working...

    Add below to AndroidManifest.xml
    <service android:name=".MyFirebaseMessagingService" android:stopWithTask="false"><intent-filter><action android:name="com.google.firebase.MESSAGING_EVENT" /></intent-filter></service>

    Rest of the code same as OP.

  • SamPollockSamPollock GBMember ✭✭

    Hi All, really struggling to get this working. I have been away from Xamarin for 18 months and gone native but due to a client requesting Xamarin I am back here.

    I have similar code working in a native java app but I am struggling with this.

    I have the above code in my manifest but I am getting the following

    Java.Lang.RuntimeException: Unable to instantiate service .MyFirebaseMessagingService: java.lang.ClassNotFoundException: Didn't find class "packagename.MyFirebaseMessagingService" on path: DexPathList

    [Service]
        [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
        public class MyFirebaseMessagingService : FirebaseMessagingService
        {
            const string TAG = "MyFireBaseMessagingService";
    
            public override void OnNewToken(string token)
            {
                Log.Debug(TAG, "Refreshed token: " + token);
                SendRegistrationToServer(token);
            }
    
    
            public override void OnMessageReceived(RemoteMessage message)
            {
                Log.Debug(TAG, "From: " + message.From);
    
                var body = message.GetNotification().Body;
                Log.Debug(TAG, "Notification Message Body: " + body);
                SendNotification(body, message.Data);
            }
    
            void SendNotification(string messageBody, IDictionary<string, string> data)
            {
                var intent = new Intent(this, typeof(MainActivity));
                intent.AddFlags(ActivityFlags.ClearTop);
                foreach (var key in data.Keys)
                {
                    intent.PutExtra(key, data[key]);
                }
    
                var pendingIntent = PendingIntent.GetActivity(this, MainActivity.NOTIFICATION_ID, intent, PendingIntentFlags.OneShot);
    
                var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
                                          //.SetSmallIcon(Resource.Drawable.ic_stat_ic_notification)
                                          .SetContentTitle("FCM Message")
                                          .SetContentText(messageBody)
                                          .SetAutoCancel(true)
                                          .SetContentIntent(pendingIntent);
    
                var notificationManager = NotificationManagerCompat.From(this);
                notificationManager.Notify(MainActivity.NOTIFICATION_ID, notificationBuilder.Build());
            }
    
            void SendRegistrationToServer(string token)
            {
                // Add custom implementation, as needed.
                ISharedPreferences prefs;
                ISharedPreferencesEditor prefseditor;
                prefs = PreferenceManager.GetDefaultSharedPreferences(this);
                prefseditor = prefs.Edit();
    
                prefseditor.PutBoolean(Constants.PREFS_FCM_TOKEN_CHANGED, true);
                prefseditor.PutString(Constants.PREFS_FCM_TOKEN, token);
    
                if (prefs.GetString(Constants.PREFS_DEVICE_GUID, "") == "")
                {
                    prefseditor.PutString(Constants.PREFS_DEVICE_GUID, Guid.NewGuid().ToString().Replace(" ", "").ToLower());
                }
    
                prefseditor.Commit();
            }
    
  • SamPollockSamPollock GBMember ✭✭

    PS I don't have proguard enabled

  • SamPollockSamPollock GBMember ✭✭

    Ok guys, in case it helps anyone else, I have this working now. I needed to add this to the top of my service

    [Service (Name= "packagename.MyFirebaseMessagingService")]

    it now fires the onNewtoken and finds the service

    Onwards and Upwards :-)

  • Im using Xamarin.Firebase.Messaging version 60.1142.1 and it is erroring saying that FirebaseInstanceIdService is deprecated and at runtime we are getting the unsuccessful registration for firebase error, even after cleaning and rebuilding the android project. Is there going to be a fix for Xamarin.Firebase.Messaging version 60.1142.1 ?

  • taitotaito USMember ✭✭

    @SamPollock said:
    Ok guys, in case it helps anyone else, I have this working now. I needed to add this to the top of my service

    [Service (Name= "packagename.MyFirebaseMessagingService")]

    it now fires the onNewtoken and finds the service

    Onwards and Upwards :-)

    @SamPollock can you show us your android manifest?

  • SamPollockSamPollock GBMember ✭✭
    edited October 2019

    I cant really show the manifest however the relevant part is

    <service android:name="com.yourpackagename.MyFirebaseMessagingService" android:stopWithTask="false">
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_EVENT" />
                </intent-filter>
            </service>
    
  • atataatata Member ✭✭
    edited November 2019

    @SamPollock said:
    Ok guys, in case it helps anyone else, I have this working now. I needed to add this to the top of my service

    [Service (Name= "packagename.MyFirebaseMessagingService")]

    it now fires the onNewtoken and finds the service

    Onwards and Upwards :-)

    God bless you, Sam! You saved my day!
    My resulting file (MyFirebaseMessagingService.cs) looks like:

    using System;
    using Android.App;
    using Firebase.Messaging;
    using Android.Util;
    
    namespace <PASTE_YOUR_APP_NAME_HERE>
    {
        [Service(Name = "<PASTE_YOUR_PACKAGE_NAME_HERE>.MyFirebaseMessagingService")]
        [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
        public class MyFirebaseMessagingService : FirebaseMessagingService
        {
    
            public override void OnNewToken(string token)
            {
                base.OnNewToken(token);
            }
    
            public override void OnMessageReceived(RemoteMessage remoteMessage)
            {
                base.OnMessageReceived(remoteMessage);
            }
        }
    }
    
  • drameshdramesh Member

    @jezh said:
    The onNewToken method will only be called when a new token is generated.
    Quite often (especially during development) your app already have generated a token before you added the service. So onNewToken will not be called.
    If you want to get the token directly , the class FirebaseInstanceId may be helpful.

    This is correct - onNewToken() will be called only once per installation. If you need it to be called again, uninstall the app from your device and restart it.

  • ulyssetsdulyssetsd Member

    I found this up to date documentation made by Microsoft:
    docs.microsoft.com/en-us/azure/notification-hubs/xamarin-notification-hubs-push-notifications-android-gcm#set-up-notification-hubs-in-your-project
    (sorry about the broken link, this forum doesn't allow to insert link when you are new)

  • KanthKanth INMember ✭✭

    @SamPollock We are facing the same issue where OnNewToken method never hits , I have tried all the possible ways mentioned above, and when i try this FirebaseMessaging.Instance.AutoInitEnabled = true; The below error is thrown at Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in :0
    at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in :0
    at Firebase.Messaging.FirebaseMessaging.set_AutoInitEnabled (System.Boolean value) [0x00022] in <950f147afc11488abae5c0be3de4f06e>:0
    at AspenConnect.Droid.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x00130] in /Users/733728/Documents/GitHub/AspenConnect/AspenConnect/AspenConnect.Android/MainActivity.cs:96
    --- End of managed Java.Lang.NullPointerException stack trace ---
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.firebase.iid.FirebaseInstanceId.zzb(boolean)' on a null object reference
    at com.google.firebase.messaging.FirebaseMessaging.setAutoInitEnabled(Unknown Source:8)
    at crc64c42fb79c8c2d6d3a.MainActivity.n_onCreate(Native Method)
    at crc64c42fb79c8c2d6d3a.MainActivity.onCreate(MainActivity.java:33)
    at android.app.Activity.performCreate(Activity.java:7224)
    at android.app.Activity.performCreate(Activity.java:7213)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2926)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6810)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

  • KanthKanth INMember ✭✭

    @SamPollock We are facing the same issue where OnNewToken method never hits , I have tried all the possible ways mentioned above, and when i try this FirebaseMessaging.Instance.AutoInitEnabled = true; The below error is thrown:java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.firebase.iid.FirebaseInstanceId.zzb(boolean)' on a null object reference
    at com.google.firebase.messaging.FirebaseMessaging.setAutoInitEnabled(Unknown Source:8)

  • SamPollockSamPollock GBMember ✭✭

    @Kanth said:
    @SamPollock We are facing the same issue where OnNewToken method never hits , I have tried all the possible ways mentioned above, and when i try this FirebaseMessaging.Instance.AutoInitEnabled = true; The below error is thrown:java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.firebase.iid.FirebaseInstanceId.zzb(boolean)' on a null object reference
    at com.google.firebase.messaging.FirebaseMessaging.setAutoInitEnabled(Unknown Source:8)

    Apologies Kanth, I cant really look into this at the moment, I am not currently doing much Xamarin as have moved mainly native although still have a few projects on the go, if anything springs to mind when I get back to them in a few weeks I will post here.

  • KanthKanth INMember ✭✭

    Including the Xamarin.Android.ManifestMerger solved this issue for me:
    https://www.nuget.org/packages/Xamarin.Android.ManifestMerger/1.0.0-preview03

    Using this fixed by issue

Sign In or Register to comment.