如何排除故障: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:
- 创建新项目 + 设置推送通知
蔚蓝:
- 创建通知中心
- 从 Firebase 项目设置中为通知中心提供服务器密钥
Android 客户项目:
- 通过 NuGet 添加 Xamarin.GooglePlayServices.GCM
- 添加 Azure Messaging 组件(右键单击项目资源管理器中的组件,单击 "Get More Components")
- 将以下权限添加到
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" />
- 在
MainActivity
中,检查 Google Play 服务是否可用。
- 如果是,请创建一个
RegistrationIntentService
服务以向 Firebase 云消息传递注册客户端设备
- 在
MainActivity
onCreate()
方法中启动此服务
- 实现一个
InstanceIDListenerService
服务(如果app registrationID改变,Google很容易获得详细信息)
- 实施
GcmListenerService
服务以接收和响应云消息(Google 轻松了解详细信息)
- 在
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
{
- 创建
NotificationHub
实例并注册为设备返回的唯一令牌/注册 ID Firebase(根据此 post 开头的代码,例如我丢失的 link) .
我正在尝试设置 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:
- 创建新项目 + 设置推送通知
蔚蓝:
- 创建通知中心
- 从 Firebase 项目设置中为通知中心提供服务器密钥
Android 客户项目:
- 通过 NuGet 添加 Xamarin.GooglePlayServices.GCM
- 添加 Azure Messaging 组件(右键单击项目资源管理器中的组件,单击 "Get More Components")
- 将以下权限添加到
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" />
- 在
MainActivity
中,检查 Google Play 服务是否可用。 - 如果是,请创建一个
RegistrationIntentService
服务以向 Firebase 云消息传递注册客户端设备 - 在
MainActivity
onCreate()
方法中启动此服务 - 实现一个
InstanceIDListenerService
服务(如果app registrationID改变,Google很容易获得详细信息) - 实施
GcmListenerService
服务以接收和响应云消息(Google 轻松了解详细信息) - 在
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
{
- 创建
NotificationHub
实例并注册为设备返回的唯一令牌/注册 ID Firebase(根据此 post 开头的代码,例如我丢失的 link) .