Come implementare la notifica push in Xamarin con Firebase e Apple Push Notification con back-end C #
Durante la mia migrazione da Native Android e iOS a Xamarin.Forms, avevo deciso di utilizzare AppCenter Push per la mia notifica, poiché è gratuito e facile da usare (ovviamente ho trascorso una buona quantità di tempo per farlo funzionare poiché è relativamente nuovo cosa con meno indicazioni in linea). Puoi trovare la mia condivisione originale su Come implementare AppCenter Push API? .
Sono rimasto soddisfatto fino a quando Microsoft non ha annunciato che ritirerà AppCenter Push (https://devblogs.microsoft.com/appcenter/app-center-mbaas-retirement/) e ha incoraggiato l'utente a passare ad Azure (che è un servizio a pagamento). Ho deciso di tornare indietro per utilizzare l'FCM e l'APN nativi per la mia notifica push.
Il problema è che non ci sono tutorial diretti su come eseguire l'intera operazione. Ci sono problemi e soluzioni qua e là come iOS .P8 funziona solo su HTTP / 2 mentre il mio progetto è in esecuzione su .Net Framework che non è supportato. Solo .Net Core può utilizzare il protocollo HTTP / 2.
Risposte
Il mio progetto corrente viene eseguito su ASP.NET C # come back-end, che invia notifiche a Xamarin.Android e Xamarin.iOS utilizzando Xamarin.Forms. Se sei come me, trova la mia risposta di seguito, sto condividendo il backend C # completamente funzionante e la soluzione Xamarin.Forms di seguito. In modo che più utenti possano beneficiare del servizio GRATUITO invece di essere trasferiti al servizio a pagamento di Azure.
PARTE 1 Backend C # - Il backend ASP.NET di C #. Sarà diviso in 2 parti, per FCM e APN.
1.1) Firebase (FCM)
Per configurare FCM, dovrai registrare un account. Ci sono tonnellate di linee guida online, questa è una delle migliorihttps://xmonkeys360.com/2019/12/08/xamarin-forms-fcm-setup-configuration-part-i/. Ricordarsi di ottenere la chiave del server e scaricare il file google-services.json nel progetto Xamarin.Android. Fare clic con il pulsante destro del mouse e impostare l'azione di compilazione su " GoogleServiceJson " ( dove posso aggiungere google-services.json nell'app xamarin ).
Di seguito è riportato il mio Firebase
using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Web.Script.Serialization; namespace PushNotificationLibrary { public class FirebaseCloudMessagingPush { private const string WEB_ADDRESS = "https://fcm.googleapis.com/fcm/send"; private const string SENDER_ID = "YOUR SENDER ID"; private const string SERVER_KEY = "YOUR SERVER KEY"; public string SendNotification(string deviceToken, string title, string message, string priority = "high", int badge = 0, List<Tuple<string, string>> parameters = null) { var result = "-1"; var httpWebRequest = (HttpWebRequest)WebRequest.Create(WEB_ADDRESS); parameters = parameters ?? new List<Tuple<string, string>>(); httpWebRequest.ContentType = "application/json"; httpWebRequest.Headers.Add(string.Format("Authorization: key={0}", SERVER_KEY)); httpWebRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID)); httpWebRequest.Method = "POST"; if (title.Length > 100) title = title.Substring(0, 95) + "..."; //Message cannot exceed 100 if (message.Length > 100) message = message.Substring(0, 95) + "..."; JObject jObject = new JObject(); jObject.Add("to", deviceToken); jObject.Add("priority", priority); jObject.Add("content_available", true); JObject jObjNotification = new JObject(); jObjNotification.Add("body", message); jObjNotification.Add("title", title); jObject.Add("notification", jObjNotification); JObject jObjData = new JObject(); jObjData.Add("badge", badge); jObjData.Add("body", message); jObjData.Add("title", title); foreach (Tuple<string, string> parameter in parameters) { jObjData.Add(parameter.Item1, parameter.Item2); } jObject.Add("data", jObjData); var serializer = new JavaScriptSerializer(); using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { string json = jObject.ToString(); streamWriter.Write(json); streamWriter.Flush(); } var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { result = streamReader.ReadToEnd(); } return result; } } }
1.2) iOS (APN)
- Per gli APN, ci sono 2 modi di fare le cose. Uno sta usando il modo convenzionale .P12. Un altro modo è usare le chiavi di autenticazione Apple usando .P8. Preferisco usare .P8 perché il certificato .P12 scade ogni anno e deve essere aggiornato ogni anno . Il problema con l'utilizzo di .P8 è che utilizza HTTP / 2 che non è supportato in .Net Framework, ma per fortuna sono riuscito a superarlo. Fare riferimento a Come implementare le notifiche push basate su token Apple (utilizzando il file p8) in C #? , trova la mia risposta in quel post su come implementare il tutto per .Net Framework. * SE stai già utilizzando .Net Core, la risposta sarà simile alla mia, ma non devi utilizzare il WinHTTPHandler personalizzato. Solo il normale HTTPClient andrà bene.
PARTE 2 Xamarin.Forms - Successivamente, dovrai supportare la notifica nel tuo progetto Xamarin.Forms.
Per questa parte, non è affatto difficile. Tutto quello che devi fare è fare riferimentohttps://github.com/CrossGeeks/PushNotificationPlugin, scarica il Nuget e segui le istruzioni nel link per configurare i tuoi progetti Xamarin (Forms, Android, iOS).
L'unica cosa che desidero evidenziare è come e dove ottenere il token del tuo dispositivo. Inizialmente stavo cercando di ottenere il token del dispositivo al codice seguente (OnTokenRefresh). Ma noterai presto che questo codice non viene sempre chiamato, sospetto che verrà chiamato solo una volta che il token viene aggiornato e non ogni volta che esegui il debug. Per ottenere ogni volta il token del dispositivo, chiama un
CrossPushNotification.Current.Tokenpunto qualsiasi del progetto. Registra quel token del dispositivo sul tuo server back-end. E usa il token del dispositivo per inviare la notifica usando il mio codice nella PARTE 1 sopra.CrossPushNotification.Current.OnTokenRefresh += (s,p) => { System.Diagnostics.Debug.WriteLine($"TOKEN : {p.Token}"); };
Questo è tutto! È abbastanza facile, ma ho passato settimane a cercare di sbagliare prima di metterli insieme. Spero che sia in grado di risparmiare tempo prezioso agli altri.