向已注册的Android设备发送推送通知时出现PNS错误
我正在设置一项服务,使用Azure通知中心向我们的应用程序发送推送通知。注册android设备工作正常(在VS 2015 Azure工具中正确显示),但当我尝试通过Azure门户或VS 2015测试发送工具发送测试帖子时,我收到错误“注册的推送通知系统句柄无效”,注册被删除。我知道,当通知中心收到错误时,它会删除注册,以便该部分有意义。我找不到任何关于PNS无效原因的信息。我的注册码是:向已注册的Android设备发送推送通知时出现PNS错误,android,azure,azure-notificationhub,Android,Azure,Azure Notificationhub,我正在设置一项服务,使用Azure通知中心向我们的应用程序发送推送通知。注册android设备工作正常(在VS 2015 Azure工具中正确显示),但当我尝试通过Azure门户或VS 2015测试发送工具发送测试帖子时,我收到错误“注册的推送通知系统句柄无效”,注册被删除。我知道,当通知中心收到错误时,它会删除注册,以便该部分有意义。我找不到任何关于PNS无效原因的信息。我的注册码是: public class PushRegObject { public string Platfor
public class PushRegObject
{
public string Platform { get; set; }
public string Handle { get; set; }
public string[] Tags { get; set; }
}
public async static Task<ObjectResultObject<string>> RegisterDevice(PushRegObject reg)
{
string newRegistrationID = null;
var hub = NotificationHubClient.CreateClientFromConnectionString(_connectionstring_, _name_);
if (reg.Handle != null)
{
// Get the Registration ID
var registrations = await hub.GetRegistrationsByChannelAsync(reg.Handle, 100);
foreach(var registration in registrations)
{
if (newRegistrationID == null)
newRegistrationID = registration.RegistrationId;
else
await hub.DeleteRegistrationAsync(registration);
}
if (newRegistrationID == null)
newRegistrationID = await hub.CreateRegistrationIdAsync();
// Register the Device
RegistrationDescription regObj = null;
switch (reg.Platform)
{
case "android":
var regDesc = await hub.CreateGcmNativeRegistrationAsync(newRegistrationID);
return new ObjectResultObject<string>(true, null) { Object = regDesc.GcmRegistrationId };
case "ios":
regObj = new AppleRegistrationDescription(reg.Handle);
break;
default:
return new ObjectResultObject<string>(false, "Unknown device type");
}
}
return new ObjectResultObject<string>(true, null) { Object = newRegistrationID };
}
杰森,我叫德米特里,在通知中心团队工作。以下是帮助我们解决此问题的几个步骤
NotificationHubClient.getAllRegistrationAsync(100)
从通知中心获取所有注册,从测试android设备中查找注册,并将此注册的GCMRRegistrationID与设备从GCM接收的实际注册id进行比较谢谢你的回复!在步骤1中,我如何从返回的注册列表中识别我的设备?我唯一需要匹配的是注册ID,这似乎是您接下来建议比较的。正确,您可以使用RegistrationId进行匹配。在您的示例中,使用以下代码获得新注册的注册id
newRegistrationID=wait hub.CreateRegistrationIdAsync()代码>。您需要从NotificationHubClient.GetAllRegistrationAsync()
返回的集合中查找具有相同注册id的注册,并将设备上获得的GCM注册id与此注册中的GCM注册id进行比较。要从RegistrationDescription中获取GCM注册id,您需要首先将其强制转换为GCMRRegistrationDescription。嗯,我从GCM接收的令牌的格式与VS中显示的注册id完全不同。我的令牌如下所示“f4tj7SohUls:APA91bElcRByfB4bzxuLI-8ZmSSGPwxvIXIfGZwLaVrRCzGNeINGxuGSaKObfPZRhGCGCJWDdBh-CSwTnSkaS4ExBBkp_rjHsshJGvxF0eq1gfNWHcTQx5-LTJAE6FNXSABNNTUEWW”,注册ID看起来像“66542545190462901-5384268793895935544-1”“。如果这意味着什么,我正在使用phonegap插件为Cordova推送插件来获取令牌。第一个字母数字字符串-它是一个GCM注册ID,设备从Google收到它。第二个数字字符串-是通知中心设备注册的内部标识符,设备从Hotification Hub后端接收到它,应用程序使用它在通知中心中创建新的设备注册。这个字母数字字符串看起来不错,所以我认为您可以跳过步骤1,执行步骤2。我认为这与术语“注册id”有混淆。Notification Hub使用字符串标识设备注册,该字符串称为注册ID。每个设备注册包含从相应的推送通知系统(PNS)-WNS(Microsoft)、GCM(Google)、APNS(Apple)等接收的设备句柄。每个PNS都有自己的设备句柄名称:WNS称之为通道URI,GCM-注册ID,APNS-设备令牌。现在您可以明白为什么很容易混淆了——Notuffication Hub和GCM的标识符被称为相同的注册ID。
var regDesc = await hub.CreateGcmNativeRegistrationAsync(reg.Handle);