Ashish Srivastava
Ashish Srivastava

Reputation: 99

Unable to open my android background application (Xamarin) on receipt of Firebase Cloud Messaging

I have a Xamarin Android application. On receipt of push notification I am able to open the application if the application is alive and is in foreground. However, the application won't open up if it is in the background or is killed.

Already followed the Xamarin guidelines as stated in the page below but the provided code doesn't work either. https://developer.xamarin.com/guides/android/application_fundamentals/notifications/remote-notifications-with-fcm/

I want to take action (read open) on receipt of FCM push notification. Can do it successfully if the application is already open. Am I missing something? The details are as follows

AndroidManifest.xml

<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" 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>

FirebaseInstanceIdService Implementation

[Service]
[IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class MyFirebaseIIDService : FirebaseInstanceIdService
{
    const string TAG = "MyFirebaseIIDService";
    public override void OnTokenRefresh()
    {
        var refreshedToken = FirebaseInstanceId.Instance.Token;
        Log.Debug(TAG, "Refreshed token: " + refreshedToken);
        SendRegistrationToAppServer(refreshedToken);
    }


    void SendRegistrationToAppServer(string token)
    {
        // Add custom implementation here as needed.

        var android_id = Android.OS.Build.Serial;
        App.AccessCode(token, android_id);
    }

}

FirebaseMessagingService Implementation

    [Service]
[IntentFilter(new [] { "com.google.firebase.MESSAGING_EVENT" })]
public class MyFCMListenerService: FirebaseMessagingService {
 Intent intent;

 public override void OnMessageReceived(RemoteMessage message) {
  Thread thread = new Thread(() => {
   Log.Debug("MyGcmListenerService", "Message: thread");
   PushHandler pushHandler = PushHandler.GetPushHander();
   pushHandler.OnReceiveNewNotification(msg, pushType.ToString());

  });
  thread.Start();
 }
}

Package.config

    <?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AndHUD" version="1.2.0" targetFramework="MonoAndroid60" />
  <package id="Plugin.CurrentActivity" version="1.0.1" targetFramework="monoandroid71" />
  <package id="SQLite.Net.Core-PCL" version="3.1.1" targetFramework="MonoAndroid60" />
  <package id="SQLite.Net-PCL" version="3.1.1" targetFramework="MonoAndroid60" />
  <package id="Xam.Plugin.Connectivity" version="3.0.2" targetFramework="monoandroid71" />
  <package id="Xam.Plugin.DeviceInfo" version="3.0.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Annotations" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Compat" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Core.UI" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Core.Utils" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Design" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Fragment" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Media.Compat" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Transition" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v4" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.AppCompat" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.CardView" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.MediaRouter" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.Palette" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.v7.RecyclerView" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Android.Support.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid71" />
  <package id="Xamarin.Build.Download" version="0.4.7" targetFramework="monoandroid71" />
  <package id="Xamarin.Firebase.Common" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Firebase.Iid" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Firebase.Messaging" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.Forms" version="2.3.4.270" targetFramework="monoandroid71" />
  <package id="Xamarin.GooglePlayServices.Base" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.GooglePlayServices.Basement" version="42.1021.1" targetFramework="monoandroid71" />
  <package id="Xamarin.GooglePlayServices.Tasks" version="42.1021.1" targetFramework="monoandroid71" />
</packages>

Also, if I use the prescribed configuration FirebaseApp.InitializeApp(this); then unable to open the application even when in foreground. To solve the problem, have used google-services.json

I am doing this for configuration

var options = new FirebaseOptions.Builder()
            .SetApplicationId("1:******:*****")
            .SetApiKey("*******-a6-cEUkjxB6EqiO9zmkNcmu")
            //.SetDatabaseUrl("Firebase-Database-Url")
            .SetGcmSenderId("******")
            .Build();

            var firebaseApp = FirebaseApp.InitializeApp(this, options);
            // Generate token in background thread
            Task.Run(() => {
                var instanceID = FirebaseInstanceId.Instance;
                instanceID.DeleteInstanceId();
                var iid1 = instanceID.Token;
                var iid2 = instanceID.GetToken("*****", Firebase.Messaging.FirebaseMessaging.InstanceIdScope);
            });

Upvotes: 0

Views: 440

Answers (1)

Ashish Srivastava
Ashish Srivastava

Reputation: 99

After wasting time in days i figure out an alternative for receiving push in background and handle or modify it

public override void HandleIntent(Intent p0)

this function is called every time foreground and background but after killing the this wont't work.

Upvotes: 1

Related Questions