C# iPhone push server?
Solution 1
Figured it out. Replaced sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com"); with sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false); And registered the certificates on the PC.
Edit: Here is the code for creating a payload as requested:
private static byte[] GeneratePayload(byte [] deviceToken, string message, string sound)
{
MemoryStream memoryStream = new MemoryStream();
// Command
memoryStream.WriteByte(0);
byte[] tokenLength = BitConverter.GetBytes((Int16)32);
Array.Reverse(tokenLength);
// device token length
memoryStream.Write(tokenLength, 0, 2);
// Token
memoryStream.Write(deviceToken, 0, 32);
// String length
string apnMessage = string.Format ( "{{\"aps\":{{\"alert\":{{\"body\":\"{0}\",\"action-loc-key\":null}},\"sound\":\"{1}\"}}}}",
message,
sound);
byte [] apnMessageLength = BitConverter.GetBytes((Int16)apnMessage.Length);
Array.Reverse ( apnMessageLength );
// message length
memoryStream.Write(apnMessageLength, 0, 2);
// Write the message
memoryStream.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(apnMessage), 0, apnMessage.Length);
return memoryStream.ToArray();
} // End of GeneratePayload
Solution 2
From Zenox's comment: use a different version of AuthenticateAsClient
sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false);
Solution 3
Other way is just to use X509Certificate2 and X509CertificateCollection2 classes.
Solution 4
I recently used Growl For Windows to push messages to the Prowl client on the IPhone from .Net code. So you might get your functionatlity without writing a push server yourself.
![Kyle](https://i.stack.imgur.com/Ppot0.png?s=256&g=1)
Kyle
Self employed developer of SQLPro Studio for macOS, iOS and Windows.
Updated on July 31, 2022Comments
-
Kyle almost 2 years
Im attempting to write a push server for the iPhone in C#. I have the following code:
// Create a TCP/IP client socket. using (TcpClient client = new TcpClient()) { client.Connect("gateway.sandbox.push.apple.com", 2195); using (NetworkStream networkStream = client.GetStream()) { Console.WriteLine("Client connected."); X509Certificate clientCertificate = new X509Certificate(@"certfile.p12", passwordHere); X509CertificateCollection clientCertificateCollection = new X509CertificateCollection(new X509Certificate[1] { clientCertificate }); // Create an SSL stream that will close the client's stream. SslStream sslStream = new SslStream( client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null ); try { sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com"); } catch (AuthenticationException e) { Console.WriteLine("Exception: {0}", e.Message); if (e.InnerException != null) { Console.WriteLine("Inner exception: {0}", e.InnerException.Message); } Console.WriteLine("Authentication failed - closing the connection."); client.Close(); return; } }
ect....
Only I keep receiving a exception: "A call to SSPI failed, see Inner exception" Inner Exception -> "The message received was unexpected or badly formatted."
Does anyone have any idea whats going wrong here?
-
Kyle almost 15 yearsThat may work for pushing data to the apn, but what about handling the feedback though?
-
Akash Kava about 14 yearsWhat folder (Certificate Store) should I use to import to on Windows Server? Is it Personal or Trusted Publisher? I tried "Default select based on certificate type" but didnt work.