在 C# 中发送推送通知
Send Push Notification in C#
我正在尝试在 VS C# Web 项目中使用以下代码向 iOS 设备发送推送通知。
实际上下面的编码没有任何错误,但我最终没有在我的设备上收到任何通知,有人知道吗?谢谢。
static void Main(string[] args)
{
var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox, @"D:\Share\Certificates_Prod.p12", "");
// Create a new broker
var apnsBroker = new ApnsServiceBroker(config);
// Wire up events
apnsBroker.OnNotificationFailed += (notification, aggregateEx) => {
aggregateEx.Handle(ex => {
// See what kind of exception it was to further diagnose
if (ex is ApnsNotificationException)
{
var notificationException = (ApnsNotificationException)ex;
// Deal with the failed notification
var apnsNotification = notificationException.Notification;
var statusCode = notificationException.ErrorStatusCode;
Console.WriteLine($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}");
}
else
{
// Inner exception might hold more useful information like an ApnsConnectionException
Console.WriteLine($"Apple Notification Failed for some unknown reason : {ex.InnerException}");
}
// Mark it as handled
return true;
});
};
apnsBroker.OnNotificationSucceeded += (notification) => {
Console.WriteLine("Apple Notification Sent!");
};
// Start the broker
apnsBroker.Start();
apnsBroker.QueueNotification(new ApnsNotification
{
DeviceToken = "58f0f386003a4b7be..................................",
Payload = JObject.Parse("{\"aps\":{\"badge\":7}}")
});
// Stop the broker, wait for it to finish
// This isn't done after every message, but after you're
// done with the broker
apnsBroker.Stop();
}
你的转换HexStringToBytes
函数是错误的。它在错误的地方有几个 0x00
值:
int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
应该是:
int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
我还会推荐一些更干净的东西。尝试这样的事情:
public static byte[] HexStringToByteArray(string Hex)
{
if(1 == (Hex.length&1)) throw new Exception("Hex string cannot have an odd number of characters");
return Enumerable.Range(0, hex.Length <<1 )
.Select(x => Convert.ToByte(hex.Substring(x << 1, 2), 16))
.ToArray();
}
您正在使用旧版 API。有 5 年完整的 C# 遍历 here 如果你想继续使用它。
Apple 现在支持 http/2 上的 APN。与其编写自己的代码,不如看看一些现有的库,例如 PushSharp,它将为您处理低级别 API 和错误处理。
// Configuration (NOTE: .pfx can also be used here)
var config = new ApnsConfiguration (ApnsConfiguration.ApnsServerEnvironment.Sandbox,
"push-cert.p12", "push-cert-pwd");
// Create a new broker
var apnsBroker = new ApnsServiceBroker (config);
// Wire up events
apnsBroker.OnNotificationFailed += (notification, aggregateEx) => {
aggregateEx.Handle (ex => {
// See what kind of exception it was to further diagnose
if (ex is ApnsNotificationException) {
var notificationException = (ApnsNotificationException)ex;
// Deal with the failed notification
var apnsNotification = notificationException.Notification;
var statusCode = notificationException.ErrorStatusCode;
Console.WriteLine ($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}");
} else {
// Inner exception might hold more useful information like an ApnsConnectionException
Console.WriteLine ($"Notification Failed for some unknown reason : {ex.InnerException}");
}
// Mark it as handled
return true;
});
};
apnsBroker.OnNotificationSucceeded += (notification) => {
Console.WriteLine ("Apple Notification Sent!");
};
// Start the broker
apnsBroker.Start ();
foreach (var deviceToken in MY_DEVICE_TOKENS) {
// Queue a notification to send
apnsBroker.QueueNotification (new ApnsNotification {
DeviceToken = deviceToken,
Payload = JObject.Parse ("{\"aps\":{\"alert\":\"" + "Hi,, This Is a Sample Push Notification For IPhone.." + "\",\"badge\":1,\"sound\":\"default\"}}")
});
}
// Stop the broker, wait for it to finish
// This isn't done after every message, but after you're
// done with the broker
apnsBroker.Stop ();
问题已解决,就像 APNS 不允许空消息一样,我将负载 JSON 更新为:
JObject.Parse("{\"aps\": {\"alert\": \"joetheman\",\"sound\": \"default\"},\"message\": \"Some custom message for your app\",\"id\": 1234}")
对我有用。
我正在尝试在 VS C# Web 项目中使用以下代码向 iOS 设备发送推送通知。
实际上下面的编码没有任何错误,但我最终没有在我的设备上收到任何通知,有人知道吗?谢谢。
static void Main(string[] args)
{
var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox, @"D:\Share\Certificates_Prod.p12", "");
// Create a new broker
var apnsBroker = new ApnsServiceBroker(config);
// Wire up events
apnsBroker.OnNotificationFailed += (notification, aggregateEx) => {
aggregateEx.Handle(ex => {
// See what kind of exception it was to further diagnose
if (ex is ApnsNotificationException)
{
var notificationException = (ApnsNotificationException)ex;
// Deal with the failed notification
var apnsNotification = notificationException.Notification;
var statusCode = notificationException.ErrorStatusCode;
Console.WriteLine($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}");
}
else
{
// Inner exception might hold more useful information like an ApnsConnectionException
Console.WriteLine($"Apple Notification Failed for some unknown reason : {ex.InnerException}");
}
// Mark it as handled
return true;
});
};
apnsBroker.OnNotificationSucceeded += (notification) => {
Console.WriteLine("Apple Notification Sent!");
};
// Start the broker
apnsBroker.Start();
apnsBroker.QueueNotification(new ApnsNotification
{
DeviceToken = "58f0f386003a4b7be..................................",
Payload = JObject.Parse("{\"aps\":{\"badge\":7}}")
});
// Stop the broker, wait for it to finish
// This isn't done after every message, but after you're
// done with the broker
apnsBroker.Stop();
}
你的转换HexStringToBytes
函数是错误的。它在错误的地方有几个 0x00
值:
int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
应该是:
int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
我还会推荐一些更干净的东西。尝试这样的事情:
public static byte[] HexStringToByteArray(string Hex)
{
if(1 == (Hex.length&1)) throw new Exception("Hex string cannot have an odd number of characters");
return Enumerable.Range(0, hex.Length <<1 )
.Select(x => Convert.ToByte(hex.Substring(x << 1, 2), 16))
.ToArray();
}
您正在使用旧版 API。有 5 年完整的 C# 遍历 here 如果你想继续使用它。
Apple 现在支持 http/2 上的 APN。与其编写自己的代码,不如看看一些现有的库,例如 PushSharp,它将为您处理低级别 API 和错误处理。
// Configuration (NOTE: .pfx can also be used here)
var config = new ApnsConfiguration (ApnsConfiguration.ApnsServerEnvironment.Sandbox,
"push-cert.p12", "push-cert-pwd");
// Create a new broker
var apnsBroker = new ApnsServiceBroker (config);
// Wire up events
apnsBroker.OnNotificationFailed += (notification, aggregateEx) => {
aggregateEx.Handle (ex => {
// See what kind of exception it was to further diagnose
if (ex is ApnsNotificationException) {
var notificationException = (ApnsNotificationException)ex;
// Deal with the failed notification
var apnsNotification = notificationException.Notification;
var statusCode = notificationException.ErrorStatusCode;
Console.WriteLine ($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}");
} else {
// Inner exception might hold more useful information like an ApnsConnectionException
Console.WriteLine ($"Notification Failed for some unknown reason : {ex.InnerException}");
}
// Mark it as handled
return true;
});
};
apnsBroker.OnNotificationSucceeded += (notification) => {
Console.WriteLine ("Apple Notification Sent!");
};
// Start the broker
apnsBroker.Start ();
foreach (var deviceToken in MY_DEVICE_TOKENS) {
// Queue a notification to send
apnsBroker.QueueNotification (new ApnsNotification {
DeviceToken = deviceToken,
Payload = JObject.Parse ("{\"aps\":{\"alert\":\"" + "Hi,, This Is a Sample Push Notification For IPhone.." + "\",\"badge\":1,\"sound\":\"default\"}}")
});
}
// Stop the broker, wait for it to finish
// This isn't done after every message, but after you're
// done with the broker
apnsBroker.Stop ();
问题已解决,就像 APNS 不允许空消息一样,我将负载 JSON 更新为:
JObject.Parse("{\"aps\": {\"alert\": \"joetheman\",\"sound\": \"default\"},\"message\": \"Some custom message for your app\",\"id\": 1234}")
对我有用。