Device Token: qanday ishlaydi, APNS tokenini olish va yangilash

Muallif: IT Sectr Nashr etilgan: 2026-03-21 O'qish vaqti: 11 daq

Device Token — bu APNS push-bildirishnomalarini marshrutlash uchun har bir iOS qurilmasiga tayinlaydigan noyob identifikatordir. Token bildirishnomalarni olish uchun dastur ro‘yxatdan o‘tganida tizim tomonidan yaratiladi va aynan shu qurilmaga push yuborish uchun serverga uzatilishi kerak. Apple Developer Documentation, 2026 ma’lumotlariga ko‘ra, Device Token dasturni qayta o‘rnatish, qurilmani zaxiradan tiklash yoki iOS yangilashda o‘zgarishi mumkin, shuning uchun server yetkazib berishni ta’minlash uchun tokenlarni muntazam yangilab turishi kerak.

Asosiy fikrlar

  • Noyoblik — Device Token ma’lum bir APNS muhitida (sandbox/production) har bir “dastur + qurilma” juftligi uchun noyobdir.
  • Doimiylik emas — token dasturni qayta o‘rnatish, zaxiradan tiklash yoki iOS yangilashda o‘zgarishi mumkin; serverda yangilash mexanizmi talab qilinadi.
  • Ro‘yxatdan o‘tish — dastur UNUserNotificationCenter orqali bildirishnomalar uchun ruxsat so‘raydi, shundan so‘ng tizim AppDelegate delegatida Device Token ni qaytaradi.
  • APNS Sandbox vs Production — ishlab chiqish uchun alohida sertifikatli APNS sandbox muhiti ishlatiladi; ishlab chiqarish tokenlari farq qiladi va faqat ishlab chiqarish APNS tomonidan qabul qilinadi.
  • Token formati — 32 baytli hex qatori bo‘lib, serverga uzatiladi va push bildirishnomasini yuborishda apns-topic sarlavhasida ishlatiladi.

Device Token nima

Device Token (qurilma tokeni) — bu APNS (Apple Push Notification Service) iOS qurilmasidagi har bir dastur uchun yaratadigan hex qatori ko‘rinishidagi noyob identifikatordir. Token server ma’lum bir qurilmaga push bildirishnomalarini yuboradigan kalitdir. To‘g‘ri Device Tokensiz server push bildirishnomasini yetkaza olmaydi — APNS so‘rovni 400 BadRequest xatosi bilan rad etadi.

Token qanday shakllanadi

Device Token iOS tizimi tomonidan dastur o‘rnatilgandan so‘ng APNSga birinchi murojaatida yaratiladi. Yaratish jarayoni dastur identifikatori (bundle ID) va qurilmaning noyob identifikatori (UID) ga kriptografik bog‘lanishni o‘z ichiga oladi, shundan so‘ng APNS dasturga hex formatida (64 belgi) 32 baytli tokenni qaytaradi. Token doimiy emas — tizim ma’lum sharoitlarda yangisini yaratishi mumkin.

Tokenni push bildirishnomalarini yetkazishdagi roli

Server push bildirishnomasini yuborganida, APNSga HTTP/2 so‘roviga Device Token ni qo‘shadi. APNS tokenning haqiqiyligini tekshiradi: agar token boshqa muhitga tegishli bo‘lsa (sandbox o‘rniga production), muddati o‘tgan yoki bekor qilingan bo‘lsa, Apple serveri 410 Gone yoki 400 BadRequest xatosini qaytaradi. Faqat token muvaffaqiyatli tasdiqlangandan so‘ng, APNS bildirishnomani qurilmaga yetkazishni boshlaydi.

Device Token ni boshqa identifikatorlardan farqi

