Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向已注册的Android设备发送推送通知时出现PNS错误_Android_Azure_Azure Notificationhub - Fatal编程技术网

向已注册的Android设备发送推送通知时出现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

我正在设置一项服务,使用Azure通知中心向我们的应用程序发送推送通知。注册android设备工作正常(在VS 2015 Azure工具中正确显示),但当我尝试通过Azure门户或VS 2015测试发送工具发送测试帖子时,我收到错误“注册的推送通知系统句柄无效”,注册被删除。我知道,当通知中心收到错误时,它会删除注册,以便该部分有意义。我找不到任何关于PNS无效原因的信息。我的注册码是:

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进行比较
  • 如果上一步中的注册ID相等,请确保已将正确的GCM API密钥上载到通知中心
  • 如果通知中心中的GCM凭据正确,则尝试使用一些第三方工具(例如cURL和命令行)向您的设备发送通知,如Google在此处建议的-。确保使用在通知中心中配置的相同API密钥和上载到通知中心的注册id
  • 如果您能够使用第三方工具成功地向设备发送通知,请将命名空间和通知中心名称发送到nhubsupport@microsoft.com我来看看

  • 谢谢你的回复!在步骤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);