如何将 Firebase 消息传递到 Xamarin.Android 应用程序?

Posted

技术标签:

【中文标题】如何将 Firebase 消息传递到 Xamarin.Android 应用程序?【英文标题】:How to implement Firebase Messaging to Xamarin.Android application? 【发布时间】:2018-12-12 13:34:23 【问题描述】:

我正在使用 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 云消息传递,或者是否有任何其他方式可以为我的应用程序添加推送通知?

更新:

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

我检查了以下内容:

我的项目的包名称与 Firebase 应用上的包名称匹配 google-services.json 构建操作设置为 GoogleServicesJson Google Play 服务在我的设备上可用(Samsung SM-A500F Android 6.0 API 23),我也在其他设备上测试过,但仍然无法正常工作

我处理这个问题很久了,如果您需要任何其他信息,请询问我。

【问题讨论】:

【参考方案1】:

您需要从 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 控制台中的包名称与您的应用的包名称匹配。

【讨论】:

感谢您的回答。我从 Firebase Console -> Settings 下载了新的 google-services.json 文件到我的项目,清理了解决方案,重建它并从设备中删除了应用程序。当我在设备上测试应用程序并单击日志令牌按钮时,日志输出中的令牌是 emply,之后它给了我:D/FirebaseInstanceId(14477):后台同步失败:超时,10 秒后重试。所以我无法获得令牌 这可能需要更深入的调查。你可以打开一个免费的 Xamarin 电子邮件支持案例,与 Xamarin 支持工程师一对一地工作。您可以在此处打开免费的 Xamarin 支持案例:support.microsoft.com/en-us/…【参考方案2】:

我按照您提到的 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());
    



【讨论】:

嗯.. 所有代码都在此处的链接文档中:docs.microsoft.com/en-us/xamarin/android/data-cloud/…

以上是关于如何将 Firebase 消息传递到 Xamarin.Android 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 消息传递一对一消息

如何使用 Firebase 消息传递一对一消息

Firebase 云消息传递 - 如何验证令牌?

如何将 FireBase 云消息传递令牌存储在 Android 的 firebase 数据库中?

如何使用 Nuxt.js 实现 Firebase 云消息传递 (FCM)

在应用程序初始启动后,如何快速检索 Firebase Cloud Messaging 的消息传递令牌?