Example #1
0
        /// <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;
            }
        }
Example #2
0
        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);
            }
        }