Device Token: πώς λειτουργεί, λήψη του token APNS και ενημέρωση

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-21 Χρόνος ανάγνωσης: 11 λεπ

Device Token — είναι ένα μοναδικό αναγνωριστικό που εκχωρεί το APNS σε κάθε συσκευή iOS για τη δρομολόγηση push ειδοποιήσεων. Το token δημιουργείται από το σύστημα κατά την εγγραφή της εφαρμογής για λήψη ειδοποιήσεων και πρέπει να μεταφερθεί στον διακομιστή για την αποστολή push σε αυτήν ακριβώς τη συσκευή. Σύμφωνα με τα Apple Developer Documentation, 2026, το Device Token μπορεί να αλλάξει κατά την επανεγκατάσταση της εφαρμογής, την επαναφορά της συσκευής από αντίγραφο ασφαλείας ή την ενημέρωση iOS, επομένως ο διακομιστής πρέπει να ενημερώνει τακτικά τα tokens για να διασφαλίζει την παράδοση.

Κύρια σημεία

  • Μοναδικότητα — Το Device Token είναι μοναδικό για κάθε ζεύγος “εφαρμογή + συσκευή” σε συγκεκριμένο περιβάλλον APNS (sandbox/production).
  • Μη μονιμότητα — Το token μπορεί να αλλάξει κατά την επανεγκατάσταση της εφαρμογής, την επαναφορά από αντίγραφο ασφαλείας ή την ενημέρωση iOS, επομένως απαιτείται μηχανισμός ενημέρωσης στον διακομιστή.
  • Εγγραφή — Η εφαρμογή ζητά άδεια για ειδοποιήσεις μέσω του UNUserNotificationCenter, μετά την οποία το σύστημα επιστρέφει το Device Token στον εκπρόσωπο AppDelegate.
  • APNS Sandbox vs Production — Για ανάπτυξη χρησιμοποιείται το sandbox περιβάλλον APNS με ξεχωριστό πιστοποιητικό· τα production tokens διαφέρουν και γίνονται δεκτά μόνο από το production APNS.
  • Μορφή token — Μια 32-byte hex συμβολοσειρά, η οποία μεταφέρεται στον διακομιστή και χρησιμοποιείται στην κεφαλίδα apns-topic κατά την αποστολή push ειδοποίησης.

Τι είναι το Device Token

Device Token (token συσκευής) — είναι ένα μοναδικό αναγνωριστικό σε μορφή hex συμβολοσειράς, το οποίο το APNS (Apple Push Notification Service) δημιουργεί για κάθε εφαρμογή σε μια συσκευή iOS. Το token είναι το κλειδί μέσω του οποίου ο διακομιστής στέλνει push ειδοποιήσεις σε μια συγκεκριμένη συσκευή. Χωρίς ένα έγκυρο Device Token, ο διακομιστής δεν μπορεί να παραδώσει push — το APNS απορρίπτει το αίτημα με σφάλμα 400 BadRequest.

Πώς δημιουργείται το token

Το Device Token δημιουργείται από το σύστημα iOS κατά την πρώτη επικοινωνία της εφαρμογής με το APNS μετά την εγκατάσταση. Η διαδικασία δημιουργίας περιλαμβάνει κρυπτογραφική σύνδεση με το αναγνωριστικό της εφαρμογής (bundle ID) και το μοναδικό αναγνωριστικό της συσκευής (UID), μετά την οποία το APNS επιστρέφει στην εφαρμογή ένα 32-byte token σε hex μορφή (64 χαρακτήρες). Το token δεν είναι μόνιμο — το σύστημα μπορεί να δημιουργήσει ένα νέο υπό ορισμένες συνθήκες.

Ο ρόλος του token στην παράδοση push ειδοποιήσεων

Όταν ο διακομιστής στέλνει μια push ειδοποίηση, συμπεριλαμβάνει το Device Token στο HTTP/2 αίτημα προς το APNS. Το APNS ελέγχει την εγκυρότητα του token: αν το token ανήκει σε διαφορετικό περιβάλλον (sandbox αντί για production), έχει λήξει ή έχει ανακληθεί, ο διακομιστής της Apple επιστρέφει σφάλμα 410 Gone ή 400 BadRequest. Μόνο μετά από επιτυχή επικύρωση του token, το APNS ξεκινά την παράδοση της ειδοποίησης στη συσκευή.

