APNS (Apple Push Notification Service) — η υποδομική υπηρεσία της Apple για την παράδοση push ειδοποιήσεων σε συσκευές του οικοσυστήματος: iPhone, iPad, Mac, Apple Watch και Apple TV. Η υπηρεσία εξασφαλίζει αξιόπιστη μετάδοση μηνυμάτων μέσω μόνιμης σύνδεσης TLS μεταξύ της συσκευής και των διακομιστών της Apple. Σύμφωνα με την Apple Developer Documentation, το APNS χρησιμοποιεί το πρωτόκολλο HTTP/2 για αμφίδρομη επικοινωνία με τους διακομιστές εφαρμογών.
Κύρια σημεία
Το Apple Push Notification Service (APNS) είναι η ιδιόκτητη υπηρεσία της Apple για τη δρομολόγηση push ειδοποιήσεων από τον διακομιστή εφαρμογής στις συσκευές των χρηστών. Σε αντίθεση με το FCM, το APNS δεν υποστηρίζει Android ή άλλες πλατφόρμες — είναι πλήρως συνδεδεμένο με το οικοσύστημα της Apple.
Η υπηρεσία λειτουργεί μέσω μόνιμης σύνδεσης TLS, την οποία κάθε συσκευή Apple δημιουργεί με τους διακομιστές APNS κατά την ενεργοποίηση. Αυτή η σύνδεση διατηρείται στο παρασκήνιο και χρησιμοποιείται για την παράδοση ειδοποιήσεων με ελάχιστη καθυστέρηση.
Το APNS αναλαμβάνει όλη την υποδομή παράδοσης: κρυπτογράφηση, αυθεντικοποίηση, προτεραιοποίηση και εκ νέου αποστολή σε περίπτωση μη διαθεσιμότητας της συσκευής. Ο προγραμματιστής χρειάζεται μόνο να παρέχει ένα σωστά διαμορφωμένο payload και ένα έγκυρο push token.
Αρχικά το APNS λειτουργούσε μέσω δυαδικού πρωτοκόλλου στη θύρα 2195–2196. Από το 2015 η Apple μετέφερε την υπηρεσία στο σύγχρονο πρωτόκολλο HTTP/2, το οποίο υποστηρίζει πολυπλεξία, συμπίεση κεφαλίδων και server push ειδοποιήσεις. Το HTTP/2 έγινε υποχρεωτικό από τον Ιούνιο του 2020.
Η διαδικασία παράδοσης μιας push ειδοποίησης μέσω APNS αποτελείται από πέντε στάδια: εγγραφή συσκευής, λήψη push token, αποστολή αιτήματος από τον διακομιστή, δρομολόγηση APNS και παράδοση στη συσκευή.
Εάν η συσκευή είναι μη διαθέσιμη (απενεργοποιημένη ή χωρίς δίκτυο), το APNS αποθηκεύει το τελευταίο μήνυμα για κάθε εφαρμογή και το παραδίδει όταν αποκατασταθεί η σύνδεση. Η μέγιστη διάρκεια αποθήκευσης είναι 4 εβδομάδες, μετά την οποία το μήνυμα διαγράφεται.
Η Apple υποστηρίζει δύο τρόπους αυθεντικοποίησης του διακομιστή εφαρμογής κατά την αποστολή push ειδοποιήσεων. Κάθε τρόπος έχει τα δικά του χαρακτηριστικά όσον αφορά τη διάρκεια ισχύος, τη διαχείριση και την ευκολία χρήσης.
| Παράμετρος | Token-based (p8) | Certificate-based (.p12) |
|---|---|---|
| Διάρκεια ισχύος | Αόριστη (το κλειδί δεν λήγει) | Περιορισμένη από τη διάρκεια του πιστοποιητικού (συνήθως 1 έτος) |
| Εναλλαγή | Δεν απαιτείται, εάν το κλειδί δεν έχει παραβιαστεί | Υποχρεωτική ετήσια αντικατάσταση |
| Πολλαπλές εφαρμογές | Ένα κλειδί για όλες τις εφαρμογές του λογαριασμού | Ξεχωριστό πιστοποιητικό για κάθε εφαρμογή |
| Περιβάλλον | Ένα κλειδί για Sandbox και Production | Διαφορετικά πιστοποιητικά για Sandbox και Production |
Token-based αυθεντικοποίηση — ο προτεινόμενος τρόπος από την Apple από το 2019. Δημιουργείτε ένα p8-κλειδί στο Apple Developer Console, το φορτώνετε στον διακομιστή και υπογράφετε κάθε APNS αίτημα με αυτό. Το κλειδί δεν λήγει και λειτουργεί για όλες τις εφαρμογές του λογαριασμού σας.
Για νέα έργα, η Token-based αυθεντικοποίηση είναι σαφώς προτιμότερη: ένα p8-κλειδί για ολόκληρο τον λογαριασμό, αόριστης διάρκειας, χωρίς δέσμευση σε περιβάλλον. Η Certificate-based (.p12) χρησιμοποιείται ακόμα σε παλαιότερα έργα, αλλά απαιτεί ετήσια αντικατάσταση και ξεχωριστά πιστοποιητικά για Sandbox και Production. Λάβετε υπόψη τη λήξη του πιστοποιητικού κατά τον προγραμματισμό CI/CD.
Το APNS υποστηρίζει τρεις τύπους push ειδοποιήσεων, οι οποίοι διαφέρουν ως προς τη συμπεριφορά στη συσκευή και τις απαιτήσεις χαρακτηριστικών του αιτήματος. Η επιλογή τύπου εξαρτάται από το σενάριο UX και τον επείγοντα χαρακτήρα του μηνύματος.
Για Background ειδοποιήσεις πρέπει να ορίσετε το κλειδί content-available: 1 και να ορίσετε προτεραιότητα 5 (ενεργειακά αποδοτική παράδοση). Το σύστημα μπορεί να περιορίσει τον αριθμό των παρασκηνιακών ειδοποιήσεων εάν η εφαρμογή δεν τις επεξεργάζεται έγκαιρα.
Το APNS υποστηρίζει δύο τιμές προτεραιότητας: 10 (άμεση παράδοση) και 5 (ενεργειακά αποδοτική). Για alert ειδοποιήσεις χρησιμοποιήστε 10 — ο χρήστης πρέπει να τις λάβει αμέσως. Για background ειδοποιήσεις χρησιμοποιήστε 5 — το σύστημα μπορεί να καθυστερήσει την παράδοση για εξοικονόμηση μπαταρίας. Η λανθασμένη προτεραιότητα για background μπορεί να οδηγήσει σε απόρριψη της ειδοποίησης από το APNS.
Το APNS δέχεται payload σε μορφή JSON με μέγιστο μέγεθος 4 KB για κανονικές ειδοποιήσεις και 5 KB για VOIP. Το payload περιέχει το υποχρεωτικό λεξικό aps με ρυθμίσεις εμφάνισης και προαιρετικά προσαρμοσμένα πεδία.
{
"aps": {
"alert": {
"title": "Νέο μήνυμα",
"body": "Έχετε 3 μη αναγνωσμένες συνομιλίες"
},
"badge": 3,
"sound": "default",
"category": "message_category",
"thread-id": "chat_room_42"
},
"customData": {
"chatId": "42"
}
}
Το κλειδί thread-id ομαδοποιεί τις ειδοποιήσεις στο Κέντρο Ειδοποιήσεων iOS. Το κλειδί category συνδέει την ειδοποίηση με UNNotificationCategory για εμφάνιση κουμπιών ενεργειών. Χωρίς αυτά τα κλειδιά, όλες οι ειδοποιήσεις εμφανίζονται μεμονωμένα.
Εκτός από το υποχρεωτικό λεξικό aps, το APNS payload μπορεί να περιέχει οποιαδήποτε προσαρμοσμένα πεδία στο ανώτερο επίπεδο. Αυτά τα πεδία είναι διαθέσιμα στην εφαρμογή μέσω του λεξικού userInfo κατά την επεξεργασία της ειδοποίησης. Τα προσαρμοσμένα δεδομένα είναι χρήσιμα για τη μεταφορά αναγνωριστικών οντοτήτων, οθονών ή συνδέσμων. Το μέγιστο μέγεθος payload είναι 4 KB, επομένως αποφύγετε τη μεταφορά μεγάλων όγκων δεδομένων μέσω push· φορτώστε τα μέσω API μετά το άνοιγμα της ειδοποίησης.
Για την αποστολή push ειδοποίησης στον διακομιστή, πρέπει να εκτελέσετε ένα POST αίτημα στο APNS endpoint με σωστές κεφαλίδες αυθεντικοποίησης. Παρακάτω δίνεται ένα παράδειγμα σε Node.js με χρήση Token-based αυθεντικοποίησης.
const http2 = require("http2")
const fs = require("fs")
const jwt = require("jsonwebtoken")
const token = jwt.sign(
{ iss: "TEAM_ID", iat: Math.floor(Date.now() / 1000) },
fs.readFileSync("AuthKey.p8"),
{ algorithm: "ES256", keyid: "KEY_ID" }
)
const payload = JSON.stringify({
aps: { alert: { title: "Γεια!", body: "Δοκιμαστικό push" } }
})
const client = http2.connect(
"https://api.push.apple.com"
)
const req = client.request({
":method": "POST",
":path": "/3/device/DEVICE_PUSH_TOKEN",
"authorization": "bearer " + token,
"apns-push-type": "alert",
"apns-topic": "com.example.app",
"apns-priority": "10"
})
req.end(payload)
req.on("response", (headers) => {
if (headers[":status"] === 200) {
console.log("Το Push στάλθηκε με επιτυχία")
}
})
Μετά την αποστολή, το APNS επιστρέφει HTTP κατάσταση 200 σε περίπτωση επιτυχούς παράδοσης ή κωδικό σφάλματος με περιγραφή στο σώμα της απάντησης. Είναι σημαντικό να χειρίζεστε το σφάλμα token-unregistered (410) — ένα τέτοιο token θα πρέπει να αφαιρεθεί από τον διακομιστή, καθώς η εφαρμογή έχει αφαιρεθεί από τη συσκευή.
Το APNS επιστρέφει HTTP καταστάσεις για κάθε αίτημα αποστολής. Επιτυχής αποστολή — κατάσταση 200. Τα σφάλματα απαιτούν διαφορετικές στρατηγικές χειρισμού. BadDeviceToken (400) ή Unregistered (410) — το token της συσκευής είναι παρωχημένο, πρέπει να αφαιρεθεί από τον διακομιστή. PayloadTooLarge (413) — υπέρβαση του ορίου των 4 KB, μειώστε το payload.
Σφάλμα TooManyRequests (429) — υπέρβαση του ορίου αιτημάτων. Το APNS ορίζει όριο στον αριθμό αποστολών ανά δευτερόλεπτο. Κατά τη λήψη 429, πρέπει να εφαρμοστεί εκθετική καθυστέρηση (exponential backoff) και να επαναληφθεί η αποστολή. Συνιστάται να μην υπερβαίνετε τα 100 αιτήματα ανά δευτερόλεπτο ανά σύνδεση HTTP/2.
Σφάλματα από την πλευρά του APNS — 500 και 503 (Internal Server Error / Service Unavailable). Πρόκειται για προσωρινές βλάβες της υποδομής της Apple. Σε τέτοιες περιπτώσεις, επαναλάβετε την αποστολή με καθυστέρηση 1–5 δευτερολέπτων, όχι περισσότερες από 3 προσπάθειες. Τα μόνιμα σφάλματα 5xx με πλήρως λειτουργικό διακομιστή είναι σπάνιο φαινόμενο, συνήθως σχετίζονται με προβλήματα TLS σύνδεσης.
Για το περιβάλλον Production, φροντίστε να υλοποιήσετε καταγραφή όλων των σφαλμάτων APNS με αναφορά του token, του κωδικού σφάλματος και της ώρας. Αυτό θα βοηθήσει στον γρήγορο εντοπισμό προβλημάτων με πιστοποιητικά, όρια ή συγκεκριμένα token συσκευών. Ελέγχετε τακτικά τη διάρκεια ισχύος των πιστοποιητικών, εάν χρησιμοποιείτε Certificate-based αυθεντικοποίηση.
Συχνές ερωτήσεις
Το APNS λειτουργεί μέσω TCP 443 (HTTPS) για HTTP/2 API. Προηγουμένως χρησιμοποιούνταν οι θύρες 2195 και 2196 για το δυαδικό πρωτόκολλο. Από τον Ιούνιο του 2020, η Apple απαιτεί αποκλειστική χρήση HTTP/2 στη θύρα 443. Βεβαιωθείτε ότι ο διακομιστής έχει πρόσβαση στο api.push.apple.com.
Sandbox — το δοκιμαστικό περιβάλλον APNS για αποσφαλμάτωση push ειδοποιήσεων. Production — το περιβάλλον παραγωγής για πραγματικούς χρήστες. Με Token-based αυθεντικοποίηση, ένα κλειδί λειτουργεί και για τα δύο περιβάλλοντα — το endpoint διαφέρει: api.sandbox.push.apple.com ή api.push.apple.com.
Το push token μπορεί να αλλάξει κατά: επαναφορά εφαρμογής από αντίγραφο ασφαλείας, επανεγκατάσταση εφαρμογής, ενημέρωση OS, επαναφορά ρυθμίσεων δικτύου. Το Token δεν αλλάζει κατά τις κανονικές ενημερώσεις εφαρμογής μέσω App Store. Ο διακομιστής πρέπει να χειρίζεται το σφάλμα BadDeviceToken (400) ως σήμα για διαγραφή του token.
4 KB (4096 byte) για κανονικές alert/background ειδοποιήσεις. Για VOIP ειδοποιήσεις μέσω PushKit — 5 KB (5120 byte). Η υπέρβαση του μεγέθους επιστρέφει σφάλμα PayloadTooLarge (413). Συνιστάται να διατηρείτε το payload ελάχιστο και να φορτώνετε επιπλέον δεδομένα μέσω διακομιστή.
Το APNS δεν μπορεί να παραδώσει ειδοποίηση σε συσκευή χωρίς σύνδεση στο διαδίκτυο. Εάν η συσκευή είναι εκτός σύνδεσης, το APNS αποθηκεύει το τελευταίο μήνυμα (ανά εφαρμογή ανά συσκευή) για έως 28 ημέρες. Κατά την αποκατάσταση της σύνδεσης, το μήνυμα παραδίδεται άμεσα. Παλαιότερα μηνύματα δεν αποθηκεύονται.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης