ios - 通知中心设备在推送后消失 (APNS)

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

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

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

我已完成所有故障排除步骤,并多次确认所有内容均已在“生产”中设置。

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

  • .. 注册沙箱证书,然后将其更改为生产证书。不幸的是,我们从头开始创建了这个中心作为生产,试图解决这个潜在问题。
  • .. 根据生产证书注册沙箱设备(以及 token )。不幸的是,我已经严格控制了这一点,并确保我们只针对 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");
            });
        }
    }
    

最佳答案

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

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

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

我们的注册方法现在看起来像这样,请注意显式使用 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");
        });
    }

关于ios - 通知中心设备在推送后消失 (APNS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561972/

相关文章:

objective-c - 405 不允许的方法

ios - actionSheet :didDismissWithButtonIndex: is deprecated in iOS 8. 3. 我现在必须使用的新方法是什么?

Azure 中的 Spring Boot - 请求 header 中的客户端证书

c# - 域名无效 Azure Active Directory 问题和迁移到 Microsoft Graph C# 应用程序

azure - 在 Azure 表存储中创建复合分区键

ios - 限制 iOS 远程通知的数量

ios - 信标是否像地理围栏一样工作并且具有相同的 20 个限制?

ios - 静默通知未进入应用程序未运行状态?

ios - 静态库中的全局常量在运行时为 nil

ios - 创建带有文本和十字符号的动态标签