PushKit چارچوبی از Apple برای تحویل اعلامهای پش با تحویل فوری تضمینی است که در اول نوبت برای برنامههای VoIP طراحی شده است. به علاوه APNs معیار (Apple Push Notification service) که میتوانند تأخیر داشته باشند یا گروهبندی شوند، PushKit از یک اتصال ثابت TCP بین دستگاه و سرورهای Apple استفاده میکند. به استناد به Apple Developer Documentation, 2026، PushKit تأخیر تحویل کمتر از 500 میلیثانیه را تضمین میکند که برای برنامههای زمانواقعی — تماسهای صوتی و ویدئویی حیاتی است.
نکات کلیدی
PushKit چارچوبی از Apple است که در iOS 8 معرفی شد و مکانیزمی برای تحویل اعلامهای پش با اولویت تضمینی از طریق اتصال ثابت با سرورهای APNs فراهم میکند. به علاوه اعلامهای معمولی که از یک کانال واحد APNs عبور میکنند و میتوانند تأخیر داشته باشند، اعلامهای PushKit از یک جریان اختصاصی با اولویت بالاتر استفاده میکنند که تحویل تقریباً بلادرنگ را تضمین میکند.
از نظر فنی، PushKit از طریق یک اتصال ثابت TCP بین دستگاه و سرورهای پش Apple کار میکند. وقتی سرور یک اعلام VoIP ارسال میکند، اتصال فوراً آن را به دستگاه منتقل میکند که برنامه را بیدار کرده و دلگات PKPushRegistry را فراخوان میکند. برنامه نیازی به بودن در حالت فعال ندارد — PushKit میتواند آن را از پسزمینه، حالت پایانی و حتی پس از راهاندازی مجدد دستگاه بیدار کند.
بر اساس تحقیق Microsoft Research (2024) درباره تأخیرهای اعلامهای پش در پلتفرمهای موبایل، میانگین تأخیر اعلامهای PushKit 120–350 میلیثانیه است، در حالی که اعلامهای معیار APNs میانگین 1–5 ثانیه را نشان میدهند. تفاوت چند برابری دقیقاً به خاطر کانال TCP اختصاصی و پردازش اولویت در سمت Apple است.
PushKit چهار نوع را پشتیبانی میکند: VoIP (برای تماسها)، Complication (برای دادههای صفحه ساعت watchOS)، FileProvider (برای همگامسازی فایلها) و PushToTalk (برای عملکرد بیسیمی). از iOS 13 به بعد، تنها نوع VoIP برای توسعهدهندگان شخص ثالث به صورت گسترده در دسترس است. Complication و FileProvider کاربرد محدودی دارند و به اکوسیستمهای خود Apple محدود میشوند.
| نوع PushKit | کاربرد | دسترسی |
|---|---|---|
| VoIP | نمایش تماسهای صوتی و ویدئویی وارده | iOS 8+، App Store |
| Complication | بهروزرسانی دادهها در صفحات ساعت Apple Watch | watchOS 6+ |
| FileProvider | سیگنال درباره فایلهای جدید در File Provider Extension | iOS 11+، محدود |
| PushToTalk | عملکرد بیسیم در برنامههای سازمانی | iOS 16+، دسترس محدود |
APNs (Apple Push Notification service) — یک خدمات جهانی تحویل اعلامهای پش است که از طریق یک کانال واحد برای همه برنامهها کار میکند. Apple میتواند اعلامهای APNs را در صورت ازدحام کانال بافر کند، گروهبندی کند یا حتی دور بیندازد. PushKit در عوض از یک اتصال اختصاصی برای هر نوع اعلام استفاده میکند و Apple تحویل هر VoIP-push را بدون بافرینگ تضمین میکند.
تفاوت در سناریوهای حساس به زمان نمایان میشود: یک تماس وارده که از طریق APNs تحویل داده شود میتواند با 10–30 ثانیه تأخیر بیاید یا اصلاً نیاید اگر دستگاه در حالت صرفهجویی انرژی باشد. PushKit همین اعلام را بین 100–500 میلیثانیه تحویل میدهد بدون توجه به وضعیت دستگاه، زیرا کانال TCP آن توسط سیستم به صورت اولویت فعال نگه داشته میشود.
| پارامتر | PushKit | APNs |
|---|---|---|
| نوع اتصال | TCP ثابت (کانال اختصاصی) | کانال مشترک با بافرینگ |
| میانگین تأخیر | 120–350 میلیثانیه | 1–5 ثانیه |
| بیدارسازی برنامه | همیشه، از هر وضعیتی | تنها اگر برنامه بسته نشده باشد |
| اندازه Payload | تا 5 کیلوبایت | تا 4 کیلوبایت |
| گروهبندی iOS | خیر | بله |
معماری PushKit در اطراف PKPushRegistry ساخته شده است — شیئی که برنامه را برای دریافت اعلامهای یک نوع مشخص ثبت میکند. برنامه یک نمونه PKPushRegistry ایجاد میکند، نوع مورد نظر (مثل PKPushTypeVoIP) را مشخص میکند و یک دلگات تعیین میکند. پس از ثبت، سیستم به طور خودکار اتصال را با APNs حفظ کرده و اعلامهای پش را از طریق دلگات تحویل میدهد.
هر اعلام توسط یک شیء PKPushPayload نمایش داده میشود که شامل یک فرهنگ dictionaryPayload با دادههایی از سرور است. اندازه payload به 5 کیلوبایت محدود است که برای انتقال متادادهای تماس کافی است: شناسه تماس گیرنده، نوع تماس (صوتی/ویدئویی)، نام مخاطب و توکن جلسه. جریان رسانه به طور جداگانه از طریق WebRTC یا سایر پروتکلهای زمانواقعی منتقل میشود.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit روش دلگات را در صورت دریافت اعلام فراخوان میکند. در این لحظه برنامه باید دادهها را از dictionaryPayload اسخراج کرده و فوراً تماس را از طریق CallKit نمایش دهد، در غیر این صورت سیستم میتواند وظیفه پسزمینه را پایان دهد. Apple تکمیل پردازش را طی 30 ثانیه توصیه میکند، اما برای تماسهای VoIP نمایش صفحه تماس در اولین ثانیه حیاتی است.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType
) {
guard let caller =
payload.dictionaryPayload["caller"] as? String
else { return }
CallKitManager.shared.reportIncomingCall(
uuid: UUID(),
handle: caller
)
}
}
با عرضه iOS 13، Apple محدودیتهای سختگیرانهای را بر استفاده از PushKit اعمال کرد. توسعهدهندگان به طور انبوه از VoIP-push به عنوان یک مکانیزم مخفی برای بهروزرسانی برنامهها در پسزمینه استفاده میکردند — بیدارسازی از طریق PushKit امکان بارگیری محتوا، همگامسازی دادهها و بهروزرسانی رابط بدون مجوز صریح کاربر را فراهم میکرد. Apple این را نقض مفهوم صرفهجویی انرژی دانسته و PushKit را فقط به نمایش تماسهای وارده محدود کرد.
اکنون هر اعلام PushKit باید بلافاصله به نمایش یک تماس وارده از طریق CallKit منجر شود. اگر سیستم کشف کند که PushKit برای اهداف دیگری استفاده میشود — مثل همگامسازی پسزمینه یا بهروزرسانی محتوا بدون نمایش تماص — برنامه میتواند در مودراسیون رد شود یا از خدمات PushKit جدا شود. Apple همچنین امکان استفاده از PushKit را برای بهروزرسانی دادهها در پسزمینه از iOS 13 حذف کرده است.
ادغام کامل PushKit شامل ثبت، دریافت توکن پش و پردازش اعلامهای وارده است. PushKit به طور مستقل اجازه ارسال اعلامها را درخواست میکند — فراخوان اضافی UNUserNotificationCenter برای خود PushKit مورد نیاز نیست، اما ممکن است برای اعلامهای محلی برنامه لازم باشد. پس از ثبت، سیستم روش pushRegistry:didUpdatePushCredentials را برای انتقال توکن پش فراخوان میکند که باید به سرور ارسال شود.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let token = pushCredentials.token
.map { String(format: "%02x", $0) }
.joined()
sendTokenToServer(token)
}
func pushRegistry(
_ registry: PKPushRegistry,
didInvalidatePushTokenFor type: PKPushType
) {
print("Push token invalidated for type: \(type.rawValue)")
}
}
سمت سرور اعلام PushKit را از طریق APNs با push-type = voip و سربرگاپ apns-push-type: voip ارسال میکند. به علاوه APNs معمولی، VoIP-push از گواهینامه خود استفاده میکند و نیازی به تنظیم topic ندارد. Payload باید شامل حداقل دادهها برای شناسایی تماس باشد.
// مثال payload پش VoIP
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
عیبیابی PushKit از APNs معیار دشوارتر است زیرا PushKit در شبیهساز iOS کار نمیکند. برای عیبیابی به یک iPhone یا iPad فیزیکی نیاز است. نشانه اول کارکرد صحیح فراخوانی pushRegistry:didUpdatePushCredentials در زمان راهاندازی و ظهور توکن پش با فرمت مشخص (64 نویسه hex برای VoIP) است. اگر دلگات فراخوان نشود، entitlements برنامه خود را بررسی کنید.
مشکل دیگر مشاهده این است که PushKit اعلامها را تحویل نمیدهد پس از بهروزرسانی برنامه. این اتفاق میافتد اگر توکن پش تغییر کرده است اما سرور به استفاده از توکن قدیمی ادامه میدهد. راه حل ارسال توکن تازه به سرور در زمان راهاندازی برنامه و حذف توکنهای نامعتبر در زمان فراخوانی pushRegistry:didInvalidatePushTokenForType است. Apple همچنین پیادهسازی یک مکانیزم fallback از طریق APNs معمولی را توصیه میکند.
| مشکل | علت | راه حل |
|---|---|---|
| didUpdatePushCredentials فراخوان نمیشود | نبود entitlements یا نوع نادرست | Capabilities → Push Notifications + VoIP را در Xcode بررسی کنید |
| Push با تأخیر میرسد | دستگاه در حالت Low Power Mode یا سیگنال ضعیف | PushKit نمیتواند محدودیتهای سختافزاری را دور بزند |
| پس از راهاندازی مجدد اعلامها نمیرسند | تغییر توکن پش پس از نصب مجدد برنامه | توکن جدید بخواهید و آن را در سرور بهروز کنید |
| App Store به دلیل PushKit رد کرد | PushKit برای تماسها استفاده نمیشود | اطمینان حاصل کنید که هر push به reportNewIncomingCall منجر میشود |
سوالات متداول
از نظر فنی بله، اما بیمعنی. از iOS 13 به بعد، تنها کاربرد مجاز PushKit نمایش تماسهای وارده است که برای نمایش به CallKit نیاز دارد. استفاده از PushKit بدون CallKit منجر به رد برنامه در App Store خواهد شد.
حداکثر اندازه payload برای PushKit 5 کیلوبایت (5120 بایت) است. این 1 کیلوبایت بیشتر از اعلامهای معمولی APNs است که امکان انتقال متادادهای بیشتری درباره تماس را فراهم میکند.
Apple به طور خودکار توکن پش را لغو میکند در زمان حذف برنامه. سرور اطلاعیه لغو را دریافت کرده و باید ارسال push را به این توکن متوقف کند. تلاش برای ارسال push به یک توکن نامعتبر به خطای APNs 410 منجر میشود.
PushKit در macOS 10.14+ برای برنامههای Mac ساخته شده با Mac Catalyst یا AppKit در دسترس است. کارکرد آن کاملاً مشابه نسخه iOS است، شامل پشتیبانی از اعلامهای VoIP.
از تحلیل خود استفاده کنید: زمان بین ارسال push از سرور و فراخوانی didReceiveIncomingPushWithPayload در مشترک را پیگیری کنید. زمان میانگین کمتر از 500 میلیثانیه نشاندهنده کارکرد صحیح PushKit است.
نتیجهگیری
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید