如何通过 GCM 通过 Windows azure 为特定的 android 设备发送通知?

Posted

技术标签:

【中文标题】如何通过 GCM 通过 Windows azure 为特定的 android 设备发送通知?【英文标题】:How to send a notification for a particular android device by GCM through Windows azure? 【发布时间】:2014-01-06 12:54:54 【问题描述】:

我已通过 GCM 注册了 android 设备,并且设备的注册 ID 已在 Windows azure 中注册,这为该设备提供了另一个唯一 ID。现在我的疑问是如何通过 Windows azure 提供的注册 ID(而不是 GCM 注册 ID)仅向一台设备发送通知?我被推荐到以下链接。http://msdn.microsoft.com/en-us/library/windowsazure/dn223273.aspx

在该链接中指定的 URL 如下所示。在这里,我知道命名空间、通知中心和消息,但我必须在哪里提供由 windows azure 提供的设备的唯一注册 ID,以便向该设备发送通知

https://namespace.servicebus.windows.net/NotificationHub/messages/?api-version=2013-08

我在java中使用过以下代码

String strAzureURL = "https://namespaceName.servicebus.windows.net/hubName/testMessage";

                          String strAzureRegistrationId = "Tag1";

                    String strSharedAccessSignature = "MySharedAccessSignature";
                    String strSharedAccessName = "MySharedAccessName";
                    String strAuthorizationToken = URLDecoder.decode(strSharedAccessName+":"+strSharedAccessSignature,"UTF-8");

                    String strAuthWrapFormat = "WRAP access_token=\""+strAuthorizationToken+"\"";

                    String info = null;
                    HttpClient client = new HttpClient();
                    try 
                        GetMethod method = new GetMethod(strAzureURL);
                        method.setRequestHeader("Authorization", strAuthWrapFormat);

                        method.setRequestHeader("ServiceBusNotification-Tags", strAzureRegistrationId);
                        method.setRequestHeader("ServiceBusNotification-Format", "gcm");
                        method.setRequestHeader("Audience","https://namespaceName.servicebus.windows.net");
                        client.executeMethod(method);
                        info = method.getResponseBodyAsString();
                        System.out.println("Response "+info);
 catch (UnknownHostException e1) 
    e1.printStackTrace();
    throw e1;

现在我收到以下错误。

    Response <Error><Code>401</Code>

<Detail>MissingAudience: The provided token does not specify the 'Audience'..TrackingId:75c1d492-3ddf-4d88-84b7-1c2f07d9623b_G5,TimeStamp:1/8/2014 9:57:39 AM</Detail>

</Error>

感谢您的帮助!

【问题讨论】:

【参考方案1】:

看看这个页面:http://msdn.microsoft.com/en-us/library/dn282661.aspx。它包括向 GCM 和 Notification Hubs 注册客户端应用程序的所有步骤。从客户端,它注册到通知中心并将它的“MyTag”设置为标签。您要做的是使用设置为注册 ID 的标签进行注册。所以从客户端:

hub.register(registrationId, registrationId, <Optional Other Tags>);

然后,无论您在何处触发推送通知,您都可以将要作为 ServiceBusNotification-Tags 传递到的注册 ID 传递(如您提供的 REST API 链接所示)。这将导致通知中心仅向已注册该标签的设备发送消息。

【讨论】:

非常感谢。Link 有 C# 应用程序的服务器代码。但我想从 java 应用程序发送特定设备的通知。怎么做?我的疑问在于java的服务器端代码。 通知中心没有 Java 端 SDK,因此您必须使用 Java 调用通知中心的 REST API。根据您提供的链接,向端点发送 POST,然后在 ServiceBusNotification-Tags 中,发送您要发送到的设备的注册 ID。 我使用过 REST 调用,但我不知道在 Windows azure URL 中将特定注册 ID 传递到何处。你能检查更新的问题吗? 查看您引用的 URL 中的文档。它包括 REQUEST HEADERS 部分,其中包括 ServiceBusNotification-Tags。您可以将注册 ID 作为标签传入。您需要使用设备的注册 ID 作为标签向集线器注册(正如我在上面的答案中提到的)。一旦您将 reg ID 注册为标签,对该标签的任何推送都会向下推送到该设备。 我尝试使用标签,但现在我收到一些与“观众”相关的错误。请您检查更新的问题并指导我。谢谢

以上是关于如何通过 GCM 通过 Windows azure 为特定的 android 设备发送通知?的主要内容,如果未能解决你的问题,请参考以下文章

windows azure 通知中心标签

Azure通知中心 - 从GCM迁移到FCM

如何通过 Azure Devops 将 UWP 包发布到 Windows 应用商店?

如何通过MSDN订阅激活免费提供的Windows Azure

如何通过 Windows Azure(预览版)管理门户设置 ADO.NET Entity Framework 连接字符串?

如何通过phonegap通过GCM服务器获取推送通知