我正在使用Azure Notification Hub和Xamarin Android。它在正常情况下工作正常,我可以在我的注册标签上获得推送通知,但是在更新标签或重新注册集线器时,它会创建重复的注册。注册后删除的标签仍然会收到通知。以下是相同的示例代码段
try
{
Hub.UnregisterAll(registrationId);
}
catch (Exception ex)
{
}
var tags = getting active tags
try
{
var hubregistration = Hub.Register(registrationId, tags);
}
catch (Exception ex)
{
}
AFAIK,GCM发布的Registration Token
(registrationId)用于标识客户端应用程序,从GCM重新注册而不从GCM注销时可能相同。根据您的代码,您正在使用注册模型。 Hub.UnregisterAll(registrationId)
会尝试从您的azure通知中心使用相同的注册令牌(pnsHandle)取消注册注册。
我建议你在调用UnregisterAll
时捕获异常。此外,您可以利用Visual Studio中的服务器资源管理器,选择您的通知中心,然后按如下方式查看和管理集线器中的所有注册以缩小此问题:
注意:您可以查看您的设备注册,并尝试查找是否可以检索相同的客户端应用程序的重复注册(相同的PNS标识符(Registration Token
),不同的标签/ Azure注册ID或不同的PNS标识符(Registration Token
)等) 。
如果您为同一客户端应用程序找到不同的PNS标识符(Registration Token
),我认为您的客户端应用程序需要存储以前的Registration Token
并与最新的Registration Token
进行比较,如果不匹配则取消注册所有旧的Registration Token
,然后注册新的Registration Token
与您的通知中心。
此外,安装模型可以避免重复注册。有关更多详细信息,请参阅Registration management。
这是我从azure hub注册和取消注册的工作方法
void unregister ()
{
try {
NotificationHub hub = new NotificationHub (Constants.NotificationHubName, Constants.ListenConnectionString, this);
hub.UnregisterAll (FirebaseInstanceId.Instance.Token);
} catch (Exception ex) {
}
}
void register ()
{
try {
NotificationHub hub = new NotificationHub (Constants.NotificationHubName, Constants.ListenConnectionString, this);
var tags = new List<string> () { ... };
hub.Register (FirebaseInstanceId.Instance.Token, tags.ToArray ());
} catch (Exception ex) {
}
}