2

我们使用我们的生产APNS证书设置了Azure通知集线器,并在生产模式下配置了APNS。 我们将我们的测试设备(使用TestFlight/Production构建和证书)注册到APNS,然后使用标签dealer-1注册到ANH。当我们直接使用APNS时,我们可以使用我们的生产证书和注册设备ID发送通知,但是当我们使用'测试发送'时,我们会向1台设备(或我们注册的许多设备)发送'成功发送'。通知未收到。如果我们再次运行'测试发送',则发送0个设备。通知集线器设备在推送(APNS)后消失

在日志中,我们看到每个设备的“APNS错误”,每次发送测试。我看不出有什么办法可以查看错误的实际情况,所以这是绝对无用的指标。

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

在审查其他问题,答案一直沿着线:

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

资源名称是:八技术/反应推通知业务的集线器

在应用内的注册过程如下:

  • 推送通知设备寄存器
  • 注册事件在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"); 
         }); 
        } 
    } 
    

回答

2

经过几天的沮丧,并感谢Nikita G.和hvaughan3的帮助,我终于找到了我的问题的根源。正如预期的那样,这不是实际上列出的任何问题,而是与我们处理Xamarin Forms注册跨平台方面的方式有关。

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

基本上,为了保持跨平台功能,我们现在简单地将令牌作为object传递,并在我们的push配置方法的特定于平台的实现中执行转换回原始类型。

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

this the guide您使用排除故障?

在注册设备之前,您是否有机会在APN手柄上进行任何字符串(或任何其他类型的)处理?你看到的'APNS错误'似乎是'无效的标记大小'。由于我不知道代码中发生了什么,因此很难说明它究竟会发生什么,但可能会对您有所帮助。

+0

感谢尼基塔 - 这是我合作过有关指导是。我会用一些代码更新我的帖子,但我根本不操纵APN令牌,它直接作为NSString传递给你的类。当我登录时,它的格式为'<... ... ...>',我认为这是正确的,因为这是我可以在APNS测试仪中使用的。你需要改变吗? –

+0

提供的代码 - 在注册时非常简单。任何想法将不胜感激。示例设备令牌是:'<97e0614c 3c18b3d7 a8d5274b ca7037dc 3e00e703 635d5172 3c755d9c 8616f375>' –

+0

@RudiVisser到目前为止您还没有看到您的问题。我实际上会去除小于和大于字符以及像这样的任何空格:'deviceToken.ToString()。Replace(“<”,string.Empty).Replace(“>”,string.Empty).Replace(“ “,string.Empty);' – hvaughan3

1

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

+0

谢谢 - 我想这也可能是一个类似的问题,但那么证书不会直接与APNS一起工作? –

+0

@RudiVisser对,您的问题的一部分我不确定。我从来没有尝试直接通过APNS发送通知。希望我能在这方面更有帮助。你有没有尝试下载和使用[服务总线浏览器](https://code.msdn.microsoft.com/windowsapps/Service-Bus-Explorer-f2abca5a)?我知道它显示了比Azure网站在注册设备方面的更多信息。最近没有使用它,所以我不能说它是否会直接帮助你的情况或不。 – hvaughan3

+0

我试过了,应用程序没有工作,但查看VS中的注册设备工作,并显示设备注册了正确的令牌和我发送的标签。整件事情只是奇怪而令人沮丧:( –