如何排除故障:Android 客户端未收到 Azure 通知中心消息,但确实收到了从 Firebase 控制台发送的测试消息

How to troubleshoot: Android client not receiving Azure Notifications Hub messages, but does receive test messages sent from Firebase Console

我正在尝试设置 Xamarin.Forms Android 客户端应用程序以从我的 Azure C# 后端接收推送通知。当我使用 SendGcmNativeNotificationAsync(...) 从后端发送消息时,我的 GCMListenerService.OnMessageReceived() 方法没有被触发,尽管结果是 return 成功/"Enqueued"。我已成功收到来自同一服务器事件的 windows 通知。

我的 GCMListenerService.OnMessageReceived() 方法在我从 Firebase 控制台发送测试消息时触发,但在我从 Azure 控制台 -> 通知中心区域发送测试消息时未触发(门户显示已成功发送)。

我可以确认我的客户收到了来自 Firebase 的注册令牌并且 Google Play 服务可用。我正在物理设备上测试,而不是模拟器。

对于解决此问题的后续步骤有什么建议吗?不确定接下来要尝试什么。

我在 GCMListenerService.OnMessageReceived() 中使用 Log.Debug 语句来确定是否已收到消息。

感谢您的帮助!

我成功了。我没有意识到 Android 应用程序需要在通知中心注册;回想起来这很愚蠢。

通常这是由所有演练使用的 Xamarin 组件 GoogleCloudMessagingClient 处理的,但我不想使用该组件,因为我正在学习并想查看样板代码。

对于采用这种方法的任何其他人,以下是我需要添加的内容(这不是要使用的复制粘贴代码,只是演示我缺少的 link):

var cs = ConnectionString.CreateUsingSharedAccessKeyWithListenAccess(
      new Java.Net.URI("sb://YOUR-SERVICE-BUS.servicebus.windows.net/"),
      "YOUR-KEY"); // you can get these two values from Azure Console -> Your NotificationHub -> Settings -> Access Policies

    var hubName = "your-hub-name"; //the name of your Notification Hub resource on Azure

    hub = new NotificationHub(hubName, cs, context); //create the hub (this class is in WindowsAzure.Messaging namespace, which is accessible after you add the Azure Messaging component to your android project)

    hub.Register(registrationId, "YOUR_TAG"); //tag can be anything (alphanumeric, -, _, no spaces)
    //hub.Register registers this device and its registrationId (from cloud messaging) to the Notifications Hub.

根据所有官方演练,这是您需要做的所有其他事情的补充。我会在这里列出它们,因为有人可能会发现它有帮助。

步骤列表,Google 详情

Firebase:

  1. 创建新项目 + 设置推送通知

蔚蓝:

  1. 创建通知中心
  2. 从 Firebase 项目设置中为通知中心提供服务器密钥

Android 客户项目:

  1. 通过 NuGet 添加 Xamarin.GooglePlayServices.GCM
  2. 添加 Azure Messaging 组件(右键单击项目资源管理器中的组件,单击 "Get More Components")
  3. 将以下权限添加到 AndroidManifest.xml
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<permission android:name="[YOUR PACKAGE NAME HERE].permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="[YOUR PACKAGE NAME HERE].permission.C2D_MESSAGE" />
  1. MainActivity 中,检查 Google Play 服务是否可用。
  2. 如果是,请创建一个 RegistrationIntentService 服务以向 Firebase 云消息传递注册客户端设备
  3. MainActivityonCreate()方法中启动此服务
  4. 实现一个InstanceIDListenerService服务(如果app registrationID改变,Google很容易获得详细信息)
  5. 实施 GcmListenerService 服务以接收和响应云消息(Google 轻松了解详细信息)
  6. AndroidManifest.xml 中声明您的三个服务,例如 GcmListenerService 如下(Google 轻松获取更多详细信息):
<application android:label="YOUR_APP_NAME">
    <receiver android:name="com.google.android.gms.gcm.GcmReceiver" 
              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="[YOUR APP PACKAGE NAME HERE]" />
        </intent-filter>
    </receiver>

  </application>

如果使用 Xamarin,您可以简单地使用 Service 属性而不是编辑 AndroidManifest.xml,这将为您将所需的声明添加到清单中,例如

[Service(Exported = false)]
class RegistrationIntentService : IntentService
{
  1. 创建 NotificationHub 实例并注册为设备返回的唯一令牌/注册 ID Firebase(根据此 post 开头的代码,例如我丢失的 link) .