Push(APNS)后通知中心设备消失

时间:2016-11-12 10:37:06

标签: ios azure apple-push-notifications xamarin.forms azure-notificationhub

我们已使用生产APNS证书设置了Azure通知中心,并在生产模式下配置了APNS。 我们将测试设备(使用TestFlight / Production构建和证书)注册到APNS,然后注册到带有标记dealer-1的ANH。当我们直接使用APNS时,我们可以使用我们的生产证书和注册的设备ID成功发送通知,但是,当我们使用“测试发送”时我们得到了一个成功的发送'到1个设备(或者我们注册的很多)。未收到通知。如果我们然后运行“测试发送”#39;再次,是0设备发送到。

在日志中,我们会看到' APNS错误'每个设备,每次测试发送。我看不出有什么方法可以查看错误实际上是什么,所以这是一个绝对没用的指标。​​

我已经完成了所有的问题排查步骤,并多次确认所有内容都已设置在' Production'。

在回顾了其他问题后,答案如下:

  • ..注册沙盒证书,然后将其更改为生产。不幸的是,我们从头开始创建这个集线器作为生产,试图解决这个潜在的问题。
  • ..根据生产证书注册沙箱设备(以及令牌)。不幸的是,我已经密切控制了这一点,并确保我们只针对ANH注册TestFlight构建(因此生产)。
  • ..上传错误的证书。我已经使用Push Notification Tester确认,如上所述,证书是正确的(指纹确认,重新上传等),并通过生产APNS端点发送到设备。

资源名称为:eight-technology / react-push-notification-hub

应用内注册流程如下:

  • 设备注册推送通知
  • 注册事件在iOS Project(AppDelegate事件)中处理..

    public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
    {
        //base.RegisteredForRemoteNotifications(application, deviceToken);
        App.ConfigurePushNotifications(deviceToken.ToString());
    }
    
  • ConfigurePushNotifications位于XF共享项目中..

    public static void ConfigurePushNotifications(string deviceToken)
    {
        var azureComm = DependencyService.Get<Interop.IAzureCommunication>();
        azureComm.RegisterForPushTags(
            "sb://eight-technology.servicebus.windows.net/",
            ".. token ..",
            "react-push-notification-hub",
            deviceToken,
            StateManager.SelectedNodes.Select(m => "dealer-" + m).ToArray());
    }
    
  • 实现几乎与提供的示例代码(包含在iOS项目中)

    相同
    public class AzureCommunication : DealerwebReact.Interop.IAzureCommunication
    {
        public void RegisterForPushTags(string url, string key, string hubName, string deviceToken, string[] tags)
        {
            var cs = SBConnectionString.CreateListenAccess(new NSUrl(url), key);
    
            var hub = new SBNotificationHub(cs, hubName);
            hub.RegisterNativeAsync(deviceToken, new NSSet(tags), err =>
            {
                if (err != null)
                    Console.WriteLine("Error: " + err.Description);
                else
                    Console.WriteLine("Success");
            });
        }
    }
    

3 个答案:

答案 0 :(得分:3)

经过几天令人沮丧之后,感谢Nikita G.和hvaughan3的帮助,我终于找到了问题的根本原因。正如预期的那样,实际概述的任何问题都没有,而是与我们处理Xamarin Forms注册的跨平台方面的方式有关。

也就是说,我们将令牌作为string存储在一个类中。 NSData中作为iOS设备注册的一部分收到的RegisteredForRemoteNotifications具有与发送到ANH不兼容的ToString()方法。此外,Azure库中的RegisterNativeAsync方法需要NSData,我认为Xamarin可以在没有警告或错误的情况下将字符串变形,因此不知道这两者有些不兼容。

基本上,为了维护跨平台功能,我们现在只需将令牌作为object传递,并在我们的推送配置方法的特定于平台的实现中执行转换回原始类型。

我们的注册方法现在看起来像这样,请注意明确使用NSData类型,以便在通过Xamarin Forms层时保持不变:

    public void RegisterForPushTags(string url, string key, string hubName, object deviceToken, string[] tags)
    {
        var cs = SBConnectionString.CreateListenAccess(new NSUrl(url), key);

        var hub = new SBNotificationHub(cs, hubName);
        hub.RegisterNativeAsync((NSData)deviceToken, new NSSet(tags), err =>
        {
            if (err != null)
                Console.WriteLine("Error: " + err.Description);
            else
                Console.WriteLine("Success");
        });
    }

答案 1 :(得分:1)

您使用this the guide进行问题排查?

在您注册设备之前,您是否有可能以某种方式对APN句柄进行任何字符串(或任何其他类型的)处理? &#39; APNS错误&#39;你看到似乎是无效的令牌大小&#39;。由于我不知道您的代码中发生了什么,因此很难确定它究竟是什么,但可能对您有帮助。

答案 2 :(得分:1)

当设备正确注册时,类似的事情发生在我身上,但是一旦发送通知,设备就会从列表中消失。事实证明,在通知中心内配置的APNS证书未正确连接到应用程序ID和/或应用程序未使用正确的配置文件进行签名时,问题一直存在。