如何通过 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 设备发送通知?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Azure Devops 将 UWP 包发布到 Windows 应用商店?
如何通过MSDN订阅激活免费提供的Windows Azure
如何通过 Windows Azure(预览版)管理门户设置 ADO.NET Entity Framework 连接字符串?