Device Token ni IDFA (reklama beruvchilar identifikatori), IDFV (sotuvchi identifikatori) yoki UID (qurilmaning noyob identifikatori) bilan aralashtirmaslik kerak. IDFA va IDFV reklama va tahlil uchun ishlatiladi, UID apparat seriya raqamidir. Device Token faqat push bildirishnomalari uchun mavjud va APNSdan tashqarida foydalanuvchi yoki qurilma haqida ma’lumotni oshkor etmaydi.

IdentifikatorMaqsadDoimiylik
Device TokenAPNS push bildirishnomalarini marshrutlashO‘zgarishi mumkin
IDFAReklama va kuzatishFoydalanuvchi tomonidan tiklanadi
IDFVSotuvchi identifikatsiyasi (tahlil)Bir dasturchining dasturlari uchun doimiy
Bundle IDDasturning noyob identifikatoriDoimiy

Qurilma tokenni qanday oladi va ro‘yxatdan o‘tkazadi

Device Token olish jarayoni bir nechta majburiy bosqichlardan iborat bo‘lib, foydalanuvchidan ruxsat so‘rashdan boshlanadi va tokenni serverga uzatish bilan tugaydi. Har bir bosqich muhim — ulardan birini o‘tkazib yuborish qurilmaga push bildirishnomalarini yuborishning imkonsizligiga olib keladi.

Bildirishnomalar uchun ruxsat so‘rash

Birinchi bosqichda dastur UNUserNotificationCenter.current().requestAuthorization orqali foydalanuvchidan bildirishnomalarni yuborish uchun ruxsat so‘raydi. Foydalanuvchi rozi bo‘lishi, rad etishi yoki ixtiyoriy variantlarni (alert, badge, sound) tanlashi mumkin. Foydalanuvchining aniq roziligisiz tizim Device Token ni chiqarmaydi, hatto dastur registerForRemoteNotifications ni chaqirsa ham. Ruxsat olingandan so‘ng, dastur UIApplication.shared.registerForRemoteNotifications() ni chaqiradi, bu APNSda ro‘yxatdan o‘tish jarayonini boshlaydi.

APNSdan tokenni olish

Ro‘yxatdan o‘tgandan so‘ng, APNS AppDelegate delegati orqali tokenni qaytaradi: application(_:didRegisterForRemoteNotificationsWithDeviceToken:). Muvaffaqiyatli chaqiruv serverga uzatish uchun hex qatoriga aylantirilishi kerak bo‘lgan tokenli Data obyektini o‘z ichiga oladi. Xato holatida tizim application(_:didFailToRegisterForRemoteNotificationsWithError:) ni muammo tavsifi bilan chaqiradi: sertifikatlarning noto‘g‘ri sozlamalari, tarmoq yo‘qligi yoki loyihaning noto‘g‘ri konfiguratsiyasi.

Tokenni o‘z serveringizga uzatish

Tokenni olgandan so‘ng, dastur uni darhol ma’lumotlar bazasida saqlash uchun o‘z serveriga uzatishi kerak. API so‘rovi token, qurilma identifikatori (moslashtirish uchun), muhit (sandbox/production) va ixtiyoriy qo‘shimcha ma’lumotlarni o‘z ichiga oladi: OT versiyasi, qurilma modeli, til. Server har doim dolzarb tokenga ega bo‘lishi uchun tokenni har bir dastur ishga tushirilganda qayta uzatish tavsiya etiladi.

swift
// Ruxsat so‘rash va APNSda ro‘yxatdan o‘tish
func registerForPushNotifications() {
    UNUserNotificationCenter.current()
        .requestAuthorization(options: [.alert, .sound, .badge]) {
        [weak self] granted, error in
        guard granted else {
            print("Ruxsat olinmadi")
            return
        }
        DispatchQueue.main.async {
            UIApplication.shared
                .registerForRemoteNotifications()
        }
    }
}

