diff --git a/PushSharp.Apple/ApnsConnection.cs b/PushSharp.Apple/ApnsConnection.cs index 0908b166..371151b3 100644 --- a/PushSharp.Apple/ApnsConnection.cs +++ b/PushSharp.Apple/ApnsConnection.cs @@ -354,7 +354,8 @@ async Task connect () (sender, targetHost, localCerts, remoteCert, acceptableIssuers) => certificate); try { - stream.AuthenticateAsClient (Configuration.Host, certificates, System.Security.Authentication.SslProtocols.Tls, false); + var tls = System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls12; + stream.AuthenticateAsClient(Configuration.Host, certificates, tls, false); } catch (System.Security.Authentication.AuthenticationException ex) { throw new ApnsConnectionException ("SSL Stream Failed to Authenticate as Client", ex); } diff --git a/PushSharp.Apple/ApnsFeedbackService.cs b/PushSharp.Apple/ApnsFeedbackService.cs index 57fb887a..1d078318 100644 --- a/PushSharp.Apple/ApnsFeedbackService.cs +++ b/PushSharp.Apple/ApnsFeedbackService.cs @@ -38,7 +38,8 @@ public void Check () (sender, cert, chain, sslErrs) => { return true; }, (sender, targetHost, localCerts, remoteCert, acceptableIssuers) => { return certificate; }); - stream.AuthenticateAsClient(Configuration.FeedbackHost, certificates, System.Security.Authentication.SslProtocols.Tls, false); + var tls = System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Tls11 | System.Security.Authentication.SslProtocols.Tls12; + stream.AuthenticateAsClient(Configuration.FeedbackHost, certificates, tls, false); //Set up diff --git a/README.md b/README.md index b3ae1f9b..1830f436 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ PushSharp v4.0 ============== -PushSharp is a server-side library for sending Push Notifications to iOS/OSX (APNS), Android/Chrome (GCM), Windows/Windows Phone, Amazon (ADM) and Blackberry devices! +PushSharp is a server-side library for sending Push Notifications to iOS/OSX (APNS), Android/Chrome (GCM/FCM), Windows/Windows Phone, Amazon (ADM) and Blackberry devices! PushSharp v3.0+ is a complete rewrite of the original library, aimed at taking advantage of things like async/await, HttpClient, and generally a better infrastructure using lessons learned from the old code. @@ -39,8 +39,7 @@ apnsBroker.OnNotificationFailed += (notification, aggregateEx) => { aggregateEx.Handle (ex => { // See what kind of exception it was to further diagnose - if (ex is ApnsNotificationException) { - var notificationException = (ApnsNotificationException)ex; + if (ex is ApnsNotificationException notificationException) { // Deal with the failed notification var apnsNotification = notificationException.Notification; @@ -103,13 +102,19 @@ fbs.Check (); ``` -### GCM Sample Usage +### GCM/FCM Sample Usage -Here is how you would send a GCM Notification: +Here is how you would send a GCM/FCM Notification: ```csharp -// Configuration +// Configuration GCM (use this section for GCM) var config = new GcmConfiguration ("GCM-SENDER-ID", "AUTH-TOKEN", null); +var provider = "GCM"; + +// Configuration FCM (use this section for FCM) +// var config = new GcmConfiguration("APIKEY"); +// config.GcmUrl = "https://fcm.googleapis.com/fcm/send"; +// var provider = "FCM"; // Create a new broker var gcmBroker = new GcmServiceBroker (config); @@ -120,46 +125,43 @@ gcmBroker.OnNotificationFailed += (notification, aggregateEx) => { aggregateEx.Handle (ex => { // See what kind of exception it was to further diagnose - if (ex is GcmNotificationException) { - var notificationException = (GcmNotificationException)ex; + if (ex is GcmNotificationException notificationException) { // Deal with the failed notification var gcmNotification = notificationException.Notification; var description = notificationException.Description; - Console.WriteLine ($"GCM Notification Failed: ID={gcmNotification.MessageId}, Desc={description}"); - } else if (ex is GcmMulticastResultException) { - var multicastException = (GcmMulticastResultException)ex; + Console.WriteLine ($"{provider} Notification Failed: ID={gcmNotification.MessageId}, Desc={description}"); + } else if (ex is GcmMulticastResultException multicastException) { foreach (var succeededNotification in multicastException.Succeeded) { - Console.WriteLine ($"GCM Notification Succeeded: ID={succeededNotification.MessageId}"); + Console.WriteLine ($"{provider} Notification Succeeded: ID={succeededNotification.MessageId}"); } foreach (var failedKvp in multicastException.Failed) { var n = failedKvp.Key; var e = failedKvp.Value; - Console.WriteLine ($"GCM Notification Failed: ID={n.MessageId}, Desc={e.Description}"); + Console.WriteLine ($"{provider} Notification Failed: ID={n.MessageId}, Desc={e.Description}"); } - } else if (ex is DeviceSubscriptionExpiredException) { - var expiredException = (DeviceSubscriptionExpiredException)ex; + } else if (ex is DeviceSubscriptionExpiredException expiredException) { var oldId = expiredException.OldSubscriptionId; var newId = expiredException.NewSubscriptionId; Console.WriteLine ($"Device RegistrationId Expired: {oldId}"); - if (!string.IsNullOrWhitespace (newId)) { + if (!string.IsNullOrWhiteSpace (newId)) { // If this value isn't null, our subscription changed and we should update our database Console.WriteLine ($"Device RegistrationId Changed To: {newId}"); } - } else if (ex is RetryAfterException) { - var retryException = (RetryAfterException)ex; + } else if (ex is RetryAfterException retryException) { + // If you get rate limited, you should stop sending messages until after the RetryAfterUtc date - Console.WriteLine ($"GCM Rate Limited, don't send more until after {retryException.RetryAfterUtc}"); + Console.WriteLine ($"{provider} Rate Limited, don't send more until after {retryException.RetryAfterUtc}"); } else { - Console.WriteLine ("GCM Notification Failed for some unknown reason"); + Console.WriteLine ("{provider} Notification Failed for some unknown reason"); } // Mark it as handled @@ -168,7 +170,7 @@ gcmBroker.OnNotificationFailed += (notification, aggregateEx) => { }; gcmBroker.OnNotificationSucceeded += (notification) => { - Console.WriteLine ("GCM Notification Sent!"); + Console.WriteLine ("{provider} Notification Sent!"); }; // Start the broker @@ -190,7 +192,7 @@ foreach (var regId in MY_REGISTRATION_IDS) { gcmBroker.Stop (); ``` -#### Components of a GCM Notification +#### Components of a GCM/FCM Notification GCM notifications are much more customizable than Apple Push Notifications. More information about the messaging concepts and options can be found [here](https://developers.google.com/cloud-messaging/concept-options#components-of-a-message). @@ -212,8 +214,7 @@ wnsBroker.OnNotificationFailed += (notification, aggregateEx) => { aggregateEx.Handle (ex => { // See what kind of exception it was to further diagnose - if (ex is WnsNotificationException) { - var notificationException = (WnsNotificationException)ex; + if (ex is WnsNotificationException notificationException) { Console.WriteLine ($"WNS Notification Failed: {notificationException.Message}"); } else { Console.WriteLine ("WNS Notification Failed for some (Unknown Reason)");