$ InstallationId标记

时间:2017-10-17 10:27:41

标签: javascript azure-mobile-services azure-notificationhub

我使用azure-mobile-apps-node通过GCM注册和发送推送通知。我使用push.patchInstallation注册通知客户端,如下所示:

var updateOperation = [{
    'op': 'replace',
    'Path': '/tags',
    'Value': tags.join()
}];

push.patchInstallation(installationId, updateOperation, function (error, res) { /*...*/ };

它运作良好,查看Notification Hub注册,我看到了

<GcmRegistrationDescription xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <ETag>13</ETag>
    <ExpirationTime>9999-12-31T23:59:59.9999999Z</ExpirationTime>
    <RegistrationId>1234568266548022282-123456473823493176-1</RegistrationId>
    <Tags>$InstallationId:{SOME_GUID},location_1,location_2,location_3,userId:myaccount@domain.com</Tags>
    <GcmRegistrationId>SOME_ID</GcmRegistrationId>
</GcmRegistrationDescription>

但是,如果我尝试使用标记&#34; location_N&#34;来推送通知,则它永远不会有效。还尝试了多个已注册到特定location_N的设备,但没有一个设备获得推送更新。

我已经确定这是由于 $ InstallationId:{SOME_GUID} ,azureMobile应用程序patchInstallation注入为第一个标记。

  • 如果我使用REST API并将注册标签修改为location_N,并将push发送到该标签,则可以正常工作。
  • 如果我发送推送标记 $ InstallationId:{SOME_GUID} ,则推送到该特定设备。
  • 如果我使用标记 $ InstallationId:{SOME_GUID} || location_N ,只有具有安装ID的设备才会获得推送通知。

使用安装方法时这只是一个限制,还是一个bug,或者我完全误解了什么?

编辑19.10.2017: 我修改了我的代码以使用注册模型,即

notificationHubService.gcm.createOrUpdateNativeRegistration(registrationId, installation.pushChannel, tags.join(), function(error, res) { /*...*/ }

没有将$ InstallationId注入标记,而是使用相同的GcmRegistrationId创建两个注册,但使用不同的标记,一个使用$ InstallationId

<RegistrationId>REGID1</RegistrationId>
<Tags>$InstallationId:{SOMEGUID},_UserId:sid:SOMESID</Tags>
<GcmRegistrationId>GCMREGID</GcmRegistrationId>

和另一个只有我在 createOrUpdateNativeRegistration 中定义的标签

<RegistrationId>REGID2</RegistrationId>
<Tags>location_1,location_2,location_3</Tags>
<GcmRegistrationId>GCMREGID</GcmRegistrationId>

有了这个,我能够使用location_N标签(以及使用$ InstallationId的特定设备)向我的测试设备发送推送消息,因此两个注册都有效。我不知道为什么它会创建两个注册,因为我在任何时候都没有调用 notificationHubService.createRegistrationId ,只需单击一下 createOrUpdateNativeRegistration

2 个答案:

答案 0 :(得分:0)

这是一个有效的方案。您应该能够使用location_N标记推送通知。你可以尝试测试发送&#39;在portal.azure.com中验证是否已选择设备进行推送通知?

答案 1 :(得分:0)

根据您的说明,您使用的是安装模型,系统标记$InstallationId:[installationId]会随着您的安装自动添加,您可以发送到此标记以定位特定设备。

在您的代码中,您使用JSON-Patch standard更新注册时的代码。您通过tags.join()将标记替换为单个字符串标记。

要为您的安装替换多个代码,您需要按如下方式指定updateOperation

var updateOperation = [{
    'op': 'replace',
    'Path': '/tags',
    'Value': tags //An array of tags.
}];

此外,您可以尝试阅读您的安装并检查您的代码以缩小此问题。