/// <summary> /// Sets up a connection to APNS and initializes the thread for sending notifications /// </summary> void _Connect() { var configuration = ApnsServiceConfiguration.GetConfiguration(); _certificate = new X509Certificate2(File.ReadAllBytes(configuration.Certificate), configuration.Password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); try { if (!_connection.IsNullOrDefault()) { _connection.Close(); } #if DEBUG NSLogger.Log(NSLogLevel.Info, "Connecting to APNS..."); #endif _connection = new TcpClient(apnsHostName, 2195); if (!_sslStream.IsNullOrDefault()) { _sslStream.Close(); } _sslStream = new SslStream(_connection.GetStream(), false, new RemoteCertificateValidationCallback((sender, cert, chain, sslPolicyErrors) => { return(true); }), new LocalCertificateSelectionCallback((sender, targetHost, localCerts, remoteCert, acceptableIssuers) => { return(_certificate); })); var certificates = new X509CertificateCollection { _certificate }; _sslStream.AuthenticateAsClient(apnsHostName, certificates, SslProtocols.Ssl3, false); if (!_sslStream.IsMutuallyAuthenticated) { throw new ApplicationException("SSL Stream Failed to Authenticate", null); } if (!_sslStream.CanWrite) { throw new ApplicationException("SSL Stream is not Writable", null); } #if DEBUG NSLogger.Log(NSLogLevel.Info, "Connected!"); #endif } catch (Exception) { if (_connection.Connected) { _connection.Close(); } if (!_sslStream.IsNullOrDefault()) { _sslStream.Close(); _sslStream.Dispose(); } throw; } }
internal void PostNotification(String notification, IEnumerable <String> recipients) { try { if (!this.IsConnected) { GetChannel(); } #if DEBUG NSLogger.Log(NSLogLevel.Info, String.Format("Sending notification: {0}...", notification)); #endif recipients.ToBytes(notification).ForEach( recipient => _sslStream.Write(recipient, 0, recipient.Length) ); #if DEBUG NSLogger.Log(NSLogLevel.Info, "Notification Sent!"); #endif } catch (Exception ex) { NSLogger.LogException(ex); } }