Διαφορά Device Token από άλλα αναγνωριστικά

Το Device Token δεν πρέπει να συγχέεται με το IDFA (Identifier for Advertisers), το IDFV (Identifier for Vendor) ή το UID (Unique Device Identifier). IDFA και IDFV χρησιμοποιούνται για διαφήμιση και αναλυτικά, το UID είναι ο υλικός σειριακός αριθμός. Το Device Token υπάρχει αποκλειστικά για push ειδοποιήσεις και δεν αποκαλύπτει πληροφορίες για τον χρήστη ή τη συσκευή πέρα από το APNS.

ΑναγνωριστικόΣκοπόςΜονιμότητα
Device TokenΔρομολόγηση push ειδοποιήσεων APNSΜπορεί να αλλάξει
IDFAΔιαφήμιση και παρακολούθησηΕπαναφέρεται από τον χρήστη
IDFVΑναγνώριση προμηθευτή (αναλυτικά)Μόνιμο για εφαρμογές του ίδιου προγραμματιστή
Bundle IDΜοναδικό αναγνωριστικό εφαρμογήςΜόνιμο

Πώς η συσκευή λαμβάνει και εγγράφει το token

Η διαδικασία λήψης του Device Token αποτελείται από πολλά υποχρεωτικά βήματα, ξεκινώντας από το αίτημα άδειας από τον χρήστη και καταλήγοντας στη μεταφορά του token στον διακομιστή. Κάθε βήμα είναι κρίσιμο — η παράλειψη οποιουδήποτε από αυτά οδηγεί σε αδυναμία αποστολής push ειδοποιήσεων στη συσκευή.

Αίτημα άδειας για ειδοποιήσεις

Το πρώτο βήμα είναι η εφαρμογή να ζητήσει από τον χρήστη άδεια αποστολής ειδοποιήσεων μέσω του UNUserNotificationCenter.current().requestAuthorization. Ο χρήστης μπορεί να συμφωνήσει, να αρνηθεί ή να επιλέξει προαιρετικές επιλογές (alert, badge, sound). Χωρίς ρητή συγκατάθεση του χρήστη, το σύστημα δεν θα εκδώσει Device Token, ακόμα κι αν η εφαρμογή καλέσει το registerForRemoteNotifications. Αφού λάβει την άδεια, η εφαρμογή καλεί το UIApplication.shared.registerForRemoteNotifications(), το οποίο εκκινεί τη διαδικασία εγγραφής στο APNS.

Λήψη του token από το APNS

Μετά την εγγραφή, το APNS επιστρέφει το token μέσω του εκπροσώπου AppDelegate: application(_:didRegisterForRemoteNotificationsWithDeviceToken:). Η επιτυχής κλήση περιέχει ένα αντικείμενο Data με το token, το οποίο πρέπει να μετατραπεί σε hex συμβολοσειρά για μεταφορά στον διακομιστή. Σε περίπτωση σφάλματος, το σύστημα καλεί το application(_:didFailToRegisterForRemoteNotificationsWithError:) με περιγραφή του προβλήματος: εσφαλμένη ρύθμιση πιστοποιητικών, απουσία δικτύου ή λανθασμένη διαμόρφωση του έργου.

Μεταφορά του token στον διακομιστή σας

Αφού λάβει το token, η εφαρμογή πρέπει να το μεταφέρει αμέσως στον διακομιστή σας για αποθήκευση στη βάση δεδομένων. Το API αίτημα περιλαμβάνει το token, το αναγνωριστικό συσκευής (για αντιστοίχιση), το περιβάλλον (sandbox/production) και προαιρετικά πρόσθετα δεδομένα: έκδοση OS, μοντέλο συσκευής, γλώσσα. Συνιστάται η επανάληψη της μεταφοράς του token σε κάθε εκκίνηση της εφαρμογής, ώστε ο διακομιστής να έχει πάντα το πιο πρόσφατο token.

