如何将Firebase Messaging实施到Xamarin.Android应用程序?

时间:2018-12-12 13:34:23

标签: android firebase xamarin push-notification xamarin.android

我正在使用Xamarin.Android制作我的Android应用程序。 我想实现推送通知,我正在尝试按照以下指南使用Firebase:https://docs.microsoft.com/en-us/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=windows 但是,本指南和其他有关同一主题的指南似乎已过时。当我在Firebase控制台中创建一个新项目并单击添加到android应用程序时,我会看到有关Android Studio,Unity和Web应用程序的说明。没有有关Xamarin的说明。当我尝试遵循Android Studio的说明时,我可以获取google-services.json文件,但我无法遵循第3部分和第4部分(添加android SDK和测试连接性),因为它们用于gradle开发。 如何在Xamarin.Android应用程序中使用Firebase Cloud Messaging,或者是否有其他方法为我的应用程序添加推送通知?

更新:

我从Firebase控制台->设置下载了新的google-services.json文件到我的项目,清理了解决方案,对其进行了重建,并从设备中删除了应用。当我在设备上测试应用程序并单击“日志令牌”按钮时,“日志输出”中的令牌为空,此后它会给我: D / FirebaseInstanceId(14477):后台同步失败:超时,请在10秒后重试。 所以现在我无法获取令牌,或者也许我无法刷新它。

我检查了以下内容:

  • 我的项目的软件包名称与Firebase应用程序上的软件包名称匹配
  • google-services.json构建操作设置为GoogleServicesJson
  • 我的设备上可以使用Google Play服务(三星SM-A500F Android 6.0 API 23),我也在其他设备上对此进行了测试,但仍然无法运行

我正在处理这个问题很长时间,如果您需要任何其他信息,请询问我。

2 个答案:

答案 0 :(得分:0)

您从Firebase控制台中所需的就是google-services.json文件。完成此操作后,请忽略从Firebase控制台链接的说明,并使用您链接的Microsoft说明文档,例如:https://docs.microsoft.com/en-us/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=windows

在Firebase控制台中,请确保Firebase控制台中的软件包名称与您的应用程序的软件包名称匹配。

答案 1 :(得分:0)

我遵循了您提到的Microsoft示例,但遇到了同样的问题。 在另一个示例中进行搜索,我发现代码中缺少一个类,因此就可以了。

只需确保它在Android项目根目录中的MyFirebaseIIDService类旁边即可。那解决了我的问题。

[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class MyFirebaseMessagingService : FirebaseMessagingService
{
    const string TAG = "MyFirebaseMsgService";

    public override void OnMessageReceived(RemoteMessage message)
    {
        Log.Debug(TAG, "From: " + message.From);

        var body = message.GetNotification().Body;
        var title = message.GetNotification().Title;
        Log.Debug(TAG, "Notification Message Body: " + body);
        SendNotification(body, title, message.Data);
    }

    void SendNotification(string messageBody, string Title, 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(Title)
                                  .SetContentText(messageBody)
                                  .SetAutoCancel(true)
                                  .SetContentIntent(pendingIntent);

        var notificationManager = NotificationManagerCompat.From(this);
        notificationManager.Notify(MainActivity.NOTIFICATION_ID, notificationBuilder.Build());
    }


}