我们使用我们的生产 APNS 证书设置了 Azure 通知中心,并在生产模式下配置了 APNS。
我们将测试设备(使用 TestFlight/Production 版本和证书)注册到 APNS,然后使用标签 dealer-1
注册到 ANH。直接使用 APNS 时,我们可以使用我们的生产证书和注册的设备 ID 成功发送通知,但是,当我们使用“测试发送”时,我们会向 1 台设备(或我们注册的任意多台设备)发送“成功发送”消息。未收到通知。如果我们再次运行“测试发送”,则会有 0 个要发送到的设备。
在日志中,我们看到每个设备、每个测试发送都有“APNS 错误”。我看不到任何方法来查看实际错误是什么,所以这是一个绝对无用的指标。
我已完成所有故障排除步骤,并多次确认所有内容均已在“生产”中设置。
查看了其他问题后,答案大致如下:
- .. 注册沙箱证书,然后将其更改为生产证书。不幸的是,我们从头开始创建了这个中心作为生产,试图解决这个潜在问题。
- .. 根据生产证书注册沙箱设备(以及 token )。不幸的是,我已经严格控制了这一点,并确保我们只针对 ANH 注册 TestFlight 版本(即生产版)。
- .. 上传了错误的证书。如上所述,我已通过推送通知测试器确认证书正确(指纹已确认、重新上传等),并且可以通过生产 APNS 端点发送到设备。
资源名称为:八技术/react-push-notification-hub
应用内注册流程如下:
- 设备注册推送通知
注册事件在 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 作为字符串
存储在类中。作为 RegisteredForRemoteNotifications
中 iOS 设备注册的一部分接收的 NSData
具有与发送到 ANH 不兼容的 ToString()
方法。此外,Azure 库中的 RegisterNativeAsync
方法需要一个 NSData
,我认为 Xamarin 可以在没有警告或错误的情况下将字符串变形为该字符串,因此未知两者有些不兼容。
基本上,为了维护跨平台功能,我们现在只需将 token 作为对象
传递,并在推送配置方法的特定于平台的实现中执行转换回原始类型。
我们的注册方法现在看起来像这样,请注意显式使用 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");
});
}
关于ios - 通知中心设备在推送后消失 (APNS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561972/