-
-
Save jfversluis/dd760594099066c7450d50cce6499368 to your computer and use it in GitHub Desktop.
* Setup Firebase project like normal and add google-services.json (make sure Build action is set to GoogleServicesJson) | |
* Nugets required for MAUI project file (later versions don't work) | |
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0-android'"> | |
<PackageReference Include="Xamarin.Firebase.Iid" Version="121.1.0" /> | |
<PackageReference Include="Xamarin.Firebase.Messaging" Version="122.0.0" /> | |
<PackageReference Include="Xamarin.Google.Dagger" Version="2.39.1" /> | |
<PackageReference Include="Xamarin.GooglePlayServices.Base" Version="117.6.0.5" /> | |
</ItemGroup> | |
using Android.App; | |
using Android.Content; | |
using AndroidX.Core.App; | |
using Firebase.Messaging; | |
namespace FCMApp.Android; | |
[Service(Exported = false)] | |
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })] | |
public class FCMService : FirebaseMessagingService | |
{ | |
public override void OnMessageReceived(RemoteMessage message) | |
{ | |
RemoteMessage.Notification notification = message.GetNotification(); | |
IDictionary<string, string> data = message.Data; | |
string body = ""; | |
string title = ""; | |
if (data != null && data.ContainsKey("body") && data.ContainsKey("title")) | |
{ | |
body = data["body"]; | |
title = data["title"]; | |
} | |
else if (notification != null) | |
{ | |
body = message.GetNotification().Body; | |
title = message.GetNotification().Title; | |
} | |
if (!string.IsNullOrEmpty(body) && !string.IsNullOrEmpty(title)) | |
{ | |
// TODO: Manage this message (we get here only when app is in foreground) | |
} | |
} | |
} |
namespace FCMApp; | |
public interface IMessagingService | |
{ | |
string GetToken(); | |
bool IsMessagingAvailable(); | |
void SetNewTokenCallback(Action<string> token_callback); | |
} | |
using Android.Gms.Common; | |
using Android.Gms.Tasks; | |
using Firebase.Iid; | |
namespace FCMApp; | |
public partial class MessagingService | |
{ | |
public partial bool IsMessagingAvailable() => GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(Android.App.Application.Context) == ConnectionResult.Success; | |
public partial string GetToken() => FirebaseInstanceId.Instance.Token; | |
public partial void SetNewTokenCallback(Action<string> token_callback) | |
{ | |
if (token_callback == null) | |
throw new InvalidOperationException("Callback cannot be null"); | |
if (GetToken() != null) | |
token_callback(GetToken()); | |
else | |
FirebaseInstanceId.Instance.GetInstanceId().AddOnSuccessListener(new OnTokenListener((token) => token_callback(token))); | |
} | |
} | |
public class OnTokenListener : Java.Lang.Object, IOnSuccessListener | |
{ | |
Action<string> _callback; | |
public OnTokenListener(Action<string> success_callback) => _callback = success_callback; | |
public void OnSuccess(Java.Lang.Object result) => _callback?.Invoke(FirebaseInstanceId.Instance.Token); | |
} |
namespace FCMApp; | |
public partial class MessagingService : IMessagingService | |
{ | |
public partial string GetToken(); | |
public partial bool IsMessagingAvailable(); | |
public partial void SetNewTokenCallback(Action<string> token_callback); | |
} |
This code gave me some first results and put me on the right track. (mostly the working packages and OnMessageReceived service)
However it uses a lot of obsolete methods so I had to rewrite almost everything from parts found in different projects / documentations / samples ...
Do we have any way to implement push notification sin MAUI
@AnjanaJois20 this code is for .NET MAUI or Xamarin.Forms for that matter. There is no difference between it
FirebaseInstanceId is deprecated.
I just put together a tutorial how to get work FCM and .NET MAUI for iOS platform. Hopefully will help someone...
Awesome @michalpr! Thanks for that!
@maurobernal
Replace the deprecated FirebaseInstanceId with FirebaseMessaging.
- FirebaseInstanceId.Instance.Token -> (string)FirebaseMessaging.Instance.GetToken().Result
- FirebaseInstanceId.Instance.GetInstanceId().AddOnSuccessListener(... -> FirebaseMessaging.Instance.GetToken().AddOnSuccessListener(...
- .Invoke(FirebaseInstanceId.Instance.Token) -> .Invoke((string)FirebaseMessaging.Instance.GetToken()
I have a clarifying question. How can I send a push inside my application to a user via FCM using the Messaging Service or FCMService? Please give examples
do you have working MAUI example for android?
Thanks @peter-bozovic ! Did you get it to work with this?
I don't have anything for iOS right now yet