程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 推送信息到APNs,

C# 推送信息到APNs,

編輯:C#入門知識

C# 推送信息到APNs,


iPhone消息推送機制實現與探討


class Program     {           public static DateTime? Expiration { get; set; }           public static readonly DateTime DoNotStore = DateTime.MinValue;         private static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);         private static string DeviceToken = "273eeddaef02192cf4ba5b666453b258f2d2a1ad02f549105fd03fea789d809d";         public const int DEVICE_TOKEN_BINARY_SIZE = 32;         public const int DEVICE_TOKEN_STRING_SIZE = 64;         public const int MAX_PAYLOAD_SIZE = 256;         private static X509Certificate certificate;         private static X509CertificateCollection certificates;           static void Main(string[] args)         {             string hostIP = "gateway.sandbox.push.apple.com";//             int port = 2195;             string password = "ankejiaoyu";//             string certificatepath = "aps_developer_identity.p12";//bin/debug             string p12Filename = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, certificatepath);                 certificate = new X509Certificate2(System.IO.File.ReadAllBytes(p12Filename), password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);               certificates = new X509CertificateCollection();             certificates.Add(certificate);                 TcpClient apnsClient = new TcpClient();             apnsClient.Connect(hostIP, port);               SslStream apnsStream = new SslStream(apnsClient.GetStream(), false, new RemoteCertificateValidationCallback(validateServerCertificate), new LocalCertificateSelectionCallback(selectLocalCertificate));               try             {                 //APNs已不支持SSL 3.0                  apnsStream.AuthenticateAsClient(hostIP, certificates, System.Security.Authentication.SslProtocols.Tls, false);             }             catch (System.Security.Authentication.AuthenticationException ex)             {                 Console.WriteLine("error+"+ex.Message);             }               if (!apnsStream.IsMutuallyAuthenticated)             {                 Console.WriteLine("error:Ssl Stream Failed to Authenticate!");             }               if (!apnsStream.CanWrite)             {                 Console.WriteLine("error:Ssl Stream is not Writable!");                              }               Byte[] message = ToBytes();             apnsStream.Write(message);         }           public static byte[] ToBytes()         {               // Without reading the response which would make any identifier useful, it seems silly to             // expose the value in the object model, although that would be easy enough to do. For             // now we'll just use zero.             int identifier = 0;             byte[] identifierBytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(identifier));               // APNS will not store-and-forward a notification with no expiry, so set it one year in the future             // if the client does not provide it.             int expiryTimeStamp = -1;//過期時間戳             if (Expiration != DoNotStore)             {                 //DateTime concreteExpireDateUtc = (Expiration ?? DateTime.UtcNow.AddMonths(1)).ToUniversalTime();                 DateTime concreteExpireDateUtc = (Expiration ?? DateTime.UtcNow.AddSeconds(20)).ToUniversalTime();                 TimeSpan epochTimeSpan = concreteExpireDateUtc - UNIX_EPOCH;                 expiryTimeStamp = (int)epochTimeSpan.TotalSeconds;             }               byte[] expiry = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(expiryTimeStamp));               byte[] deviceToken = new byte[DeviceToken.Length / 2];             for (int i = 0; i < deviceToken.Length; i++)                 deviceToken[i] = byte.Parse(DeviceToken.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber);               if (deviceToken.Length != DEVICE_TOKEN_BINARY_SIZE)             {                 Console.WriteLine("Device token length error!");             }               byte[] deviceTokenSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(Convert.ToInt16(deviceToken.Length)));             string str = "{\"aps\":{\"alert\":\"這是測試消息!!\",\"badge\":1,\"sound\":\"anke.mp3\"}}";               byte[] payload = Encoding.UTF8.GetBytes(str);               byte[] payloadSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(Convert.ToInt16(payload.Length)));             List<byte[]> notificationParts = new List<byte[]>();             //1 Command             notificationParts.Add(new byte[] { 0x01 }); // Enhanced notification format command             notificationParts.Add(identifierBytes);             notificationParts.Add(expiry);             notificationParts.Add(deviceTokenSize);             notificationParts.Add(deviceToken);             notificationParts.Add(payloadSize);             notificationParts.Add(payload);               return BuildBufferFrom(notificationParts);         }           private static byte[] BuildBufferFrom(IList<byte[]> bufferParts)         {             int bufferSize = 0;             for (int i = 0; i < bufferParts.Count; i++)                 bufferSize += bufferParts[i].Length;               byte[] buffer = new byte[bufferSize];             int position = 0;             for (int i = 0; i < bufferParts.Count; i++)             {                 byte[] part = bufferParts[i];                 Buffer.BlockCopy(bufferParts[i], 0, buffer, position, part.Length);                 position += part.Length;             }             return buffer;         }           private static bool validateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)         {             return true; // Dont care about server's cert         }           private static X509Certificate selectLocalCertificate(object sender, string targetHost, X509CertificateCollection localCertificates,             X509Certificate remoteCertificate, string[] acceptableIssuers)         {             return certificate;         }

    }

來自為知筆記(Wiz)



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved