我们使用生产APNS证书设置了Azure通知中心,并在生产模式下配置了APNS。
我们将测试设备(使用TestFlight / Production版本和证书)注册到APNS,然后使用标签dealer-1
注册到ANH。直接使用APNS时,我们可以成功使用生产证书和已注册的设备ID发送通知,但是,当我们使用“测试发送”时,我们会“成功发送”到1台设备(或者我们已经注册了许多设备)。未收到通知。如果然后再次运行“测试发送”,则将发送0个设备。
在日志中,我们看到每个设备,每个测试发送的“APNS错误”。我看不到任何方法可以查看实际的错误,所以这绝对是没用的指标。
我已完成所有故障排除步骤,并多次确认“生产”中的所有设置均已设置。
复习了其他问题后,答案大致如下:
资源名称为:八技术/反应-推送-通知中心
应用内注册流程如下:
public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
//base.RegisteredForRemoteNotifications(application, deviceToken);
App.ConfigurePushNotifications(deviceToken.ToString());
}
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());
}
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");
});
}