Push-meddelanden i iOS
Viktig
Informationen i det här avsnittet gäller iOS 9 och tidigare, den har lämnats här för att stödja äldre iOS-versioner. För iOS 10 och senare kan du läsa guiden User Notification Framework för stöd för både lokala och fjärranslutna meddelanden på en iOS-enhet.
Push-meddelanden ska hållas korta och endast innehålla tillräckligt med data för att meddela mobilprogrammet att det ska kontakta serverprogrammet för en uppdatering. När ett nytt e-postmeddelande till exempel tas emot meddelar serverprogrammet bara mobilprogrammet att det har kommit en ny e-post. Meddelandet innehåller inte själva det nya e-postmeddelandet. Mobilprogrammet skulle sedan hämta de nya e-postmeddelandena från servern när det var lämpligt
I centrum för push-meddelanden i iOS finns Apple Push Notification Gateway Service (APNS). Det här är en tjänst som tillhandahålls av Apple och som ansvarar för att dirigera meddelanden från en programserver till iOS-enheter.
Följande bild illustrerar topologin för push-meddelanden för iOS:
Själva fjärrmeddelanden är JSON-formaterade strängar som följer det format och protokoll som anges i avsnittet Meddelandenyttolast i programmeringsguiden för lokala meddelanden och push-meddelanden i iOS-utvecklardokumentationen.
Apple har två miljöer med APNS: en Sandbox- och en Production-miljö. Sandbox-miljön är avsedd för testning under utvecklingsfasen och finns på gateway.sandbox.push.apple.com
på TCP-port 2195. Produktionsmiljön är avsedd att användas i program som har distribuerats och finns på gateway.push.apple.com
på TCP-port 2195.
Krav
Push-meddelanden måste följa följande regler som styrs av APNS-arkitekturen:
- meddelandegräns på 256 byte – Meddelandets hela storlek får inte överstiga 256 byte.
- Ingen kvittobekräftelse – APNS ger inte avsändaren något meddelande om att ett meddelande har skickats till den avsedda mottagaren. Om enheten inte kan nås och flera sekventiella meddelanden skickas, kommer alla meddelanden utom det senaste meddelandet att gå förlorade. Endast det senaste meddelandet levereras till enheten.
- Varje program kräver ett säkert certifikat – Kommunikation med APNS måste ske via SSL.
Skapa och använda certifikat
Var och en av de miljöer som nämns i föregående avsnitt kräver ett eget certifikat. Det här avsnittet beskriver hur du skapar ett certifikat, associerar det med en etableringsprofil och sedan hämtar ett Personal Information Exchange-certifikat för användning med PushSharp.
Om du vill skapa ett certifikat går du till iOS-etableringsportalen på Apples webbplats, enligt följande skärmbild (lägg märke till menyalternativet App-ID:n till vänster):
Gå sedan till app-ID:ts avsnitt och skapa ett nytt app-ID enligt följande skärmbild:
När du klickar på knappen + kan du ange beskrivningen och en paketidentifierare för app-ID:t, som du ser i nästa skärmbild:
Se till att välja explicit app-ID och att paketidentifieraren inte slutar med en
*
. Detta skapar en identifierare som är bra för flera program, och push-meddelandecertifikat måste vara för ett enda program.Under App Services väljer du Push-meddelanden:
Tryck på Skicka för att bekräfta registreringen av det nya app-ID:t:
Därefter måste du skapa certifikatet för app-ID:t. I det vänstra navigeringsfältet bläddrar du till Certifikat > Alla och väljer knappen
+
, som du ser på följande skärmbild:Välj om du vill använda ett utvecklings- eller produktionscertifikat:
Välj sedan det nya app-ID som vi just har skapat:
Detta visar instruktioner som tar dig igenom processen att skapa en certifikatsigneringsbegäran med hjälp av Keychain Access-programmet på din Mac.
Nu när certifikatet har skapats måste det användas som en del av byggprocessen för att signera programmet så att det kan registreras med APN:er. Detta kräver att du skapar och installerar en etableringsprofil som använder certifikatet.
Om du vill skapa en utvecklingsetableringsprofil går du till avsnittet Etableringsprofiler och följer stegen för att skapa den med hjälp av app-ID:t som vi just har skapat.
När du har skapat profilen för provisionering öppnar du Xcode Organizer och uppdaterar den. Om etableringsprofilen som du skapade inte visas kan det vara nödvändigt att ladda ned profilen från iOS-etableringsportalen och importera den manuellt. Följande skärmbild visar ett exempel på organisatören med etableringsprofilen tillagd:
Nu måste vi konfigurera Xamarin.iOS-projektet så att det använder den här nyskapade etableringsprofilen. Detta görs från dialogrutan Projektalternativ under fliken iOS-paketsignering som på följande skärmbild:
Nu är programmet konfigurerat för att fungera med push-meddelanden. Det finns dock fortfarande några fler steg som krävs med certifikatet. Det här certifikatet är i DER-format som inte är kompatibelt med PushSharp, vilket kräver ett PKCS12-certifikat (Personal Information Exchange). Utför följande sista steg för att konvertera certifikatet så att det kan användas av PushSharp:
- Ladda ned certifikatfilen – Logga in på iOS-etableringsportalen, välj fliken Certifikat, välj det certifikat som är associerat med rätt etableringsprofil och välj Ladda ned .
- Open Keychain Access – Det här är ett GUI-gränssnitt till lösenordshanteringssystemet i OS X.
- Importera certifikatet – Om certifikatet inte redan är installerat fil... Importera objekt från menyn Åtkomst till nyckelring. Gå till certifikatet som exporterades ovan och välj det.
- Exportera certifikatet – Expandera certifikatet så att den associerade privata nyckeln visas, högerklicka på nyckeln och välj Exportera. Du uppmanas att ange ett filnamn och ett lösenord för den exporterade filen.
Nu är vi klara med certifikat. Vi har skapat ett certifikat som ska användas för att signera iOS-program och konverterat certifikatet till ett format som kan användas med PushSharp i ett serverprogram. Nu ska vi titta på hur iOS-program interagerar med APNS.
Registrera med APNS
Innan ett iOS-program kan ta emot fjärrmeddelanden måste det registreras med APNS. APNS genererar en unik enhetstoken och returnerar den till iOS-programmet. IOS-programmet tar sedan enhetstoken och registrerar sig sedan med programservern. När allt detta händer är registreringen klar och programservern kan skicka meddelanden till den mobila enheten.
I teorin kan enhetstoken ändras varje gång ett iOS-program registrerar sig med APNS, men i praktiken sker detta inte så ofta. Som en optimering kan en applikation cachelagra den senaste enhetstoken och bara uppdatera applikationsservern när den förändras. Följande diagram illustrerar registreringsprocessen och hämtningen av en enhetstoken:
Registrering med APNS hanteras i FinishedLaunching
-metoden för programdelegatklassen genom att anropa RegisterForRemoteNotificationTypes
på det aktuella UIApplication
objektet. När ett iOS-program registreras med APNS måste det också ange vilka typer av fjärrmeddelanden det vill ta emot. Dessa typer av fjärrmeddelanden deklareras i uppräkningen UIRemoteNotificationType
. Följande kodfragment är ett exempel på hur ett iOS-program kan registrera sig för att ta emot fjärraviseringar och märkesmeddelanden:
if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
var pushSettings = UIUserNotificationSettings.GetSettingsForTypes (
UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
new NSSet ());
UIApplication.SharedApplication.RegisterUserNotificationSettings (pushSettings);
UIApplication.SharedApplication.RegisterForRemoteNotifications ();
} else {
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);
}
APNS-registreringsbegäran sker i bakgrunden – när svaret tas emot anropar iOS metoden RegisteredForRemoteNotifications
i klassen AppDelegate
och skickar den registrerade enhetstoken. Token kommer att finnas i ett NSData
objekt. Följande kodfragment visar hur du hämtar den enhetstoken som APNS har angett:
public override void RegisteredForRemoteNotifications (
UIApplication application, NSData deviceToken)
{
// Get current device token
var DeviceToken = deviceToken.Description;
if (!string.IsNullOrWhiteSpace(DeviceToken)) {
DeviceToken = DeviceToken.Trim('<').Trim('>');
}
// Get previous device token
var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");
// Has the token changed?
if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
{
//TODO: Put your own logic here to notify your server that the device token has changed/been created!
}
// Save new device token
NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
}
Om registreringen misslyckas av någon anledning (till exempel om enheten inte är ansluten till Internet) anropar iOS FailedToRegisterForRemoteNotifications
på programdelegatklassen. Följande kodfragment visar hur du visar en avisering för användaren som informerar dem om att registreringen misslyckades:
public override void FailedToRegisterForRemoteNotifications (UIApplication application , NSError error)
{
new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null).Show();
}
Hushållning av enhetstoken
Enhetstoken upphör att gälla eller ändras över tid. På grund av detta måste serverprogram utföra viss städning och rensa dessa token som har upphört att gälla eller ändrats. När ett program skickar som push-meddelande till en enhet som har en token som har upphört att gälla registrerar OCH sparar APNS den förfallna token. Servrar kan sedan fråga APNS för att ta reda på vilka token som har upphört att gälla.
APNS används för att tillhandahålla en Feedback Service – en HTTPS-slutpunkt som autentiserar via certifikatet som skapades för att skicka push-meddelanden och skickar tillbaka data om vilka token som har upphört att gälla. Detta har blivit inaktuellt av Apple och tagits bort.
I stället finns det en ny HTTP-statuskod för ärendet som tidigare rapporterades av feedbacktjänsten:
410 – Enhetstoken är inte längre aktiv för ämnet.
Dessutom finns en ny timestamp
JSON-datanyckel i svarstexten:
Om värdet i statusrubriken är 410 är värdet för den här nyckeln den senaste gången som APN:erna bekräftade att enhetstoken inte längre var giltig för ämnet.
Sluta skicka meddelanden tills enheten registrerar en token med en senare tidsstämpel hos providern.
Sammanfattning
I det här avsnittet beskrivs viktiga begrepp kring push-meddelanden i iOS. Den förklarade rollen för Apple Push Notification Gateway Service (APNS). Den omfattade sedan skapandet och användningen av de säkerhetscertifikat som är nödvändiga för APNS. Slutligen avslutades det här dokumentet med en diskussion om hur programservrar kan använda Feedback Services för att sluta spåra utgångna enhetstoken.