Pushmeldingen in iOS
Belangrijk
De informatie in deze sectie heeft betrekking op iOS 9 en eerder, het is hier gebleven om oudere iOS-versies te ondersteunen. Voor iOS 10 en hoger raadpleegt u de handleiding User Notification Framework voor het ondersteunen van lokale en externe meldingen op een iOS-apparaat.
Pushmeldingen moeten kort worden gehouden en bevatten alleen voldoende gegevens om de mobiele toepassing op de hoogte te stellen dat deze contact moet opnemen met de servertoepassing voor een update. Wanneer er bijvoorbeeld nieuwe e-mail binnenkomt, geeft de servertoepassing alleen aan dat er nieuwe e-mail is aangekomen. De melding bevat niet het nieuwe e-mailbericht zelf. De mobiele toepassing haalt vervolgens de nieuwe e-mailberichten van de server op wanneer deze geschikt was
In het midden van pushmeldingen in iOS bevindt zich de APNS -(Apple Push Notification Gateway Service). Dit is een service van Apple die verantwoordelijk is voor het routeren van meldingen van een toepassingsserver naar iOS-apparaten.
In de volgende afbeelding ziet u de pushmeldingstopologie voor iOS:
Externe meldingen zelf zijn tekenreeksen met JSON-indeling die voldoen aan de indeling en protocollen die zijn opgegeven in de sectie Notification Payload van de Local and Push Notification Programming Guide in de documentatie voor iOS-ontwikkelaars.
Apple onderhoudt twee omgevingen van APNS: een Sandbox- en een Production-omgeving. De sandbox-omgeving is bedoeld voor testen tijdens de ontwikkelingsfase en vindt u op gateway.sandbox.push.apple.com
tcp-poort 2195. De productieomgeving is bedoeld om te worden gebruikt in toepassingen die zijn geïmplementeerd en die te vinden zijn op gateway.push.apple.com
op TCP-poort 2195.
Eisen
Pushmeldingen moeten de volgende regels observeren die worden bepaald door de architectuur van APNS:
- berichtlimiet van 256 bytes: de volledige berichtgrootte van de melding mag niet groter zijn dan 256 bytes.
- Geen bevestiging van ontvangstbevestiging : APNS geeft de afzender geen melding dat een bericht naar de beoogde ontvanger is verzonden. Als het apparaat onbereikbaar is en er meerdere sequentiële meldingen worden verzonden, gaan alle meldingen, behalve de meest recente, verloren. Alleen de meest recente melding wordt bezorgd op het apparaat.
- Elke toepassing vereist een beveiligd certificaat: communicatie met APNS moet worden uitgevoerd via SSL.
Certificaten maken en gebruiken
Voor elk van de omgevingen die in de vorige sectie worden genoemd, is hun eigen certificaat vereist. In deze sectie wordt beschreven hoe u een certificaat maakt, koppelt aan een inrichtingsprofiel en vervolgens een Exchange-certificaat voor persoonlijke gegevens opvragen voor gebruik met PushSharp.
Als u een certificaat wilt maken, gaat u naar de iOS-inrichtingsportal op de website van Apple, zoals wordt weergegeven in de volgende schermopname (let op het menu-item app-id's aan de linkerkant):
Navigeer vervolgens naar de sectie van de app-id en maak een nieuwe app-id, zoals wordt weergegeven in de volgende schermopname:
Wanneer u op de knop + klikt, kunt u de beschrijving en een bundel-id voor de app-id invoeren, zoals wordt weergegeven in de volgende schermopname:
Zorg ervoor dat u Expliciete App-ID selecteert en dat de Bundle-ID niet eindigt met een
*
. Hiermee maakt u een id die geschikt is voor meerdere toepassingen, en pushmeldingscertificaten moeten voor slechts één toepassing zijn.Onder App Services selecteer je pushmeldingen:
En druk op Verzenden om de registratie van de nieuwe app-id te bevestigen:
Vervolgens moet u het certificaat voor de app-id maken. Blader in het linkernavigatievenster naar Certificaten > Alle en selecteer de knop
+
, zoals wordt weergegeven in de volgende schermopname:Selecteer of u een ontwikkelings- of productiecertificaat wilt gebruiken:
Selecteer vervolgens de nieuwe app-id die we zojuist hebben gemaakt:
Hiermee worden instructies weergegeven waarmee u een aanvraag voor certificaatondertekening maakt met behulp van de sleutelhangertoegang toepassing op uw Mac.
Nu het certificaat is gemaakt, moet het worden gebruikt als onderdeel van het buildproces om de toepassing te ondertekenen, zodat het kan worden geregistreerd bij APNs. Hiervoor moet u een inrichtingsprofiel maken en installeren dat gebruikmaakt van het certificaat.
Als u een inrichtingsprofiel voor ontwikkeling wilt maken, gaat u naar de sectie Inrichtingsprofielen en volgt u de stappen om dit te maken met behulp van de app-id die we zojuist hebben gemaakt.
Nadat u het inrichtingsprofiel hebt gemaakt, opent u Xcode Organizer en vernieuwt u het. Als het inrichtingsprofiel dat u hebt gemaakt niet wordt weergegeven, is het mogelijk nodig om het profiel te downloaden vanuit de iOS-inrichtingsportal en het handmatig te importeren. In de volgende schermafbeelding ziet u een voorbeeld van de Organisator waarop het inrichtingsprofiel is toegevoegd:
Op dit moment moeten we het Xamarin.iOS-project configureren voor het gebruik van dit zojuist gemaakte inrichtingsprofiel. Dit gebeurt vanuit dialoogvenster Projectopties, onder tabblad iOS-bundelondertekening, zoals wordt weergegeven in de volgende schermafbeelding:
Op dit moment is de toepassing geconfigureerd voor gebruik met pushmeldingen. Er zijn echter nog enkele stappen vereist voor het certificaat. Dit certificaat heeft een DER-indeling die niet compatibel is met PushSharp, waarvoor een PKCS12-certificaat (Personal Information Exchange) is vereist. Voer de volgende laatste stappen uit om het certificaat zo te converteren dat het kan worden gebruikt door PushSharp:
- Download het certificaatbestand - Meld u aan bij de iOS-inrichtingsportal, kies het tabblad Certificaten, selecteer het certificaat dat is gekoppeld aan het juiste inrichtingsprofiel en kies Downloaden.
- Open Keychain Access: dit is een GUI-interface voor het wachtwoordbeheersysteem in OS X.
- het certificaat importeren: als het certificaat nog niet is geïnstalleerd, bestand... Items importeren vanuit het menu Sleutelhangertoegang. Navigeer naar het certificaat dat hierboven is geëxporteerd en selecteer het.
- Het certificaat exporteren- Vouw het certificaat uit zodat de bijbehorende persoonlijke sleutel zichtbaar is, klik met de rechtermuisknop op de sleutel en kies Exporteren. U wordt gevraagd om een bestandsnaam en een wachtwoord voor het geëxporteerde bestand.
Op dit moment zijn we klaar met certificaten. We hebben een certificaat gemaakt dat wordt gebruikt om iOS-toepassingen te ondertekenen en dat certificaat te converteren naar een indeling die kan worden gebruikt met PushSharp in een servertoepassing. Laten we nu eens kijken hoe iOS-toepassingen communiceren met APNS.
Registreren bij APNS
Voordat een iOS-toepassing externe melding kan ontvangen, moet deze zich registreren bij APNS. APNS genereert een uniek apparaattoken en retourneert dat naar de iOS-toepassing. De iOS-toepassing neemt vervolgens het apparaattoken op en registreert zich vervolgens bij de toepassingsserver. Zodra dit alles gebeurt, is de registratie voltooid en kan de toepassingsserver pushmeldingen verzenden naar het mobiele apparaat.
In theorie kan het apparaattoken steeds veranderen wanneer een iOS-toepassing zichzelf registreert bij APNS, maar in de praktijk gebeurt dit niet vaak. Als optimalisatie kan een toepassing het meest recente apparaattoken in de cache opslaan en alleen de toepassingsserver bijwerken wanneer deze wordt gewijzigd. In het volgende diagram ziet u het registratieproces en het verkrijgen van een apparaattoken:
Registratie bij APNS wordt afgehandeld in de FinishedLaunching
methode van de application delegate class door aanroep van RegisterForRemoteNotificationTypes
op het huidige UIApplication
-object. Wanneer een iOS-toepassing wordt geregistreerd bij APNS, moet deze ook opgeven welke typen externe meldingen deze wilt ontvangen. Deze externe meldingstypen worden gedeclareerd in de opsomming UIRemoteNotificationType
. Het volgende codefragment is een voorbeeld van hoe een iOS-toepassing kan registreren voor het ontvangen van externe waarschuwings- en badgemeldingen:
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);
}
De APNS-registratieaanvraag vindt plaats op de achtergrond. Wanneer het antwoord wordt ontvangen, roept iOS de methode aan RegisteredForRemoteNotifications
in de AppDelegate
-klasse en geeft het geregistreerde apparaattoken door. Het token bevindt zich in een NSData
-object. Het volgende codefragment laat zien hoe u het apparaattoken ophaalt dat APNS heeft opgegeven:
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");
}
Als de registratie om een of andere reden mislukt (zoals het apparaat niet is verbonden met internet), roept iOS FailedToRegisterForRemoteNotifications
aan op de gemachtigde klasse van de toepassing. In het volgende codefragment ziet u hoe u een waarschuwing weergeeft aan de gebruiker die hen informeert dat de registratie is mislukt:
public override void FailedToRegisterForRemoteNotifications (UIApplication application , NSError error)
{
new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null).Show();
}
Apparaattokenbeheer
Apparaattokens verlopen of worden na verloop van tijd gewijzigd. Hierdoor moeten servertoepassingen enkele opruimwerkzaamheden uitvoeren en deze verlopen of gewijzigde tokens verwijderen. Wanneer een toepassing als pushmelding verzendt naar een apparaat met een verlopen token, registreert EN slaat APNS dat verlopen token op. Servers kunnen vervolgens een query uitvoeren op APNS om erachter te komen welke tokens zijn verlopen.
APNS dat wordt gebruikt om een feedbackservice te bieden: een HTTPS-eindpunt dat wordt geverifieerd via het certificaat dat is gemaakt om pushmeldingen te verzenden en gegevens over welke tokens zijn verlopen. Dit is afgeschaft door Apple en verwijderd.
In plaats daarvan is er een nieuwe HTTP-statuscode voor de case die eerder is gerapporteerd door de Feedback-service:
410 - Het apparaattoken is niet meer actief voor het onderwerp.
Daarnaast wordt een nieuwe timestamp
JSON-gegevenssleutel weergegeven in de hoofdtekst van het antwoord:
Als de waarde in de header :status 410 is, is de waarde van deze sleutel de laatste keer waarop APN's hebben bevestigd dat het apparaattoken niet meer geldig was voor het onderwerp.
Pushmeldingen stoppen totdat het apparaat een token registreert met een latere tijdstempel bij uw provider.
Samenvatting
In deze sectie worden de belangrijkste concepten van pushmeldingen in iOS geïntroduceerd. De rol van de Apple Push Notification Gateway Service (APNS) is uitgelegd. Vervolgens werd het maken en gebruiken van de beveiligingscertificaten besproken die essentieel zijn voor APNS. Tot slot is dit document voltooid met een discussie over hoe toepassingsservers de Feedback Services kunnen gebruiken om het bijhouden van verlopen apparaattokens te stoppen.