Ios 推送后通知中心设备消失(APNS)

Ios 推送后通知中心设备消失(APNS),ios,azure,apple-push-notifications,xamarin.forms,azure-notificationhub,Ios,Azure,Apple Push Notifications,Xamarin.forms,Azure Notificationhub,我们使用生产APNS证书设置了Azure通知中心,并在生产模式下配置了APNS。 我们将我们的测试设备(使用TestFlight/Production build和certificate)注册到APNS,然后使用标签dealer-1注册到ANH。直接使用APN时,我们可以使用我们的生产证书和注册设备ID成功发送通知,但是,当我们使用“测试发送”时,我们将“成功发送”到1台设备(或无论我们注册了多少台设备)。没有收到通知。如果我们随后再次运行“测试发送”,则需要发送到0个设备 在日志中,我们可以看

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

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

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

回顾其他问题后,答案大致如下:

  • 。。注册沙盒证书,然后将其更改为生产证书。不幸的是,为了解决这个潜在问题,我们从零开始创建了这个中心作为生产
  • 。。根据生产证书注册沙箱设备(以及令牌)。不幸的是,我已经严格控制了这一点,并确保我们只针对ANH注册测试飞行构建(因此是生产)
  • 。。上载错误的证书。如上所述,我已与推送通知测试仪确认证书正确(指纹确认、重新上传等),并可通过生产APNS端点发送到设备
资源名称为:八项技术/react推送通知中心

应用内注册流程如下:

  • 推送通知的设备寄存器
  • 注册事件在iOS项目中处理(AppDelegate事件)

  • 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());
    }
    
您是否用于故障排除


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

当设备正确注册时,我也遇到了类似的情况,但一旦发送通知,这些设备就会从列表中消失。在通知中心内配置的APNS证书未正确连接到应用程序ID和/或应用程序未使用正确的配置文件进行签名,这始终是一个问题。

令人沮丧的几天后,多亏了尼基塔·G.和哈瓦根的帮助,我终于找到了问题的根源。正如预期的那样,这不是实际概述的任何问题,而是与我们处理Xamarin表单注册的跨平台方面的方式有关

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

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

我们的注册方法现在看起来是这样的,请注意显式使用了
NSData
类型,以便在通过Xamarin表单层时保持不变:

    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");
        });
    }

谢谢尼基塔-那是我玩过的向导是的。我将用一些代码更新我的帖子,但我根本没有操作APN令牌,它将作为NSString直接传递给您的类。当我记录它时,它的格式是
,我认为这是正确的,因为我可以在APNS测试仪中使用它。您是否需要更改它?提供了代码-在注册时非常简单。任何想法都将不胜感激。示例设备令牌是:
@RudiVisser直到现在还没有看到您的问题。实际上,我去掉了小于和大于字符以及任何类似的空格:
deviceToken.ToString().Replace(“,string.Empty”).Replace(“,string.Empty)是的,正如@hvaughan3所说,我非常确定除了十六进制数字之外不应该有任何空格或字符。你能试试没有这些,让我们知道它是否有效吗?非常成功!谢谢@NikitaG。我已经投了你一票,但我会写一个新的答案,更详细地描述这个问题。我希望你们考虑一下,给我们提供实际错误,而不仅仅是统计数据,反复看到“无效设备令牌”可能会更快地解决此问题:)谢谢-我想这可能也是一个类似的问题,但是证书不会直接与APNS一起工作?@Rudiviser Right,你问题的那一部分我不确定。我从未尝试过直接通过APN发送通知。但愿我能在这方面多帮点忙。你试过下载和使用吗?我知道,就注册设备而言,它显示的信息比Azure站点多一些。最近没有使用过它,所以我不能说它是否会直接帮助您的情况。我尝试过,但该应用程序不起作用,但在VS中查看注册的设备起了作用,并显示了使用我发送的正确令牌和标记注册的设备。整体
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");
        });
    }
}
    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");
        });
    }