/// <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; } }