swift
// Αίτηση άδειας και εγγραφή στο APNS
func registerForPushNotifications() {
    UNUserNotificationCenter.current()
        .requestAuthorization(options: [.alert, .sound, .badge]) {
        [weak self] granted, error in
        guard granted else {
            print("Δεν δόθηκε άδεια")
            return
        }
        DispatchQueue.main.async {
            UIApplication.shared
                .registerForRemoteNotifications()
        }
    }
}

// Λήψη Device Token από APNS
func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    let tokenString = deviceToken
        .map { String(format: "%02.2hhx", $0) }
        .joined()
    print("Device Token: \(tokenString)")

    // Αποστολή token στον διακομιστή
    PushTokenService.shared
        .sendTokenToServer(tokenString) { success in
        if success {
            UserDefaults.standard.set(tokenString,
                forKey: "lastDeviceToken")
        }
    }
}

Διαχείριση tokens στην πλευρά του διακομιστή

Η πλευρά του διακομιστή του push συστήματος πρέπει να αποθηκεύει το Device Token στη βάση δεδομένων, συσχετισμένο με τον χρήστη και το περιβάλλον. Κατά την αποστολή ειδοποίησης, ο διακομιστής δημιουργεί ένα αίτημα προς το APNS, συμπεριλαμβάνοντας το token στο URL και ένα JWT token (ή πιστοποιητικό) για εξουσιοδότηση. Η σωστή διαχείριση tokens επηρεάζει κρίσιμα το ποσοστό παράδοσης push ειδοποιήσεων.

Δομή βάσης δεδομένων tokens

Ο πίνακας tokens στον διακομιστή πρέπει να περιέχει τουλάχιστον: Device Token (μοναδικό), αναγνωριστικό χρήστη, περιβάλλον (sandbox/production), ημερομηνία τελευταίας ενημέρωσης και κατάσταση (ενεργό/ανενεργό). Συνιστάται η προσθήκη ευρετηρίου για το token για γρήγορη αναζήτηση κατά την αποστολή και για τον χρήστη για λήψη λίστας όλων των συσκευών του χρήστη. Πολλές εφαρμογές επιτρέπουν σε έναν χρήστη να έχει πολλές συσκευές — η καθεμία με το δικό της token.

Εξουσιοδότηση αιτημάτων προς APNS

Για την αποστολή push ειδοποιήσεων, ο διακομιστής πρέπει να εξουσιοδοτήσει το αίτημα προς το APNS με δύο τρόπους. Certificate-based χρησιμοποιεί ένα SSL πιστοποιητικό που δημιουργείται στο Apple Developer Console. Token-based χρησιμοποιεί JWT (JSON Web Token) με κλειδί .p8, το οποίο ισχύει έως 30 ημέρες χωρίς ανάγκη ενημέρωσης πιστοποιητικού. Η εξουσιοδότηση βάσει token θεωρείται πιο σύγχρονη και συνιστάται από την Apple για νέα έργα.

Δημιουργία HTTP/2 αιτήματος APNS

Το αίτημα προς το APNS περιλαμβάνει HTTP/2 μέθοδο POST, URL με διαδρομή /3/device/{device_token}, κεφαλίδες εξουσιοδότησης και σώμα JSON με το payload. Η κεφαλίδα apns-topic περιέχει υποχρεωτικά το bundle ID της εφαρμογής. Το apns-priority καθορίζει την προτεραιότητα παράδοσης (5 — άμεσα, 10 — εξοικονόμηση μπαταρίας). Το apns-expiration ορίζει τον χρόνο σε δευτερόλεπτα από την εποχή, έως τον οποίο το APNS θα προσπαθεί να παραδώσει την ειδοποίηση.

js
// Παράδειγμα αποστολής push στο Node.js μέσω APNS HTTP/2
const http2 = require('http2');
const client = http2.connect('https://api.push.apple.com');

const deviceToken = 'abcdef0123456789...';
const payload = JSON.stringify({
    "aps": { "alert": "Hello!", "sound": "default" }
});

