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
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.
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.
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 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.
| Identifikator | Maqsad | Doimiylik |
|---|---|---|
| Device Token | APNS push bildirishnomalarini marshrutlash | O‘zgarishi mumkin |
| IDFA | Reklama va kuzatish | Foydalanuvchi tomonidan tiklanadi |
| IDFV | Sotuvchi identifikatsiyasi (tahlil) | Bir dasturchining dasturlari uchun doimiy |
| Bundle ID | Dasturning noyob identifikatori | Doimiy |
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.
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.
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 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.
// 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 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.
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.
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.
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.
// 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');
}
});
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.
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.
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.
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.
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.
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.
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.
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
}
}
}
}
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.
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
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 — 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 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.
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.
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
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.