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

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

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

复习了其他问题后,答案大致如下:

  • ..注册沙箱证书,然后将其更改为生产。不幸的是,我们从头开始创建了这个中心,称为Production,以尝试解决该潜在问题。
  • ..根据生产证书注册沙箱设备(并因此注册 token )。不幸的是,我对此进行了严格控制,并确保我们仅针对ANH注册TestFlight构建(因此正式生产)。
  • ..上传错误的证书。如上所述,我已经通过Push Notification Tester确认了该证书是正确的(已确认缩略图,已重新上传等),并且可以通过Production 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");
            });
        }
    }
    
  • 最佳答案

    经过几天的挫折,在Nikita G.和hvaughan3的帮助下,我终于找到了问题的根本原因。正如预期的那样,这实际上并不是所有问题,而是与我们使用Xamarin Forms处理注册的跨平台方面的方式有关。

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

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

    现在,我们的注册方法如下所示,请注意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");
            });
        }
    

    10-07 19:49
    查看更多