const req = client.request({
    ':method': 'POST',
    ':path': `/3/device/${deviceToken}`,
    'apns-topic': 'com.example.app',
    'apns-priority': '10',
    'apns-expiration': '0',
    'authorization': `bearer ${jwtToken}`
});
req.write(payload);
req.end();
req.on('response', (headers) => {
    if (headers[':status'] === '200') {
        console.log('Το Push στάλθηκε επιτυχώς');
    }
});

Μαζική αποστολή και ρύθμιση ταχύτητας

Κατά την αποστολή push ειδοποιήσεων σε μεγάλο αριθμό συσκευών, χρησιμοποιήστε μαζική αποστολή με έλεγχο ταχύτητας. Το APNS συνιστά να μην υπερβαίνετε τα 1500 αιτήματα ανά δευτερόλεπτο ανά σύνδεση. Όταν ξεπεραστεί το όριο, ο διακομιστής της Apple επιστρέφει σφάλμα 429 Too Many Requests. Για μαζικές αποστολές, χρησιμοποιήστε πολλαπλές συνδέσεις και κατανείμετε το φορτίο ομοιόμορφα στις συσκευές.

Ενημέρωση και ακύρωση tokens

Το Device Token δεν είναι μόνιμο και μπορεί να αλλάξει σε διάφορα σενάρια, απαιτώντας από τον διακομιστή έναν μηχανισμό ενημέρωσης. Αν ο διακομιστής συνεχίσει να στέλνει push σε ένα παλιό token, το APNS επιστρέφει σφάλμα 410 Gone, υποδεικνύοντας ότι το token δεν είναι πλέον έγκυρο για αυτό το περιβάλλον.

Πότε αλλάζει το token

Η Apple τεκμηριώνει αρκετά σενάρια κατά τα οποία το Device Token αλλάζει: ο χρήστης επανεγκαθιστά την εφαρμογή, επαναφέρει τη συσκευή από αντίγραφο ασφαλείας iCloud, εγκαθιστά μια νέα έκδοση iOS, καθώς και κατά την επαναφορά ρυθμίσεων δικτύου ή απορρήτου. Σε κάθε περίπτωση, η εφαρμογή κατά την επόμενη εκκίνηση θα λάβει ένα νέο token από το APNS. Ο διακομιστής πρέπει να ενημερώσει το token στη βάση δεδομένων, διαγράφοντας το παλιό και αποθηκεύοντας το νέο.

Διαχείριση σφάλματος 410 Gone από APNS

Όταν ο διακομιστής στέλνει push σε ένα παλιό token, το APNS επιστρέφει HTTP 410 με την κεφαλίδα apns-unless-timestamp. Αυτή η κεφαλίδα υποδεικνύει τον χρόνο από τον οποίο το token κατέστη άκυρο. Ο διακομιστής πρέπει άμεσα να διαγράψει ή να απενεργοποιήσει αυτό το token στη βάση δεδομένων, ώστε να μην στέλνει ξανά σε αυτό. Η αγνόηση του σφάλματος 410 οδηγεί σε σπατάλη πόρων και μείωση του ποσοστού παράδοσης.

Περιοδικός καθαρισμός ανενεργών tokens

Για τη διατήρηση της βάσης tokens σε ενημερωμένη κατάσταση, συνιστάται η εκτέλεση περιοδικού καθαρισμού. Το σενάριο καθαρισμού αναλύει τα αρχεία καταγραφής APNS των τελευταίων N ημερών, βρίσκει όλα τα tokens για τα οποία ελήφθη σφάλμα 410 και τα απενεργοποιεί στη βάση δεδομένων. Επιπλέον, μπορείτε να διαγράφετε tokens για τα οποία δεν υπήρξε δραστηριότητα χρήστη για περισσότερες από 90 ημέρες — είναι άχρηστες εγγραφές που αυξάνουν το μέγεθος της βάσης δεδομένων.

Έλεγχος tokens πριν από μαζική αποστολή

Πριν από τη μαζική αποστολή push ειδοποιήσεων (διανομή, προωθητική καμπάνια), συνιστάται ο προληπτικός έλεγχος εγκυρότητας των tokens. Το APNS δεν παρέχει άμεσο API για μαζική επικύρωση tokens, επομένως χρησιμοποιείται η στρατηγική αποστολής δοκιμαστικού push με χαμηλή προτεραιότητα και ανάλυση σφαλμάτων. Τα tokens που επιστρέφουν σφάλμα 410 εξαιρούνται από την κύρια αποστολή.