// APNSdan Device Token olish
func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    let tokenString = deviceToken
        .map { String(format: "%02.2hhx", $0) }
        .joined()
    print("Device Token: \(tokenString)")

    // Tokenni serverga yuborish
    PushTokenService.shared
        .sendTokenToServer(tokenString) { success in
        if success {
            UserDefaults.standard.set(tokenString,
                forKey: "lastDeviceToken")
        }
    }
}

Server tomonida tokenlar bilan ishlash

Server qismi push tizimi Device Token ni ma’lumotlar bazasida foydalanuvchi va muhit bilan bog‘langan holda saqlashi kerak. Bildirishnoma yuborishda server APNSga so‘rov yuboradi, unga tokenni URL va avtorizatsiya uchun JWT tokenini (yoki sertifikatni) qo‘shadi. Tokenlarni to‘g‘ri boshqarish push bildirishnomalarini yetkazish foiziga muhim ta’sir ko‘rsatadi.

Tokenlar ma’lumotlar bazasi tuzilmasi

Serverdagi tokenlar jadvali kamida quyidagilarni o‘z ichiga olishi kerak: Device Token (noyob), foydalanuvchi identifikatori, muhit (sandbox/production), oxirgi yangilanish sanasi va holat (faol/faol emas). Token bo‘yicha indeks yuborishda tez qidirish va foydalanuvchi bo‘yicha indeks foydalanuvchining barcha qurilmalari ro‘yxatini olish uchun tavsiya etiladi. Ko‘pgina dasturlar bir foydalanuvchiga bir nechta qurilmaga ega bo‘lishga imkon beradi — har biri o‘z tokeni bilan.

APNSga so‘rovlarni avtorizatsiya qilish

Push bildirishnomasini yuborish uchun server APNSga so‘rovni ikki usulda avtorizatsiya qilishi kerak. Sertifikatga asoslangan (Certificate-based) Apple Developer Console da yaratilgan SSL sertifikatidan foydalanadi. Tokenga asoslangan usul (Token-based) .p8 kaliti bilan JWT dan foydalanadi, u sertifikatni yangilashga hojat qoldirmasdan 30 kungacha amal qiladi. Tokenga asoslangan avtorizatsiya zamonaviyroq hisoblanadi va Apple tomonidan yangi loyihalar uchun tavsiya etiladi.

HTTP/2 APNS so‘rovini shakllantirish

APNSga so‘rov HTTP/2 POST usuli, /3/device/{device_token} yo‘li bilan URL, avtorizatsiya sarlavhalari va payload bilan JSON tanasini o‘z ichiga oladi. apns-topic sarlavhasi majburiy ravishda dasturning bundle ID sini o‘z ichiga oladi. apns-priority yetkazish ustuvorligini belgilaydi (5 — darhol, 10 — batareyani tejash). apns-expiration APNS bildirishnomani yetkazishga harakat qiladigan vaqtni epochdan boshlab soniyalarda belgilaydi.

js
// Node.js orqali APNS HTTP/2 yordamida push yuborish namunasi
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 sent successfully');
    }
});

Partiyali yuborish va tezlikni cheklash

Ko‘p sonli qurilmalarga push bildirishnomalarini yuborishda tezlikni nazorat qilish bilan partiyali yuborishdan foydalaning. APNS tavsiya qiladi har bir ulanishda soniyasiga 1500 so‘rovdan oshmaslikni. Cheklovdan oshib ketganda, Apple serveri 429 Too Many Requests xatosini qaytaradi. Keng ko‘lamli yuborishlar uchun bir nechta ulanishlardan foydalaning va yukni qurilmalar o‘rtasida teng taqsimlang.

Tokenlarni yangilash va bekor qilish

Device Token doimiy emas va bir nechta stsenariylarda o‘zgarishi mumkin, bu serverda yangilash mexanizmini talab qiladi. Agar server eskirgan tokenga push yuborishda davom etsa, APNS 410 Gone xatosini qaytaradi, bu token endi ushbu muhit uchun haqiqiy emasligini ko‘rsatadi.

Token qachon o‘zgaradi

