Send push notification on Apple (APNS) on c#.net

时间:2022-07-07 02:40:25

原文: http://apns-c-sharp-net-vikram-jain.blogspot.com

=======================
Please, Install your certificate *.p12 on pc, and take firend name use here for refernce.
Please, set configuration file :

 <appSettings>
 <add key="FriendName" value="Apple Production IOS Push Services: com.ABC.XYZ"/>
    <add key="ProductionKeyFriendName" value="Production"/>   
  </appSettings>
==============
Send, push as per below in your class to call apns class:
   Cls_APNS _Cls_APNS = new class_apns();
  //Here pass custom fiels as per seprated by ";" ann asssigb value by "key=value;key=value"
   _Cls_APNS.PushMessage("Message","DeviceToken",0,"id=12;name=ABC");
==================
Please create a class as per below (class_apns.cs). :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Configuration;
using System.Data;
using System.Security.Authentication;
using System.IO;

namespace Push.Class
{
    public class class_apns
    {
        String CertificateName = "";
        String CertificatePwd = "";
        String FriendName = "Apple Development IOS Push Services: com.ABC.XYZ";
        String ProductionKeyFriendName = "Production";
        SslStream sslStream;     

        public Cls_APNS()
        {                 
            FriendName = ConfigurationManager.AppSettings["FriendName"].ToString();
            ProductionKeyFriendName = ConfigurationManager.AppSettings["ProductionKeyFriendName"].ToString();        
        }

        public bool ConnectToAPNS()
        {
            X509Certificate2Collection certs = new X509Certificate2Collection();

            // Add the Apple cert to our collection
            certs.Add(getServerCert());

            // Apple development server address
            string apsHost;

            if (getServerCert().ToString().Contains(ProductionKeyFriendName))
                apsHost = "gateway.push.apple.com";
            else
                apsHost = "gateway.sandbox.push.apple.com";

            // Create a TCP socket connection to the Apple server on port 2195
            TcpClient tcpClient = new TcpClient(apsHost, 2195);

            // Create a new SSL stream over the connection
            sslStream = new SslStream(tcpClient.GetStream());

            // Authenticate using the Apple cert
            sslStream.AuthenticateAsClient(apsHost, certs, SslProtocols.Default, false);

            //PushMessage();

            return true;
        }

        private X509Certificate getServerCert()
        {
            X509Certificate test = new X509Certificate();

            //Open the cert store on local machine        
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

            if (store != null)
            {
                // store exists, so open it and search through the certs for the Apple Cert        
                store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
                X509Certificate2Collection certs = store.Certificates;

                if (certs.Count > 0)
                {
                    int i;
                    for (i = 0; i < certs.Count; i++)
                    {
                        X509Certificate2 cert = certs[i];

                        if (cert.FriendlyName.Contains(FriendName))
                        {
                            //Cert found, so return it.
                            return certs[i];
                        }
                    }
                }
                return test;
            }
            return test;
        }

        private  byte[] HexToData(string hexString)
        {
            if (hexString == null)
                return null;

            if (hexString.Length % 2 == 1)
                hexString = '0' + hexString; // Up to you whether to pad the first or last byte

            byte[] data = new byte[hexString.Length / 2];

            for (int i = 0; i < data.Length; i++)
                data[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);

            return data;
        }

        public bool PushMessage(string Mess, string DeviceToken, int Badge, string Custom_Field)
        {              
            ConnectToAPNS();     
            List<string> Key_Value_Custom_Field = new List<string>();
            String cToken = DeviceToken;
            String cAlert = Mess;
            int iBadge = Badge;

            // Ready to create the push notification
            byte[] buf = new byte[256];
            MemoryStream ms = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(ms);
            bw.Write(new byte[] { 0, 0, 32 });

            byte[] deviceToken = HexToData(cToken);
            bw.Write(deviceToken);

            bw.Write((byte)0);

            // Create the APNS payload - new.caf is an audio file saved in the application bundle on the device
            string msg = "";       
           msg = "{\"aps\":{\"alert\":\"" + cAlert + "\",\"badge\":\"" + iBadge.ToString() + "\",\"sound\":\"noti.aiff\"}";
        
            String PayloadMess = "";
            if (string.IsNullOrWhiteSpace(Custom_Field) == false)
            {
                List<string> list_Custom_Field = Custom_Field.Split(';').ToList();

                if (list_Custom_Field.Count > 0)
                {
                    for (int indx = 0; indx < list_Custom_Field.Count; indx++)
                    {
                        Key_Value_Custom_Field = list_Custom_Field[indx].Split('=').ToList();
                        if (Key_Value_Custom_Field.Count > 1)
                        {
                            if (PayloadMess != "") PayloadMess += ", ";                        
                            PayloadMess += "\"" + Key_Value_Custom_Field[0].ToString() + "\":\"" + Key_Value_Custom_Field[1].ToString() + "\"";
                        }
                    }
                }
            }

            if (PayloadMess != "")
            {
                msg += ", " + PayloadMess;
            }
            msg += "}";

            // Write the data out to the stream
            bw.Write((byte)msg.Length);
            bw.Write(msg.ToCharArray());
            bw.Flush();

            if (sslStream != null)
            {
                sslStream.Write(ms.ToArray());
                return true;
            }

            return false;
        }   
 
    }
}