我们已使用生产APNS证书设置了Azure通知中心,并在生产模式下配置了APNS。
我们将测试设备(使用TestFlight / Production构建和证书)注册到APNS,然后注册到带有标记dealer-1
的ANH。当我们直接使用APNS时,我们可以使用我们的生产证书和注册的设备ID成功发送通知,但是,当我们使用“测试发送”时我们得到了一个成功的发送'到1个设备(或者我们注册的很多)。未收到通知。如果我们然后运行“测试发送”#39;再次,是0设备发送到。
在日志中,我们会看到' APNS错误'每个设备,每次测试发送。我看不出有什么方法可以查看错误实际上是什么,所以这是一个绝对没用的指标。
我已经完成了所有的问题排查步骤,并多次确认所有内容都已设置在' Production'。
在回顾了其他问题后,答案如下:
资源名称为:eight-technology / react-push-notification-hub
应用内注册流程如下:
注册事件在iOS Project(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");
});
}
}
答案 0 :(得分:3)
也就是说,我们将令牌作为string
存储在一个类中。 NSData
中作为iOS设备注册的一部分收到的RegisteredForRemoteNotifications
具有与发送到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");
});
}
答案 1 :(得分:1)
您使用this the guide进行问题排查?
在您注册设备之前,您是否有可能以某种方式对APN句柄进行任何字符串(或任何其他类型的)处理? &#39; APNS错误&#39;你看到似乎是无效的令牌大小&#39;。由于我不知道您的代码中发生了什么,因此很难确定它究竟是什么,但可能对您有帮助。
答案 2 :(得分:1)
当设备正确注册时,类似的事情发生在我身上,但是一旦发送通知,设备就会从列表中消失。事实证明,在通知中心内配置的APNS证书未正确连接到应用程序ID和/或应用程序未使用正确的配置文件进行签名时,问题一直存在。