本演练分步说明如何使用 Firebase Cloud Messaging 在 Xamarin.Android 应用程序中实现远程通知 (也称为推送通知) 。 它演示如何实现与 Firebase Cloud Messaging (FCM) 通信所需的各种类,提供了有关如何配置 Android 清单以访问 FCM 的示例,并使用 Firebase 控制台演示下游消息传送。
FCM 通知概述
在本演练中,将创建一个名为
FCMClient
的基本应用,以说明 FCM 消息传送的基本知识。
FCMClient
检查 Google Play Services 是否存在、从 FCM 接收注册令牌、显示从 Firebase 控制台发送的远程通知并订阅主题消息:
将探讨以下主题领域:
在本演练中,你将以增量方式将功能添加到
FCMClient
,并在设备或模拟器上运行该功能,以了解它如何与 FCM 交互。 你将使用日志记录来见证 FCM 服务器的实时应用事务,并观察如何从输入 Firebase 控制台通知 GUI 的 FCM 消息生成通知。
熟悉 Firebase Cloud Messaging 可以发送
的不同类型的消息
将很有帮助。 消息的有效负载将确定客户端应用接收和处理消息的方式。
在继续本演练之前,必须获取必要的凭据才能使用 Google 的 FCM 服务器;
Firebase Cloud Messaging
中介绍了此过程。
具体而言,必须下载
google-services.json
文件才能与本演练中显示的示例代码一起使用。 如果尚未在 Firebase 控制台 (或尚未下载
google-services.json
文件) ,请参阅
Firebase Cloud Messaging
。
若要运行示例应用,需要一个与 Firebase 相容的 Android 测试设备或模拟器。 Firebase Cloud Messaging 支持在 Android 4.0 或更高版本上运行的客户端,并且这些设备还必须安装 Google Play Store 应用, (Google Play Services 9.2.1 或更高版本) 。 如果设备上尚未安装 Google Play Store 应用,请访问
Google Play
网站以下载并安装它。 或者,如果使用的是 Android SDK 模拟器) ,则可以将 Android SDK 模拟器与 Google Play Services 一起使用,而不是安装测试设备, (无需安装 Google Play Store。
启动应用项目
首先,创建一个名为
FCMClient
的新空 Xamarin.Android 项目。 如果不熟悉创建 Xamarin.Android 项目,请参阅
Hello、Android
。
创建新应用后,下一步是设置包名称,并安装多个用于与 FCM 通信的NuGet包。
设置包名称
在
Firebase Cloud Messaging
中,你为已启用 FCM 的应用指定了包名称。 此包名称还充当与
API 密钥
关联的
应用程序 ID
。 将应用配置为使用此包名称:
如果此包名称与在 Firebase 控制台中输入的包名称
不完全
匹配,则客户端应用将无法从 FCM 接收注册令牌。
添加 Xamarin Google Play Services 基础包
由于 Firebase Cloud Messaging 依赖于 Google
Play Services,因此必须将 Xamarin Google Play Services - Base
NuGet 包添加到 Xamarin.Android 项目。 需要版本 29.0.0.2 或更高版本。
Visual Studio
Visual Studio for Mac
如果在安装NuGet期间遇到错误,请关闭
FCMClient
项目,再次打开它,然后重试NuGet安装。
安装
Xamarin.GooglePlayServices.Base
时,还会安装所有必要的依赖项。 编辑
MainActivity.cs
并添加以下
using
语句:
using Android.Gms.Common;
此语句使 GoogleApiAvailability
Xamarin.GooglePlayServices.Base 中的类可用于 FCMClient 代码。
GoogleApiAvailability
用于检查 Google Play Services 是否存在。
添加 Xamarin Firebase 消息传送包
若要从 FCM 接收消息,必须将 Xamarin Firebase - 消息传送NuGet包添加到应用项目中。 如果没有此包,Android 应用程序无法从 FCM 服务器接收消息。
Visual Studio
Visual Studio for Mac
安装 Xamarin.Firebase.Messaging 时,还会安装所有必要的依赖项。
接下来,编辑 MainActivity.cs 并添加以下 using
语句:
using Firebase.Messaging;
using Firebase.Iid;
using Android.Util;
前两个语句使 Xamarin.Firebase.Messaging NuGet包中可用于 FCMClient 代码的类型。 Android.Util 添加了日志记录功能,用于观察 FMS 的事务。
添加 Google Services JSON 文件
下一步是将 google-services.json 文件添加到项目的根目录:
Visual Studio
Visual Studio for Mac
将 google-services.json 复制到项目文件夹。
将 google-services.json 添加到应用项目, (单击解决方案资源管理器中的所有文件,右键单击 google-services.json,然后选择“包含在Project) 中。
在“解决方案资源管理器”窗口中选择“google-services.json”。
在 “属性” 窗格中,将 “生成操作 ”设置为 GoogleServicesJson:
如果未显示 GoogleServicesJson 生成操作,请保存并关闭解决方案,然后重新打开它。
将 google-services.json 添加到项目 (并且 GoogleServicesJson 生成操作设置为) 时,生成过程将提取客户端 ID 和 API 密钥,然后将这些凭据添加到驻留在 obj/Debug/android/AndroidManifest.xml的合并/生成的AndroidManifest.xml。 此合并过程会自动添加连接到 FCM 服务器所需的任何权限和其他 FCM 元素。
检查 Google Play Services 并创建通知通道
Google 建议 Android 应用在访问 Google Play Services 功能 (之前检查 Google Play Services APK 是否存在,有关详细信息,请参阅 “检查 Google Play 服务 ”) 。
首先会创建应用 UI 的初始布局。 编辑 Resources/layout/Main.axml 并将其内容替换为以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<TextView
android:text=" "
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/msgText"
android:textAppearance="?android:attr/textAppearanceMedium"
android:padding="10dp" />
</LinearLayout>
这将 TextView
用于显示指示是否安装了 Google Play Services 的消息。 将更改保存到 Main.axml。
编辑 MainActivity.cs 并将以下实例变量添加到 MainActivity
类:
public class MainActivity : AppCompatActivity
static readonly string TAG = "MainActivity";
internal static readonly string CHANNEL_ID = "my_notification_channel";
internal static readonly int NOTIFICATION_ID = 100;
TextView msgText;
变量CHANNEL_ID
,NOTIFICATION_ID
将在本演练的后面部分添加到MainActivity
的方法CreateNotificationChannel
中使用。
在以下示例中,该方法 OnCreate
将在应用尝试使用 FCM 服务之前验证 Google Play Services 是否可用。
将以下方法添加到 MainActivity
类:
public bool IsPlayServicesAvailable ()
int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable (this);
if (resultCode != ConnectionResult.Success)
if (GoogleApiAvailability.Instance.IsUserResolvableError (resultCode))
msgText.Text = GoogleApiAvailability.Instance.GetErrorString (resultCode);
msgText.Text = "This device is not supported";
Finish ();
return false;
msgText.Text = "Google Play Services is available.";
return true;
此代码检查设备以查看是否安装了 Google Play Services APK。 如果未安装,则会 TextBox
在指示用户从 Google Play Store 下载 APK (或) 设备系统设置中启用 APK 的消息。
在 Android 8.0 (API 级别 26) 或更高版本上运行的应用必须创建用于发布通知的 通知通道 。 将以下方法添加到 MainActivity
将创建通知通道的类 ((如有必要)) :
void CreateNotificationChannel()
if (Build.VERSION.SdkInt < BuildVersionCodes.O)
// Notification channels are new in API 26 (and not a part of the
// support library). There is no need to create a notification
// channel on older versions of Android.
return;
var channel = new NotificationChannel(CHANNEL_ID,
"FCM Notifications",
NotificationImportance.Default)
Description = "Firebase Cloud Messages appear in this channel"
var notificationManager = (NotificationManager)GetSystemService(Android.Content.Context.NotificationService);
notificationManager.CreateNotificationChannel(channel);
将 OnCreate
方法替换为以下代码:
protected override void OnCreate (Bundle bundle)
base.OnCreate (bundle);
SetContentView (Resource.Layout.Main);
msgText = FindViewById<TextView> (Resource.Id.msgText);
IsPlayServicesAvailable ();
CreateNotificationChannel();
IsPlayServicesAvailable
在末尾 OnCreate
调用,以便每次应用启动时,Google Play Services 检查都会运行。 调用此方法 CreateNotificationChannel
可确保运行 Android 8 或更高版本的设备存在通知通道。 如果你的应用有一种方法OnResume
,它也应该从中OnResume
调用IsPlayServicesAvailable
。 完全重新生成并运行应用。 如果全部配置正确,应会看到类似于以下屏幕截图的屏幕:
如果未收到此结果,请验证是否已在设备上安装 Google Play Services APK (了解详细信息,请参阅 设置 Google Play Services) 。
此外,请验证是否已将 Xamarin.Google.Play.Services.Base 包添加到 FCMClient 项目,如前所述。
添加实例 ID 接收器
下一步是添加一个服务,用于扩展 FirebaseInstanceIdService
以处理 Firebase 注册令牌的创建、轮换和更新。 FirebaseInstanceIdService
FCM 需要该服务才能将消息发送到设备。 FirebaseInstanceIdService
将服务添加到客户端应用时,应用将自动接收 FCM 消息,并在应用后台时将其显示为通知。
在 Android 清单中声明接收方
编辑 AndroidManifest.xml 并将以下 <receiver>
元素插入到 <application>
节中:
<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>
此 XML 执行以下操作:
声明一个 FirebaseInstanceIdReceiver
实现,该实现为每个应用实例提供 唯一标识符 。 此接收器还会对操作进行身份验证和授权。
声明用于安全地启动服务的内部 FirebaseInstanceIdInternalReceiver
实现。
应用 ID 存储在添加到项目的google-services.json 文件中。 Xamarin.Android Firebase 绑定会将令牌 ${applicationId}
替换为应用 ID;客户端应用不需要其他代码来提供应用 ID。
这是FirebaseInstanceIdReceiver
一FirebaseInstanceId
个WakefulBroadcastReceiver
接收和FirebaseMessaging
事件并将其传递到派生自FirebaseInstanceIdService
的类。
实现 Firebase 实例 ID 服务
将应用程序注册到 FCM 的工作由你提供的自定义 FirebaseInstanceIdService
服务处理。
FirebaseInstanceIdService
执行下列步骤:
使用 实例 ID API 生成安全令牌,授权客户端应用访问 FCM 和应用服务器。 返回时,应用从 FCM 中恢复 注册令牌 。
如果应用服务器需要注册令牌,则会将注册令牌转发到应用服务器。
添加名为 MyFirebaseIIDService.cs 的新文件,并将其模板代码替换为以下内容:
using System;
using Android.App;
using Firebase.Iid;
using Android.Util;
namespace FCMClient
[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);
SendRegistrationToServer(refreshedToken);
void SendRegistrationToServer(string token)
// Add custom implementation, as needed.
此服务实现 OnTokenRefresh
最初创建或更改注册令牌时调用的方法。 OnTokenRefresh
运行时,它会从 FirebaseInstanceId.Instance.Token
FCM) 异步更新的属性 (检索最新令牌。 在此示例中,将记录刷新的令牌,以便在输出窗口中查看它:
var refreshedToken = FirebaseInstanceId.Instance.Token;
Log.Debug(TAG, "Refreshed token: " + refreshedToken);
OnTokenRefresh
不经常调用:在以下情况下,它用于更新令牌:
安装或卸载应用时。
当用户删除应用数据时。
当应用擦除实例 ID 时。
令牌的安全性已泄露时。
根据 Google 的 实例 ID 文档,FCM 实例 ID 服务将请求应用定期刷新其令牌, (通常每隔 6 个月) 一次。
OnTokenRefresh
如果应用程序维护的任何) ,则还调用 SendRegistrationToAppServer
将用户的注册令牌与服务器端帐户相关联 (:
void SendRegistrationToAppServer (string token)
// Add custom implementation here as needed.
由于此实现取决于应用服务器的设计,因此此示例中提供了一个空的方法正文。 如果应用服务器需要 FCM 注册信息,请修改 SendRegistrationToAppServer
以将用户的 FCM 实例 ID 令牌与应用维护的任何服务器端帐户相关联。 (请注意,令牌对客户端应用不透明。)
将令牌发送到应用服务器时, SendRegistrationToAppServer
应保留一个布尔值,以指示是否已将令牌发送到服务器。 如果此布尔值为 false, SendRegistrationToAppServer
请向应用服务器发送令牌,否则,令牌已在上一次调用中发送到应用服务器。 在某些情况下, (如此示例 FCMClient
) ,应用服务器不需要令牌;因此,此示例不需要此方法。
实现客户端应用代码
现在,接收方服务已准备就绪,可以编写客户端应用代码来利用这些服务。 在以下部分中,将向 UI 添加一个按钮来记录注册令牌, (也称为 实例 ID 令牌) ,并且会添加 MainActivity
更多代码,以便从通知启动应用时查看 Intent
信息:
此步骤中添加的代码仅用于演示目的 - 生产客户端应用无需记录注册令牌。 编辑 Resources/layout/Main.axml,并在元素后面TextView
立即添加以下Button
声明:
<Button
android:id="@+id/logTokenButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Log Token" />
在 MainActivity.OnCreate
方法的末尾添加以下代码:
var logTokenButton = FindViewById<Button>(Resource.Id.logTokenButton);
logTokenButton.Click += delegate {
Log.Debug(TAG, "InstanceID token: " + FirebaseInstanceId.Instance.Token);
当点击 “日志令牌 ”按钮时,此代码会将当前令牌记录到输出窗口。
处理通知意向
当用户点击 从 FCMClient 发出的通知时,通知消息随附的任何数据将 Intent
额外提供。 编辑 MainActivity.cs,并在调用IsPlayServicesAvailable
) 之前将以下代码添加到方法顶部OnCreate
(:
if (Intent.Extras != null)
foreach (var key in Intent.Extras.KeySet())
var value = Intent.Extras.GetString(key);
Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
当用户点击通知消息时,将触发应用的启动器 Intent
,因此此代码会将任何随附的数据记录到 Intent
输出窗口中。 如果必须触发其他Intent
通知消息,click_action
则必须将通知消息的字段设置为Intent
该字段, (未click_action
指定启动器Intent
时使用) 。
生成并运行 FCMClient 应用。 将显示 “日志令牌 ”按钮:
点击 “日志令牌 ”按钮。 应在 IDE 输出窗口中显示如下所示的消息:
标有 令牌 的长字符串是将粘贴到 Firebase 控制台中的实例 ID 令牌 , 选择并将此字符串复制到剪贴板。 如果未看到实例 ID 令牌,请将以下行添加到方法顶部 OnCreate
,以验证 google-services.json 是否已正确分析:
Log.Debug(TAG, "google app id: " + GetString(Resource.String.google_app_id));
google_app_id
记录到输出窗口的值应与 google-services.json 中记录的值匹配mobilesdk_app_id
。 Resource.String.google_app_id
处理 google-services.json 时由 msbuild 生成。
登录到 Firebase 控制台,选择项目,单击 “通知”,然后单击“ 发送你的第一条消息” :
在 “撰写消息 ”页上,输入消息文本并选择 “单个设备”。 从 IDE 输出窗口中复制实例 ID 令牌,并将其粘贴到 Firebase 控制台的 FCM 注册令牌 字段中:
在 Android 设备上 (或模拟器) ,通过点击“Android 概述 ”按钮和触摸主屏幕来背景应用。 设备准备就绪后,在 Firebase 控制台中单击 “发送消息 ” :
显示 “审阅消息 ”对话框时,单击“ 发送”。
通知图标应显示在设备 (或模拟器) 的通知区域中:
打开通知图标以查看消息。 通知消息应正好是 Firebase 控制台的消息 文本 字段中键入的内容:
点击通知图标以启动 FCMClient 应用。 Intent
发送到 FCMClient 的额外项列在 IDE 输出窗口中:
在此示例中, 从 键设置为本示例中 41590732
应用 (的 Firebase 项目编号,) , collapse_key 设置为其包名称 (com.xamarin.fcmexample) 。
如果未收到消息,请尝试在设备上删除 FCMClient 应用, (或模拟器) 并重复上述步骤。
如果强制关闭应用,FCM 将停止传递通知。 Android 可防止后台服务广播无意或不必要的启动已停止应用程序的组件。 (有关此行为的详细信息,请参阅 已停止的应用程序上的启动控件。) 因此,每次运行应用并停止调试会话时,都需要手动卸载该应用,这会强制 FCM 生成新令牌,以便继续接收消息。
添加自定义默认通知图标
在前面的示例中,通知图标设置为应用程序图标。 以下 XML 为通知配置自定义默认图标。 Android 显示未显式设置通知图标的所有通知消息的此自定义默认图标。
若要添加自定义默认通知图标,请将图标添加到 Resources/drawable 目录,编辑 AndroidManifest.xml,并将以下 <meta-data>
元素 <application>
插入节:
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
在此示例中,驻留在 Resources/drawable/ic_stat_ic_notification.png 处的通知图标将用作自定义默认通知图标。 如果未在 AndroidManifest.xml 中配置自定义默认图标,并且通知有效负载中未设置任何图标,则 Android 会将应用程序图标用作通知图标 (,如上) 的通知图标屏幕截图所示。
处理主题消息
到目前为止编写的代码处理注册令牌,并将远程通知功能添加到应用。 下一个示例添加代码,用于侦听 主题消息 并将其转发给用户作为远程通知。 主题消息是发送到订阅特定主题的一个或多个设备的 FCM 消息。 有关主题消息的详细信息,请参阅 主题消息传送。
编辑 Resources/layout/Main.axml,并在上一Button
个元素后面立即添加以下Button
声明:
<Button
android:id="@+id/subscribeButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="Subscribe to Notifications" />
此 XML 向布局添加 “订阅通知 ”按钮。
编辑 MainActivity.cs 并将以下代码添加到方法的 OnCreate
末尾:
var subscribeButton = FindViewById<Button>(Resource.Id.subscribeButton);
subscribeButton.Click += delegate {
FirebaseMessaging.Instance.SubscribeToTopic("news");
Log.Debug(TAG, "Subscribed to remote notifications");
此代码在布局中找到“订阅通知”按钮,并将其单击处理程序分配给调用FirebaseMessaging.Instance.SubscribeToTopic
的代码,传入订阅的主题新闻。 当用户点击 “订阅 ”按钮时,应用将订阅 新闻 主题。 在以下部分中,将从 Firebase 控制台通知 GUI 发送 新闻 主题消息。
发送主题消息
卸载应用,重新生成应用,然后再次运行它。 单击“ 订阅通知 ”按钮:
如果应用已成功订阅,则应在 IDE 输出窗口中看到 主题同步成功 :
使用以下步骤发送主题消息:
在 Firebase 控制台中,单击“ 新建消息”。
在 “撰写邮件 ”页上,输入邮件文本并选择 “主题”。
在 “主题 ”下拉菜单中,选择内置主题, 新闻:
在 Android 设备上 (或模拟器) ,通过点击“Android 概述 ”按钮和触摸主屏幕来背景应用。
设备准备就绪后,单击 Firebase 控制台中的 “发送消息 ”。
检查 IDE 输出窗口以查看日志输出中的 /topics/news :
当在输出窗口中看到此消息时,通知图标还应显示在 Android 设备上的通知区域中。 打开通知图标以查看主题消息:
如果未收到消息,请尝试在设备上删除 FCMClient 应用, (或模拟器) 并重复上述步骤。
若要在前台应用中接收通知,必须实现 FirebaseMessagingService
。 接收数据有效负载和发送上游消息也需要此服务。 以下示例演示了如何实现扩展 FirebaseMessagingService
的服务 - 生成的应用能够在前台运行时处理远程通知。
实现 FirebaseMessagingService
该服务 FirebaseMessagingService
负责从 Firebase 接收和处理消息。 每个应用必须对此类型进行子类,并重写 OnMessageReceived
以处理传入消息。 当应用位于前台时, OnMessageReceived
回调将始终处理消息。
应用只有 10 秒的时间来处理传入的 Firebase 云消息。 应使用 Android 作业计划程序 或 Firebase 作业调度程序等库为后台执行花费的时间长的任何工作。
添加名为 MyFirebaseMessagingService.cs 的新文件,并将其模板代码替换为以下内容:
using System;
using Android.App;
using Android.Content;
using Android.Media;
using Android.Util;
using Firebase.Messaging;
namespace FCMClient
[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);
Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
请注意, MESSAGING_EVENT
必须声明意向筛选器,以便将新的 FCM 消息定向到 MyFirebaseMessagingService
:
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
当客户端应用从 FCM 收到消息时,OnMessageReceived
通过调用其GetNotification
方法从传入RemoteMessage
对象中提取消息内容。 接下来,它会记录消息内容,以便可以在 IDE 输出窗口中查看它:
var body = message.GetNotification().Body;
Log.Debug(TAG, "Notification Message Body: " + body);
如果设置 FirebaseMessagingService
断点,调试会话可能会或可能由于 FCM 如何传递消息而命中这些断点。
发送另一条消息
卸载应用,重新生成应用,再次运行它,然后按照以下步骤发送另一条消息:
在 Firebase 控制台中,单击“ 新建消息”。
在 “撰写消息 ”页上,输入消息文本并选择 “单个设备”。
从 IDE 输出窗口中复制令牌字符串,并将其粘贴到 Firebase 控制台的 FCM 注册令牌 字段中,如前所述。
确保应用在前台运行,然后单击 Firebase 控制台中的 SEND MESSAGE :
显示 “审阅消息 ”对话框时,单击“ 发送”。
传入消息记录到 IDE 输出窗口:
添加本地通知发件人
在此剩余示例中,传入的 FCM 消息将转换为在前台运行应用时启动的本地通知。 编辑 MyFirebaseMessageService.cs 并添加以下 using
语句:
using FCMClient;
using System.Collections.Generic;
将以下方法添加到 MyFirebaseMessagingService
:
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());
为了区分此通知与后台通知,此代码使用不同于应用程序图标的图标标记通知。 将文件 ic_stat_ic_notification.png 添加到 Resources/drawable ,并将其包含在 FCMClient 项目中。
该方法 SendNotification
用于 NotificationCompat.Builder
创建通知,并 NotificationManagerCompat
用于启动通知。 通知包含一个 PendingIntent
允许用户打开应用并查看传入 messageBody
的字符串的内容。 有关详细信息 NotificationCompat.Builder
,请参阅 本地通知。
调用 SendNotification
方法末尾 OnMessageReceived
的方法:
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);
由于这些更改,每当应用处于前台时收到通知时, SendNotification
都会运行通知,通知将显示在通知区域中。
当应用位于后台时, 消息的有效负载 将确定消息的处理方式:
通知 - 消息将发送到 系统托盘。 将显示本地通知。 当用户点击通知时,应用将启动。
数据 - 消息将由该消息处理 OnMessageReceived
。
这两者 – 同时包含通知和数据有效负载的消息将传递到系统托盘。 应用启动时,数据有效负载将显示在Extras
Intent
用于启动应用的数据有效负载中。
在此示例中,如果应用处于后台, SendNotification
则消息具有数据有效负载时将运行。 否则,本演练前面说明的后台通知 (将启动) 。
发送最后一条消息
卸载应用,重新生成,再次运行它,然后使用以下步骤发送最后一条消息:
在 Firebase 控制台中,单击“ 新建消息”。
在 “撰写消息 ”页上,输入消息文本并选择 “单个设备”。
从 IDE 输出窗口中复制令牌字符串,并将其粘贴到 Firebase 控制台的 FCM 注册令牌 字段中,如前所述。
确保应用在前台运行,然后单击 Firebase 控制台中的 SEND MESSAGE :
这一次,在输出窗口中记录的消息也打包在新通知中 – 通知图标显示在通知托盘中,而应用在前台运行时:
打开通知时,应会看到从 Firebase 控制台通知 GUI 发送的最后一条消息:
断开与 FCM 的连接
若要取消订阅主题,请对 FirebaseMessaging 类调用 UnsubscribeFromTopic 方法。 例如,若要取消订阅之前订阅的 新闻 主题,可以使用以下处理程序代码将 取消订阅 按钮添加到布局:
var unSubscribeButton = FindViewById<Button>(Resource.Id.unsubscribeButton);
unSubscribeButton.Click += delegate {
FirebaseMessaging.Instance.UnsubscribeFromTopic("news");
Log.Debug(TAG, "Unsubscribed from remote notifications");
若要从 FCM 中注销设备,请通过在 FirebaseInstanceId 类上调用 DeleteInstanceId 方法删除实例 ID。 例如:
FirebaseInstanceId.Instance.DeleteInstanceId();
此方法调用将删除实例 ID 及其关联的数据。 因此,将停止向设备定期发送 FCM 数据。
下面介绍了将 Firebase Cloud Messaging 与 Xamarin.Android 配合使用时可能出现的问题和解决方法。
未初始化 FirebaseApp
在某些情况下,你可能会看到以下错误消息:
Java.Lang.IllegalStateException: Default FirebaseApp is not initialized in this process
Make sure to call FirebaseApp.initializeApp(Context) first.
这是一个已知问题,可以通过清理解决方案并重新生成项目 (生成 > 清理解决方案、 生成 > 重新生成解决方案) 来解决此问题。
本演练详细介绍了在 Xamarin.Android 应用程序中实现 Firebase Cloud Messaging 远程通知的步骤。 本文介绍了如何安装 FCM 通信所需的所需包,并介绍了如何配置 Android 清单以访问 FCM 服务器。 它提供了演示如何检查 Google Play Services 是否存在的示例代码。 它演示了如何实现与 FCM 协商注册令牌的实例 ID 侦听器服务,并介绍了此代码如何在应用背景时创建后台通知。 它介绍了如何订阅主题消息,并提供了消息侦听器服务的示例实现,该服务用于在应用在前台运行时接收和显示远程通知。
FCMNotifications (示例)
Firebase Cloud Messaging
关于 FCM 消息