【问题标题】:Notification Hub Devices disappearing after Push (APNS)推送后通知中心设备消失 (APNS)
【发布时间】:2017-03-26 12:14:25
【问题描述】:

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

在日志中,我们看到每个设备的“APNS 错误”,每个测试发送。我看不到任何方法可以查看实际的错误,所以这是一个绝对无用的指标。​​

我已经完成了所有故障排除步骤,并多次确认一切都已在“生产”中设置。

查看其他问题后,答案大致如下:

  • .. 注册沙盒证书,然后将其更改为生产。不幸的是,我们从头开始创建了这个中心作为生产中心,试图解决这个潜在的问题。
  • .. 根据生产证书注册沙盒设备(以及令牌)。不幸的是,我对此进行了严格控制,并确保我们只针对 ANH 注册 TestFlight 构建(因此是生产)。
  • .. 上传错误的证书。如上所述,我已通过推送通知测试器确认证书是正确的(指纹确认、重新上传等),并且可以通过生产 APNS 端点发送到设备。

资源名称为:八技术/react-push-notification-hub

应用内注册流程如下:

  • 推送通知的设备注册
  • 在 iOS 项目中处理注册事件(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");
            });
        }
    }
    

【问题讨论】:

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


    【解决方案1】:

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

    也就是说,我们将令牌作为string 存储在一个类中。在RegisteredForRemoteNotifications 中作为iOS 设备注册的一部分接收的NSData 具有与发送到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");
            });
        }
    

    【讨论】:

      【解决方案2】:

      你是用this the guide来排查问题的吗?

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

      【讨论】:

      • 谢谢 Nikita - 那是我玩的指南,是的。我将用一些代码更新我的帖子,但我根本没有操作 APN 令牌,它作为 NSString 直接传递给你的类。当我记录它时,它的格式是&lt;... ... ...&gt;,我认为这是正确的,因为我可以在 APNS 测试器中使用它。你需要改变它吗?
      • 提供的代码 - 在注册方面相当简单。任何想法将不胜感激。示例设备令牌是:&lt;97e0614c 3c18b3d7 a8d5274b ca7037dc 3e00e703 635d5172 3c755d9c 8616f375&gt;
      • @RudiVisser 直到现在才看到你的问题。实际上,我确实去掉了小于和大于字符以及任何空格,例如:deviceToken.ToString().Replace("&lt;", string.Empty).Replace("&gt;", string.Empty).Replace(" ", string.Empty);
      • 是的,正如@hvaughan3 所说,我很确定除了十六进制数字之外不应该有任何空格或字符。你能不试试这些,让我们知道它是否有效吗?
      • 大成功!谢谢@NikitaG。我已经投票给你了,但会写一个新的答案来更详细地描述这个问题。我希望你们考虑一下,给我们实际的错误,而不仅仅是一段时间的统计数据,反复看到“无效的设备令牌”可能会更快地解决这个问题:)
      【解决方案3】:

      当设备正确注册时,我也发生了类似的事情,但一旦发送通知,设备就会从列表中消失。事实证明,通知中心内配置的 APNS 证书没有正确连接到应用 ID 和/或应用没有使用正确的配置文件进行签名。

      【讨论】:

      • 谢谢 - 我想这也可能是一个类似的问题,但是证书不能直接与 APNS 一起使用?
      • @RudiVisser 对,我不确定你的那部分问题。我从未尝试过直接通过 APNS 发送通知。希望我能在这方面更有帮助。你试过下载和使用Service Bus Explorer吗?我知道它在注册设备方面显示的信息比 Azure 网站多一点。最近没有使用它,所以我不能说它是否会直接帮助你的情况。
      • 我试过了,但应用程序没有工作,但在 VS 中查看注册设备工作并显示使用我发送的正确令牌和标签注册的设备。整件事很奇怪,非常令人沮丧:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      相关资源
      最近更新 更多