我使用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注入为第一个标记。
使用安装方法时这只是一个限制,还是一个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 。
答案 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.
}];
此外,您可以尝试阅读您的安装并检查您的代码以缩小此问题。