public ApplePushChannel(ApplePushChannelSettings channelSettings) { cancelToken = cancelTokenSrc.Token; appleSettings = channelSettings; certificate = this.appleSettings.Certificate; certificates = new X509CertificateCollection(); if (appleSettings.AddLocalAndMachineCertificateStores) { var store = new X509Store(StoreLocation.LocalMachine); certificates.AddRange(store.Certificates); store = new X509Store(StoreLocation.CurrentUser); certificates.AddRange(store.Certificates); } certificates.Add(certificate); if (this.appleSettings.AdditionalCertificates != null) { foreach (var addlCert in this.appleSettings.AdditionalCertificates) { certificates.Add(addlCert); } } timerCleanup = new Timer(state => Cleanup(), null, TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1000)); }
public ApplePushService(IPushChannelFactory pushChannelFactory, ApplePushChannelSettings channelSettings, IPushServiceSettings serviceSettings) : base(pushChannelFactory ?? new ApplePushChannelFactory(), channelSettings, serviceSettings) { var appleChannelSettings = channelSettings; cancelTokenSource = new CancellationTokenSource(); //allow control over feedback call interval, if set to zero, don't make feedback calls automatically if (appleChannelSettings.FeedbackIntervalMinutes > 0) { feedbackService = new FeedbackService(); feedbackService.OnFeedbackReceived += feedbackService_OnFeedbackReceived; feedbackService.OnFeedbackException += (Exception ex) => this.RaiseServiceException(ex); if (timerFeedback == null) { timerFeedback = new Timer(new TimerCallback((state) => { try { feedbackService.Run(channelSettings as ApplePushChannelSettings, this.cancelTokenSource.Token); } catch (Exception ex) { base.RaiseServiceException(ex); } //Timer will run first after 10 seconds, then every 10 minutes to get feedback! }), null, TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(appleChannelSettings.FeedbackIntervalMinutes)); } } //Apple has documented that they only want us to use 20 connections to them base.ServiceSettings.MaxAutoScaleChannels = 20; }
public void Run(ApplePushChannelSettings settings) { try { Run(settings, (new CancellationTokenSource()).Token); } catch (Exception ex) { this.RaiseFeedbackException(ex); } }
public static void RegisterAppleService(this PushBroker broker, ApplePushChannelSettings channelSettings, IPushServiceSettings serviceSettings = null) { RegisterAppleService(broker, channelSettings, null, serviceSettings); }
public static void RegisterAppleService(this PushBroker broker, ApplePushChannelSettings channelSettings, string applicationId, IPushServiceSettings serviceSettings = null) { broker.RegisterService <AppleNotification>(new ApplePushService(channelSettings, serviceSettings), applicationId); }
public ApplePushService(IPushChannelFactory pushChannelFactory, ApplePushChannelSettings channelSettings) : this(pushChannelFactory, channelSettings, default(IPushServiceSettings)) { }
public ApplePushService(ApplePushChannelSettings channelSettings, IPushServiceSettings serviceSettings) : this(default(IPushChannelFactory), channelSettings, serviceSettings) { }
public void Run(ApplePushChannelSettings settings, CancellationToken cancelToken) { var encoding = Encoding.ASCII; var certificate = settings.Certificate; var certificates = new X509CertificateCollection(); certificates.Add(certificate); var client = new TcpClient(settings.FeedbackHost, settings.FeedbackPort); var stream = new SslStream(client.GetStream(), true, (sender, cert, chain, sslErrs) => { return(true); }, (sender, targetHost, localCerts, remoteCert, acceptableIssuers) => { return(certificate); }); stream.AuthenticateAsClient(settings.FeedbackHost, certificates, System.Security.Authentication.SslProtocols.Tls, false); //Set up byte[] buffer = new byte[38]; int recd = 0; DateTime minTimestamp = DateTime.Now.AddYears(-1); //Get the first feedback recd = stream.Read(buffer, 0, buffer.Length); //Continue while we have results and are not disposing while (recd > 0 && !cancelToken.IsCancellationRequested) { try { //Get our seconds since 1970 ? byte[] bSeconds = new byte[4]; byte[] bDeviceToken = new byte[32]; Array.Copy(buffer, 0, bSeconds, 0, 4); //Check endianness if (BitConverter.IsLittleEndian) { Array.Reverse(bSeconds); } int tSeconds = BitConverter.ToInt32(bSeconds, 0); //Add seconds since 1970 to that date, in UTC var timestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(tSeconds); //flag to allow feedback times in UTC or local, but default is local if (!settings.FeedbackTimeIsUTC) { timestamp = timestamp.ToLocalTime(); } //Now copy out the device token Array.Copy(buffer, 6, bDeviceToken, 0, 32); var deviceToken = BitConverter.ToString(bDeviceToken).Replace("-", "").ToLower().Trim(); //Make sure we have a good feedback tuple if (deviceToken.Length == 64 && timestamp > minTimestamp) { //Raise event RaiseFeedbackReceived(deviceToken, timestamp); } } catch { } //Clear our array to reuse it Array.Clear(buffer, 0, buffer.Length); //Read the next feedback recd = stream.Read(buffer, 0, buffer.Length); } try { stream.Close(); stream.Dispose(); } catch { } try { client.Client.Shutdown(SocketShutdown.Both); client.Client.Dispose(); } catch { } try { client.Close(); } catch { } }