Παράδειγμα κώδικα για λήψη Device Token

Ας δούμε τον πλήρη κύκλο λήψης Device Token σε Swift, συμπεριλαμβανομένης της διαχείρισης σφαλμάτων και της μεταφοράς στον διακομιστή. Ο κώδικας καλύπτει το αίτημα άδειας, την εγγραφή στο APNS, τη μετατροπή Data σε hex συμβολοσειρά, τη διαχείριση σφαλμάτων και την αποστολή του token στον δικό σας διακομιστή με επαναληπτικές προσπάθειες σε περίπτωση αποτυχίας.

swift
import UIKit
import UserNotifications

final class PushNotificationManager: NSObject {

    static let shared = PushNotificationManager()
    private let apiClient = APIClient()
    private var currentToken: String?

    func register() {
        UNUserNotificationCenter.current()
            .requestAuthorization(
                options: [.alert, .badge, .sound]) {
            [weak self] granted, error in
            guard granted else {
                Analytics.log(
                    "Push permission denied")
                return
            }
            DispatchQueue.main.async {
                UIApplication.shared
                    .registerForRemoteNotifications()
            }
        }
    }

    func handleDeviceToken(_ tokenData: Data) {
        let token = tokenData
            .map { String(format: "%02.2hhx", $0) }
            .joined()

        guard token != currentToken else { return }
        currentToken = token
        sendTokenToServer(token)
    }

    func handleRegistrationError(_ error: Error) {
        Analytics.log(
            "Push registration failed: \(error)")

        // Επανάληψη μετά από καθυστέρηση σε σφάλματα δικτύου
        if let urlError = error as? URLError,
            urlError.code == .notConnectedToInternet {
            DispatchQueue.main.asyncAfter(
                deadline: .now() + 10) { [weak self] in
                self?.register()
            }
        }
    }

    private func sendTokenToServer(_ token: String) {
        let body = PushTokenRequest(
            token: token,
            environment: Environment.current == .debug
                ? "sandbox" : "production",
            osVersion: UIDevice.current.systemVersion,
            locale: Locale.current.identifier
        )
        apiClient.sendToken(body) { [weak self] result in
            if case .success = result {
                self?.currentToken = token
            }
        }
    }
}

Διαχείριση σφαλμάτων κατά την εγγραφή

Τα σφάλματα κατά την εγγραφή στο APNS μπορεί να προκληθούν από διάφορες αιτίες. Τα πιο συνηθισμένα είναι η απουσία δικτύου, η εσφαλμένη ρύθμιση πιστοποιητικών στο Xcode (π.χ. απενεργοποιημένη δυνατότητα Push Notifications), η χρήση εξομοιωτή (ο οποίος δεν υποστηρίζει push) ή λανθασμένο προφίλ προμήθειας. Στην παραγωγή, είναι σημαντικό να καταγράφετε τα σφάλματα και, αν είναι δυνατόν, να επαναλαμβάνετε την εγγραφή κατά την επόμενη εκκίνηση της εφαρμογής.

Δοκιμή Device Token στον εξομοιωτή

Ο iOS Simulator δεν υποστηρίζει τη λήψη πραγματικού Device Token. Για δοκιμή εγγραφής στον εξομοιωτή, χρησιμοποιήστε ελέγχους αρχιτεκτονικής i386: σε debug έκδοση μπορείτε να προσομοιώσετε τη λήψη token ή να χρησιμοποιήσετε UI δοκιμές με mock αντικείμενα. Η πραγματική δοκιμή push ειδοποιήσεων εκτελείται πάντα σε φυσική συσκευή συνδεδεμένη στο Xcode.

Συχνές ερωτήσεις

Μπορεί το Device Token να αλλάξει για τον ίδιο χρήστη;