Apple Device Token o‘zgaradigan bir nechta stsenariylarni hujjatlashtirgan: foydalanuvchi dasturni qayta o‘rnatadi, qurilmani iCloud zaxirasidan tiklaydi, iOS ning yangi versiyasini o‘rnatadi, shuningdek tarmoq yoki maxfiylik sozlamalarini tiklaganda. Har bir holatda dastur keyingi ishga tushirishda APNSdan yangi token oladi. Server ma’lumotlar bazasidagi tokenni yangilashi, eskisini o‘chirib, yangisini saqlashi kerak.

APNSdan 410 Gone xatosini boshqarish

Server eskirgan tokenga push yuborganda, APNS apns-unless-timestamp sarlavhasi bilan HTTP 410 ni qaytaradi. Bu sarlavha token bekor bo‘lgan vaqtni ko‘rsatadi. Server bu tokenni ma’lumotlar bazasida darhol o‘chirishi yoki faolsizlantirishi kerak, unga qayta yubormaslik uchun. 410 xatosini e’tiborsiz qoldirish resurslarni behuda sarflashga va yetkazish darajasining pasayishiga olib keladi.

Faol bo‘lmagan tokenlarni davriy tozalash

Tokenlar ma’lumotlar bazasini dolzarbligini saqlash uchun davriy tozalashni amalga oshirish tavsiya etiladi. Tozalash skripti oxirgi N kun ichidagi APNS loglarini tahlil qiladi, 410 xatosi olingan barcha tokenlarni topadi va ularni ma’lumotlar bazasida faolsizlantiradi. Qo‘shimcha ravishda, 90 kundan ortiq foydalanuvchi faolligi bo‘lmagan tokenlarni o‘chirish mumkin — bu faqat ma’lumotlar bazasi hajmini oshiradigan keraksiz yozuvlardir.

Ommaviy yuborishdan oldin tokenlarni tekshirish

Push bildirishnomalarini ommaviy yuborishdan oldin (axborotnoma, promo-kampaniya) tokenlarning dolzarbligini oldindan tekshirish tavsiya etiladi. APNS to‘g‘ridan-to‘g‘ri tokenlarni partiyali tekshirish uchun API taqdim etmaydi, shuning uchun past ustuvorlik bilan test push yuborish va xatolarni tahlil qilish strategiyasi qo‘llaniladi. 410 xatosini qaytargan tokenlar asosiy yuborishdan chiqarib tashlanadi.

Device Token olish uchun kod namunasi

Swift da Device Token olishning to‘liq sikli, jumladan xatolarni boshqarish va serverga uzatishni ko‘rib chiqamiz. Kod qamrab oladi ruxsat so‘rash, APNSda ro‘yxatdan o‘tish, Data ni hex qatoriga aylantirish, xatolarni boshqarish va muvaffaqiyatsizlikda qayta urinishlar bilan o‘z serveringizga tokenni yuborish.

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)")

        // Tarmoq xatolarida kechikishdan so‘ng qayta urinish
        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
            }
        }
    }
}

Ro‘yxatdan o‘tishda xatolarni boshqarish

APNSda ro‘yxatdan o‘tishdagi xatolar turli sabablarga ko‘ra yuz berishi mumkin. Eng keng tarqalgan — tarmoq yo‘qligi, Xcode da sertifikatlarning noto‘g‘ri sozlamalari (masalan, Push Notifications imkoniyati o‘chirilgan), simulyatordan foydalanish (push ni qo‘llab-quvvatlamaydi) yoki noto‘g‘ri provisioning profile. Ishlab chiqarishda xatolarni qayd etish va iloji bo‘lsa, dasturni keyingi ishga tushirishda ro‘yxatdan o‘tishni takrorlash muhimdir.

Simulyatorda Device Token ni sinash

iOS Simulator haqiqiy Device Token olishni qo‘llab-quvvatlamaydi. Simulyatorda ro‘yxatdan o‘tishni sinash uchun i386 arxitektura tekshiruvlaridan foydalaning: debug versiyasida token olishni simulyatsiya qilish yoki mock obyektlari bilan UI testlaridan foydalanish mumkin. Push bildirishnomalarini haqiqiy sinash har doim Xcode ga ulangan jismoniy qurilmada amalga oshiriladi.

Ko‘p beriladigan savollar

Device Token bitta foydalanuvchida o‘zgarishi mumkinmi?

Ha, Device Token dasturni qayta o‘rnatish, qurilmani zaxiradan tiklash yoki iOS yangilashda o‘zgarishi mumkin. Server token yangilanishlarini boshqarishi kerak: tanish qurilmadan yangi token olinganda — eskisini almashtirish, 410 xatosida — tokenni ma’lumotlar bazasidan o‘chirish.

Device Token formati qanday?

Device Token — bu 64 belgidan iborat 32 baytli hex qatori kichik harflarda (0–9, a–f). Misol: “a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2”. Token APNSdan Data sifatida olinadi va dastur tomonida qatorga aylantiriladi.

Sandbox va production tokeni o‘rtasidagi farq nima?

Sandbox tokeni ishlab chiqish provisioning profile bilan yig‘ilgan dasturlar uchun chiqariladi va faqat api.sandbox.push.apple.com bilan ishlaydi. Production tokeni — App Store va TestFlight uchun, api.push.apple.com bilan ishlaydi. Server muhitlarni farqlashi va push ni tegishli APNS endpointiga yuborishi kerak.

Agar server APNSdan 410 xatosini olsa nima qilish kerak?

410 Gone xatosi Device Token haqiqiy emasligini bildiradi. Server bu tokenni ma’lumotlar bazasidan darhol o‘chirishi va unga yuborishni to‘xtatishi kerak. Javobdagi apns-unless-timestamp sarlavhasi token qachon ishlamay qolganini ko‘rsatadi.

Dastur Device Token olganligini qanday tekshirish mumkin?

AppDelegate dagi application(_:didRegisterForRemoteNotificationsWithDeviceToken:) delegat chaqiruvini tekshiring. Agar metod chaqirilsa — token olingan. Xcode konsolida tokenni ko‘rsatish uchun debugging loglari yoki OSLog dan foydalaning. Jismoniy qurilmada Network Link Conditioner orqali tokenning serverga yuborilishini tekshiring.

Xulosa

  • Device Token — APNSda qurilmaning noyob 64 belgili hex identifikatori, push bildirishnomalarini marshrutlash uchun zarur.
  • Tokenni olish — jarayon foydalanuvchidan ruxsat so‘rash, registerForRemoteNotifications orqali APNSda ro‘yxatdan o‘tish va AppDelegate delegatida qayta ishlashni o‘z ichiga oladi.
  • Token doimiy emas — dasturni qayta o‘rnatish, zaxiradan tiklash yoki iOS yangilashda o‘zgarishi mumkin; serverda yangilash mexanizmi talab qilinadi.
  • Sandbox vs Production — turli APNS muhitlari turli tokenlar va endpointlardan foydalanadi; server yuborishda muhitni to‘g‘ri aniqlashi kerak.
  • Serverda boshqarish — tokenlar foydalanuvchi, muhit va holat bilan bog‘langan holda ma’lumotlar bazasida saqlanadi; 410 Gone xatosi tokenning haqiqiy emasligini bildiradi.
  • APNS avtorizatsiyasi — server so‘rovlarni autentifikatsiya qilish uchun JWT tokeni yoki SSL sertifikatidan foydalanadi; Apple yangi loyihalar uchun JWT ni tavsiya qiladi.
  • Device Token — push infratuzilmasining asosiy komponenti, har bir bildirishnomaning yetkazilishi uni to‘g‘ri olish va saqlashga bog‘liq.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing