在C#中发送推送通知

时间:2017-07-11 03:55:36

标签: c# push-notification certificate apple-push-notifications pushsharp

我正在尝试使用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();
    }

3 个答案:

答案 0 :(得分:0)

您转换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();
}

答案 1 :(得分:0)

您正在使用旧版API。如果您希望继续使用它,可以在here上完成5年完整的C#步骤。

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 ();

答案 2 :(得分:0)

问题解决了,看起来APNS不允许空消息,我将有效负载json更新为JObject.Parse(“{\”aps \“:{\”alert \“:\”joetheman \“,\”声音\ “:\”默认\“},\”消息\“:\”您应用的一些自定义消息\“,\”id \“:1234}”)

它为我工作。