Ναι, το Device Token μπορεί να αλλάξει κατά την επανεγκατάσταση της εφαρμογής, την επαναφορά της συσκευής από αντίγραφο ασφαλείας ή την ενημέρωση iOS. Ο διακομιστής πρέπει να διαχειρίζεται τις ενημερώσεις tokens: όταν λαμβάνει ένα νέο token από μια γνωστή συσκευή — να αντικαθιστά το παλιό, όταν λαμβάνει σφάλμα 410 — να διαγράφει το token από τη βάση.

Ποια είναι η μορφή του Device Token;

Το Device Token είναι μια 32-byte hex συμβολοσειρά από 64 χαρακτήρες σε πεζά γράμματα (0–9, a–f). Παράδειγμα: “a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2”. Το token μεταφέρεται ως Data από το APNS και μετατρέπεται σε συμβολοσειρά από την εφαρμογή.

Ποια είναι η διαφορά μεταξύ sandbox και production token;

Το Sandbox token εκδίδεται για εφαρμογές που έχουν μεταγλωττιστεί με προφίλ προμήθειας ανάπτυξης και λειτουργεί μόνο με το api.sandbox.push.apple.com. Το Production token — για App Store και TestFlight, λειτουργεί με το api.push.apple.com. Ο διακομιστής πρέπει να διακρίνει τα περιβάλλοντα και να στέλνει push στο αντίστοιχο APNS endpoint.

Τι να κάνω αν ο διακομιστής λάβει σφάλμα 410 από το APNS;

Το σφάλμα 410 Gone σημαίνει ότι το Device Token δεν είναι έγκυρο. Ο διακομιστής πρέπει άμεσα να διαγράψει αυτό το token από τη βάση δεδομένων και να σταματήσει τις προσπάθειες αποστολής σε αυτό. Η κεφαλίδα apns-unless-timestamp στην απάντηση υποδεικνύει από πότε το token σταμάτησε να λειτουργεί.

Πώς μπορώ να ελέγξω ότι η εφαρμογή έλαβε το Device Token;

Ελέγξτε την κλήση του εκπροσώπου application(_:didRegisterForRemoteNotificationsWithDeviceToken:) στο AppDelegate. Αν η μέθοδος καλείται — το token ελήφθη. Χρησιμοποιήστε debugging logs ή OSLog για εμφάνιση του token στην κονσόλα Xcode. Σε φυσική συσκευή, ελέγξτε ότι το token αποστέλλεται στον διακομιστή μέσω του Network Link Conditioner.

Σύνοψη

  • Device Token — μοναδικό 64-χαρακτήρων hex αναγνωριστικό συσκευής στο APNS, απαραίτητο για τη δρομολόγηση push ειδοποιήσεων.
  • Λήψη token — η διαδικασία περιλαμβάνει αίτημα άδειας από τον χρήστη, εγγραφή στο APNS μέσω registerForRemoteNotifications και διαχείριση στον εκπρόσωπο AppDelegate.
  • Το token δεν είναι μόνιμο — μπορεί να αλλάξει κατά την επανεγκατάσταση της εφαρμογής, την επαναφορά από αντίγραφο ασφαλείας ή την ενημέρωση iOS· απαιτείται μηχανισμός ενημέρωσης στον διακομιστή.
  • Sandbox vs Production — διαφορετικά περιβάλλοντα APNS χρησιμοποιούν διαφορετικά tokens και endpoints· ο διακομιστής πρέπει να προσδιορίζει σωστά το περιβάλλον κατά την αποστολή.
  • Διαχείριση στον διακομιστή — τα tokens αποθηκεύονται στη βάση δεδομένων με σύνδεση στον χρήστη, το περιβάλλον και την κατάσταση· το σφάλμα 410 Gone σηματοδοτεί την ακυρότητα του token.
  • Εξουσιοδότηση APNS — ο διακομιστής χρησιμοποιεί JWT token ή SSL πιστοποιητικό για αυθεντικοποίηση αιτημάτων· το JWT συνιστάται από την Apple για νέα έργα.
  • Device Token — θεμελιώδες συστατικό της push υποδομής, από τη σωστή λήψη και αποθήκευση του οποίου εξαρτάται η παράδοση κάθε ειδοποίησης.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης