推送后通知中心设备消失 (APNS)
Notification Hub Devices disappearing after Push (APNS)
我们设置了一个 Azure 通知中心,使用我们的生产 APNS 证书在生产模式下配置了 APNS。
我们将我们的测试设备(使用 TestFlight / 生产版本和证书)注册到 APNS,然后使用标签 dealer-1
注册到 ANH。当直接使用 APNS 时,我们可以使用我们的生产证书和注册的设备 ID 成功发送通知,但是,当我们使用 'Test Send' 时,我们将 'Successful send' 发送到 1 台设备(或者无论我们注册了多少台设备)。未收到通知。如果我们再次 运行 'Test Send',将发送到 0 个设备。
在日志中,我们看到每个设备的每个测试发送 'APNS Errors'。我看不到任何方法来查看实际错误是什么,所以这是一个绝对无用的指标。
我已经 运行 完成了所有故障排除步骤,并多次确认在 'Production' 中设置了所有内容。
查看其他问题后,答案大致如下:
- .. 注册沙盒证书,然后将其更改为生产。不幸的是,我们从头开始创建这个中心作为生产,试图解决这个潜在的问题。
- .. 根据生产证书注册沙盒设备(以及令牌)。不幸的是,我已经严密控制了这一点,并确保我们只针对 ANH 注册 TestFlight 构建(因此生产)。
- ..上传了错误的证书。如上所述,我已经通过推送通知测试器确认证书是正确的(指纹确认、重新上传等)并且可以通过生产 APNS 端点发送到设备。
资源名称是:eight-technology/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");
});
}
}
this the guide你是用来排错的吗?
在注册设备之前,您是否有机会以某种方式对 APN 句柄进行任何字符串(或任何其他类型的)处理?您看到的 'APNS errors' 似乎是 'invalid token size'。由于我不知道您的代码中发生了什么,所以很难给出确切的建议,但也许会对您有所帮助。
当设备正确注册时,我也遇到了类似的事情,但一旦发送通知,设备就会从列表中消失。事实证明,通知中心内配置的 APNS 证书始终存在问题,未正确连接到应用程序 ID and/or 应用程序未使用正确的配置文件进行签名。
经过令人沮丧的几天,感谢 Nikita G. 和 hvaughan3 的帮助,我终于找到了问题的根本原因。正如预期的那样,这并不是实际概述的任何问题,而是与我们使用 Xamarin Forms 处理注册的跨平台方面的方式有关。
也就是说,我们将令牌存储在 class 中作为 string
。在 RegisteredForRemoteNotifications
中作为 iOS 设备注册的一部分接收的 NSData
具有与发送到 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");
});
}
我们设置了一个 Azure 通知中心,使用我们的生产 APNS 证书在生产模式下配置了 APNS。
我们将我们的测试设备(使用 TestFlight / 生产版本和证书)注册到 APNS,然后使用标签 dealer-1
注册到 ANH。当直接使用 APNS 时,我们可以使用我们的生产证书和注册的设备 ID 成功发送通知,但是,当我们使用 'Test Send' 时,我们将 'Successful send' 发送到 1 台设备(或者无论我们注册了多少台设备)。未收到通知。如果我们再次 运行 'Test Send',将发送到 0 个设备。
在日志中,我们看到每个设备的每个测试发送 'APNS Errors'。我看不到任何方法来查看实际错误是什么,所以这是一个绝对无用的指标。
我已经 运行 完成了所有故障排除步骤,并多次确认在 'Production' 中设置了所有内容。
查看其他问题后,答案大致如下:
- .. 注册沙盒证书,然后将其更改为生产。不幸的是,我们从头开始创建这个中心作为生产,试图解决这个潜在的问题。
- .. 根据生产证书注册沙盒设备(以及令牌)。不幸的是,我已经严密控制了这一点,并确保我们只针对 ANH 注册 TestFlight 构建(因此生产)。
- ..上传了错误的证书。如上所述,我已经通过推送通知测试器确认证书是正确的(指纹确认、重新上传等)并且可以通过生产 APNS 端点发送到设备。
资源名称是:eight-technology/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"); }); } }
this the guide你是用来排错的吗?
在注册设备之前,您是否有机会以某种方式对 APN 句柄进行任何字符串(或任何其他类型的)处理?您看到的 'APNS errors' 似乎是 'invalid token size'。由于我不知道您的代码中发生了什么,所以很难给出确切的建议,但也许会对您有所帮助。
当设备正确注册时,我也遇到了类似的事情,但一旦发送通知,设备就会从列表中消失。事实证明,通知中心内配置的 APNS 证书始终存在问题,未正确连接到应用程序 ID and/or 应用程序未使用正确的配置文件进行签名。
经过令人沮丧的几天,感谢 Nikita G. 和 hvaughan3 的帮助,我终于找到了问题的根本原因。正如预期的那样,这并不是实际概述的任何问题,而是与我们使用 Xamarin Forms 处理注册的跨平台方面的方式有关。
也就是说,我们将令牌存储在 class 中作为 string
。在 RegisteredForRemoteNotifications
中作为 iOS 设备注册的一部分接收的 NSData
具有与发送到 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");
});
}