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.
PushSharp will now follow semver versioning, so major version numbers will go up as there are any breaking api changes.
- Read more on my blog http://redth.codes/pushsharp-3-0-the-push-awakens/
- Join the Gitter.im channel with questions/feedback
The API in v3.x+ series is quite different from 2.x. The goal is to simplify things and focus on the core functionality of the library, leaving things like constructing valid payloads up to the developer.
Here is an example of how you would send an APNS notification:
// Configuration (NOTE: .pfx can also be used here)varconfig=newApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox,"push-cert.p12","push-cert-pwd");// Create a new brokervarapnsBroker=newApnsServiceBroker(config);// Wire up eventsapnsBroker.OnNotificationFailed+=(notification,aggregateEx)=>{aggregateEx.Handle(ex =>{// See what kind of exception it was to further diagnoseif(exisApnsNotificationExceptionnotificationException){// Deal with the failed notificationvarapnsNotification=notificationException.Notification;varstatusCode=notificationException.ErrorStatusCode;Console.WriteLine($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}");}else{// Inner exception might hold more useful information like an ApnsConnectionException Console.WriteLine($"Apple Notification Failed for some unknown reason : {ex.InnerException}");}// Mark it as handledreturntrue;});};apnsBroker.OnNotificationSucceeded+=(notification)=>{Console.WriteLine("Apple Notification Sent!");};// Start the brokerapnsBroker.Start();foreach(vardeviceTokeninMY_DEVICE_TOKENS){// Queue a notification to sendapnsBroker.QueueNotification(newApnsNotification{DeviceToken=deviceToken,Payload=JObject.Parse("{\"aps\":{\"badge\":7}}")});}// Stop the broker, wait for it to finish // This isn't done after every message, but after you're// done with the brokerapnsBroker.Stop();More information about the payload sent in the ApnsNotification object can be found here.
For APNS you will also need to occasionally check with the feedback service to see if there are any expired device tokens you should no longer send notifications to. Here's an example of how you would do that:
varconfig=newApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox,Settings.Instance.ApnsCertificateFile,Settings.Instance.ApnsCertificatePassword);varfbs=newFeedbackService(config);fbs.FeedbackReceived+=(stringdeviceToken,DateTimetimestamp)=>{// Remove the deviceToken from your database// timestamp is the time the token was reported as expired};fbs.Check();Here is how you would send a GCM/FCM Notification:
// Configuration GCM (use this section for GCM)varconfig=newGcmConfiguration("GCM-SENDER-ID","AUTH-TOKEN",null);varprovider="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 brokervargcmBroker=newGcmServiceBroker(config);// Wire up eventsgcmBroker.OnNotificationFailed+=(notification,aggregateEx)=>{aggregateEx.Handle(ex =>{// See what kind of exception it was to further diagnoseif(exisGcmNotificationExceptionnotificationException){// Deal with the failed notificationvargcmNotification=notificationException.Notification;vardescription=notificationException.Description;Console.WriteLine($"{provider} Notification Failed: ID={gcmNotification.MessageId}, Desc={description}");}elseif(exisGcmMulticastResultExceptionmulticastException){foreach(varsucceededNotificationinmulticastException.Succeeded){Console.WriteLine($"{provider} Notification Succeeded: ID={succeededNotification.MessageId}");}foreach(varfailedKvpinmulticastException.Failed){varn=failedKvp.Key;vare=failedKvp.Value;Console.WriteLine($"{provider} Notification Failed: ID={n.MessageId}, Desc={e.Description}");}}elseif(exisDeviceSubscriptionExpiredExceptionexpiredException){varoldId=expiredException.OldSubscriptionId;varnewId=expiredException.NewSubscriptionId;Console.WriteLine($"Device RegistrationId Expired: {oldId}");if(!string.IsNullOrWhiteSpace(newId)){// If this value isn't null, our subscription changed and we should update our databaseConsole.WriteLine($"Device RegistrationId Changed To: {newId}");}}elseif(exisRetryAfterExceptionretryException){// If you get rate limited, you should stop sending messages until after the RetryAfterUtc dateConsole.WriteLine($"{provider} Rate Limited, don't send more until after {retryException.RetryAfterUtc}");}else{Console.WriteLine("{provider} Notification Failed for some unknown reason");}// Mark it as handledreturntrue;});};gcmBroker.OnNotificationSucceeded+=(notification)=>{Console.WriteLine("{provider} Notification Sent!");};// Start the brokergcmBroker.Start();foreach(varregIdinMY_REGISTRATION_IDS){// Queue a notification to sendgcmBroker.QueueNotification(newGcmNotification{RegistrationIds=newList<string>{regId},Data=JObject.Parse("{\"somekey\" : \"somevalue\" }")});}// Stop the broker, wait for it to finish // This isn't done after every message, but after you're// done with the brokergcmBroker.Stop();GCM notifications are much more customizable than Apple Push Notifications. More information about the messaging concepts and options can be found here.
Here's how to send WNS Notifications:
// Configurationvarconfig=newWnsConfiguration("WNS_PACKAGE_NAME","WNS_PACKAGE_SID","WNS_CLIENT_SECRET");// Create a new brokervarwnsBroker=newWnsServiceBroker(config);// Wire up eventswnsBroker.OnNotificationFailed+=(notification,aggregateEx)=>{aggregateEx.Handle(ex =>{// See what kind of exception it was to further diagnoseif(exisWnsNotificationExceptionnotificationException){Console.WriteLine($"WNS Notification Failed: {notificationException.Message}");}else{Console.WriteLine("WNS Notification Failed for some (Unknown Reason)");}// Mark it as handledreturntrue;});};wnsBroker.OnNotificationSucceeded+=(notification)=>{Console.WriteLine("WNS Notification Sent!");};// Start the brokerwnsBroker.Start();foreach(varuriinMY_DEVICE_CHANNEL_URIS){// Queue a notification to sendwnsBroker.QueueNotification(newWnsToastNotification{ChannelUri=uri,Payload=XElement.Parse(@" <toast> <visual> <binding template=""ToastText01""> <text id=""1"">WNS_Send_Single</text> </binding> </visual> </toast>")});}// Stop the broker, wait for it to finish // This isn't done after every message, but after you're// done with the brokerwnsBroker.Stop();Please see this Wiki page for more information: https://github.com/Redth/PushSharp/wiki/Migrating-from-PushSharp-2.x-to-3.x
- APNS - Apple Push Notification Service
- Finish HTTP/2 support (currently in another branch)
- GCM - Google Cloud Messaging
- XMPP transport still under development
- Other
- More NUnit tests to be written, with a test GCM Server, and eventually Test servers for other platforms
- New Xamarin Client samples (how to setup each platform as a push client) will be built and live in a separate repository to be less confusing
Copyright 2012-2016 Jonathan Dick
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.