C#推送信息到APNs的方法
本文实例讲述了C#推送信息到APNs的方法。分享给大家供大家参考。具体实现方法如下:
classProgram
{
publicstaticDateTime?Expiration{get;set;}
publicstaticreadonlyDateTimeDoNotStore=DateTime.MinValue;
privatestaticreadonlyDateTimeUNIX_EPOCH=newDateTime(1970,1,1,0,0,0,DateTimeKind.Utc);
privatestaticstringDeviceToken="273eeddaef02192cf4ba5b666453b258f2d2a1ad02f549105fd03fea789d809d";
publicconstintDEVICE_TOKEN_BINARY_SIZE=32;
publicconstintDEVICE_TOKEN_STRING_SIZE=64;
publicconstintMAX_PAYLOAD_SIZE=256;
privatestaticX509Certificatecertificate;
privatestaticX509CertificateCollectioncertificates;
staticvoidMain(string[]args)
{
stringhostIP="gateway.sandbox.push.apple.com";//
intport=2195;
stringpassword="ankejiaoyu";//
stringcertificatepath="aps_developer_identity.p12";//bin/debug
stringp12Filename=System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,certificatepath);
certificate=newX509Certificate2(System.IO.File.ReadAllBytes(p12Filename),password,X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.PersistKeySet|X509KeyStorageFlags.Exportable);
certificates=newX509CertificateCollection();
certificates.Add(certificate);
TcpClientapnsClient=newTcpClient();
apnsClient.Connect(hostIP,port);
SslStreamapnsStream=newSslStream(apnsClient.GetStream(),false,newRemoteCertificateValidationCallback(validateServerCertificate),newLocalCertificateSelectionCallback(selectLocalCertificate));
try
{
//APNs已不支持SSL3.0
apnsStream.AuthenticateAsClient(hostIP,certificates,System.Security.Authentication.SslProtocols.Tls,false);
}
catch(System.Security.Authentication.AuthenticationExceptionex)
{
Console.WriteLine("error+"+ex.Message);
}
if(!apnsStream.IsMutuallyAuthenticated)
{
Console.WriteLine("error:SslStreamFailedtoAuthenticate!");
}
if(!apnsStream.CanWrite)
{
Console.WriteLine("error:SslStreamisnotWritable!");
}
Byte[]message=ToBytes();
apnsStream.Write(message);
}
publicstaticbyte[]ToBytes()
{
//Withoutreadingtheresponsewhichwouldmakeanyidentifieruseful,itseemssillyto
//exposethevalueintheobjectmodel,althoughthatwouldbeeasyenoughtodo.For
//nowwe'lljustusezero.
intidentifier=0;
byte[]identifierBytes=BitConverter.GetBytes(IPAddress.HostToNetworkOrder(identifier));
//APNSwillnotstore-and-forwardanotificationwithnoexpiry,sosetitoneyearinthefuture
//iftheclientdoesnotprovideit.
intexpiryTimeStamp=-1;//过期时间戳
if(Expiration!=DoNotStore)
{
//DateTimeconcreteExpireDateUtc=(Expiration??DateTime.UtcNow.AddMonths(1)).ToUniversalTime();
DateTimeconcreteExpireDateUtc=(Expiration??DateTime.UtcNow.AddSeconds(20)).ToUniversalTime();
TimeSpanepochTimeSpan=concreteExpireDateUtc-UNIX_EPOCH;
expiryTimeStamp=(int)epochTimeSpan.TotalSeconds;
}
byte[]expiry=BitConverter.GetBytes(IPAddress.HostToNetworkOrder(expiryTimeStamp));
byte[]deviceToken=newbyte[DeviceToken.Length/2];
for(inti=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("Devicetokenlengtherror!");
}
byte[]deviceTokenSize=BitConverter.GetBytes(IPAddress.HostToNetworkOrder(Convert.ToInt16(deviceToken.Length)));
stringstr="{\"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=newList<byte[]>();
//1Command
notificationParts.Add(newbyte[]{0x01});//Enhancednotificationformatcommand
notificationParts.Add(identifierBytes);
notificationParts.Add(expiry);
notificationParts.Add(deviceTokenSize);
notificationParts.Add(deviceToken);
notificationParts.Add(payloadSize);
notificationParts.Add(payload);
returnBuildBufferFrom(notificationParts);
}
privatestaticbyte[]BuildBufferFrom(IList<byte[]>bufferParts)
{
intbufferSize=0;
for(inti=0;i<bufferParts.Count;i++)
bufferSize+=bufferParts[i].Length;
byte[]buffer=newbyte[bufferSize];
intposition=0;
for(inti=0;i<bufferParts.Count;i++)
{
byte[]part=bufferParts[i];
Buffer.BlockCopy(bufferParts[i],0,buffer,position,part.Length);
position+=part.Length;
}
returnbuffer;
}
privatestaticboolvalidateServerCertificate(objectsender,X509Certificatecertificate,X509Chainchain,SslPolicyErrorssslPolicyErrors)
{
returntrue;//Dontcareaboutserver'scert
}
privatestaticX509CertificateselectLocalCertificate(objectsender,stringtargetHost,X509CertificateCollectionlocalCertificates,
X509CertificateremoteCertificate,string[]acceptableIssuers)
{
returncertificate;
}
}
希望本文所述对大家的C#程序设计有所帮助。