PushKit — این چیست، چارچوب اعلام‌های پش برای VoIP

نویسنده: IT Sectr منتشر شده: 2026-06-16 زمان مطالعه: 8 دقیقه

PushKit چارچوبی از Apple برای تحویل اعلام‌های پش با تحویل فوری تضمینی است که در اول نوبت برای برنامه‌های VoIP طراحی شده است. به علاوه APNs معیار (Apple Push Notification service) که می‌توانند تأخیر داشته باشند یا گروه‌بندی شوند، PushKit از یک اتصال ثابت TCP بین دستگاه و سرورهای Apple استفاده می‌کند. به استناد به Apple Developer Documentation, 2026، PushKit تأخیر تحویل کمتر از 500 میلی‌ثانیه را تضمین می‌کند که برای برنامه‌های زمان‌واقعی — تماس‌های صوتی و ویدئویی حیاتی است.

نکات کلیدی

  • PushKit — چارچوبی برای تحویل اعلام‌های پش با اولویت بالا برای انواع VoIP، Location و FileProvider.
  • PKPushRegistry — کلاس اصلی برای ثبت انواع اعلام‌ها و دریافت پیام‌های پش وارده.
  • VoIP-push — تنها نوع مجاز استفاده از PushKit از iOS 13 به بعد، که نمایش فوری تماس‌های وارده را تضمین می‌کند.
  • اتصال ثابت TCP — پایه فنی PushKit، تحویل بدون تأخیرهای معمولی APNs را تضمین می‌کند.
  • جفت با CallKit — PushKit اعلام را تحویل می‌دهد، CallKit صفحه تماس سیستمی را نمایش می‌دهد، تجربه کاربری واحدی را فراهم می‌کند.

PushKit چیست و چگونه کار می‌کند؟

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 چه انواعی از اعلام‌ها را پشتیبانی می‌کند

PushKit چهار نوع را پشتیبانی می‌کند: VoIP (برای تماس‌ها)، Complication (برای داده‌های صفحه ساعت watchOS)، FileProvider (برای همگام‌سازی فایل‌ها) و PushToTalk (برای عملکرد بی‌سیمی). از iOS 13 به بعد، تنها نوع VoIP برای توسعه‌دهندگان شخص ثالث به صورت گسترده در دسترس است. Complication و FileProvider کاربرد محدودی دارند و به اکوسیستم‌های خود Apple محدود می‌شوند.

نوع PushKitکاربرددسترسی
VoIPنمایش تماس‌های صوتی و ویدئویی واردهiOS 8+، App Store
Complicationبه‌روزرسانی داده‌ها در صفحات ساعت Apple WatchwatchOS 6+
FileProviderسیگنال درباره فایل‌های جدید در File Provider ExtensioniOS 11+، محدود
PushToTalkعملکرد بی‌سیم در برنامه‌های سازمانیiOS 16+، دسترس محدود

PushKit در مقابل APNs: تفاوت‌های کلیدی

APNs (Apple Push Notification service) — یک خدمات جهانی تحویل اعلام‌های پش است که از طریق یک کانال واحد برای همه برنامه‌ها کار می‌کند. Apple می‌تواند اعلام‌های APNs را در صورت ازدحام کانال بافر کند، گروه‌بندی کند یا حتی دور بیندازد. PushKit در عوض از یک اتصال اختصاصی برای هر نوع اعلام استفاده می‌کند و Apple تحویل هر VoIP-push را بدون بافرینگ تضمین می‌کند.

تفاوت در سناریوهای حساس به زمان نمایان می‌شود: یک تماس وارده که از طریق APNs تحویل داده شود می‌تواند با 10–30 ثانیه تأخیر بیاید یا اصلاً نیاید اگر دستگاه در حالت صرفه‌جویی انرژی باشد. PushKit همین اعلام را بین 100–500 میلی‌ثانیه تحویل می‌دهد بدون توجه به وضعیت دستگاه، زیرا کانال TCP آن توسط سیستم به صورت اولویت فعال نگه داشته می‌شود.

مقایسه ویژگی‌ها

پارامترPushKitAPNs
نوع اتصالTCP ثابت (کانال اختصاصی)کانال مشترک با بافرینگ
میانگین تأخیر120–350 میلی‌ثانیه1–5 ثانیه
بیدارسازی برنامههمیشه، از هر وضعیتیتنها اگر برنامه بسته نشده باشد
اندازه Payloadتا 5 کیلوبایتتا 4 کیلوبایت
گروه‌بندی iOSخیربله

معماری PushKit: PKPushRegistry و PKPushPayload

معماری PushKit در اطراف PKPushRegistry ساخته شده است — شیئی که برنامه را برای دریافت اعلام‌های یک نوع مشخص ثبت می‌کند. برنامه یک نمونه PKPushRegistry ایجاد می‌کند، نوع مورد نظر (مثل PKPushTypeVoIP) را مشخص می‌کند و یک دلگات تعیین می‌کند. پس از ثبت، سیستم به طور خودکار اتصال را با APNs حفظ کرده و اعلام‌های پش را از طریق دلگات تحویل می‌دهد.

هر اعلام توسط یک شیء PKPushPayload نمایش داده می‌شود که شامل یک فرهنگ dictionaryPayload با داده‌هایی از سرور است. اندازه payload به 5 کیلوبایت محدود است که برای انتقال متادادهای تماس کافی است: شناسه تماس گیرنده، نوع تماس (صوتی/ویدئویی)، نام مخاطب و توکن جلسه. جریان رسانه به طور جداگانه از طریق WebRTC یا سایر پروتکل‌های زمان‌واقعی منتقل می‌شود.

ثبت PKPushRegistry

swift
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 نمایش صفحه تماس در اولین ثانیه حیاتی است.

swift
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 و قوانین استفاده از PushKit

با عرضه iOS 13، Apple محدودیت‌های سختگیرانه‌ای را بر استفاده از PushKit اعمال کرد. توسعه‌دهندگان به طور انبوه از VoIP-push به عنوان یک مکانیزم مخفی برای به‌روزرسانی برنامه‌ها در پس‌زمینه استفاده می‌کردند — بیدارسازی از طریق PushKit امکان بارگیری محتوا، همگام‌سازی داده‌ها و به‌روزرسانی رابط بدون مجوز صریح کاربر را فراهم می‌کرد. Apple این را نقض مفهوم صرفه‌جویی انرژی دانسته و PushKit را فقط به نمایش تماس‌های وارده محدود کرد.

اکنون هر اعلام PushKit باید بلافاصله به نمایش یک تماس وارده از طریق CallKit منجر شود. اگر سیستم کشف کند که PushKit برای اهداف دیگری استفاده می‌شود — مثل همگام‌سازی پس‌زمینه یا به‌روزرسانی محتوا بدون نمایش تماص — برنامه می‌تواند در مودراسیون رد شود یا از خدمات PushKit جدا شود. Apple همچنین امکان استفاده از PushKit را برای به‌روزرسانی داده‌ها در پس‌زمینه از iOS 13 حذف کرده است.

توصیه‌های Apple برای استفاده از PushKit (iOS 13+)

  • هر اعلام VoIP باید طی 5 ثانیه پس از دریافت push با reportNewIncomingCall فراخوان شود
  • از PushKit برای پینگ، همگام‌سازی محتوا یا به‌روزرسانی توکن‌ها استفاده نکنید — برای این کار background fetch وجود دارد
  • سمت سرور باید push را فقط در صورت وجود تماس وارده واقعی ارسال کند، نه برای بیدارسازی پیشگیرانه
  • پس از دریافت push بدون تماس بعدی، کاربر یک تماس از دست رفته در Recents خواهد دید که این سرگردانی است

ادغام PushKit در Swift

ادغام کامل PushKit شامل ثبت، دریافت توکن پش و پردازش اعلام‌های وارده است. PushKit به طور مستقل اجازه ارسال اعلام‌ها را درخواست می‌کند — فراخوان اضافی UNUserNotificationCenter برای خود PushKit مورد نیاز نیست، اما ممکن است برای اعلام‌های محلی برنامه لازم باشد. پس از ثبت، سیستم روش pushRegistry:didUpdatePushCredentials را برای انتقال توکن پش فراخوان می‌کند که باید به سرور ارسال شود.

swift
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 باید شامل حداقل داده‌ها برای شناسایی تماس باشد.

json
// مثال payload پش VoIP
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

عیب‌یابی و رفع اشکال اعلام‌های PushKit

عیب‌یابی 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 منجر می‌شود

سوالات متداول

آیا می‌توان از PushKit بدون CallKit استفاده کرد؟

از نظر فنی بله، اما بی‌معنی. از iOS 13 به بعد، تنها کاربرد مجاز PushKit نمایش تماس‌های وارده است که برای نمایش به CallKit نیاز دارد. استفاده از PushKit بدون CallKit منجر به رد برنامه در App Store خواهد شد.

حداکثر اندازه payload PushKit چقدر است؟

حداکثر اندازه payload برای PushKit 5 کیلوبایت (5120 بایت) است. این 1 کیلوبایت بیشتر از اعلام‌های معمولی APNs است که امکان انتقال متادادهای بیشتری درباره تماس را فراهم می‌کند.

اگر برنامه با PushKit حذف شود چه اتفاقی می‌افتد؟

Apple به طور خودکار توکن پش را لغو می‌کند در زمان حذف برنامه. سرور اطلاعیه لغو را دریافت کرده و باید ارسال push را به این توکن متوقف کند. تلاش برای ارسال push به یک توکن نامعتبر به خطای APNs 410 منجر می‌شود.

آیا PushKit در macOS کار می‌کند؟

PushKit در macOS 10.14+ برای برنامه‌های Mac ساخته شده با Mac Catalyst یا AppKit در دسترس است. کارکرد آن کاملاً مشابه نسخه iOS است، شامل پشتیبانی از اعلام‌های VoIP.

چگونه بتوان بررسی کرد که اتصال PushKit فعال است؟

از تحلیل خود استفاده کنید: زمان بین ارسال push از سرور و فراخوانی didReceiveIncomingPushWithPayload در مشترک را پیگیری کنید. زمان میانگین کمتر از 500 میلی‌ثانیه نشان‌دهنده کارکرد صحیح PushKit است.

نتیجه‌گیری

  • PushKit — چارچوب Apple برای تحویل اعلام‌های پش با اولویت بالا، استفاده از اتصال ثابت TCP و تضمین تأخیر کمتر از 500 میلی‌ثانیه.
  • PKPushRegistry برنامه را برای دریافت اعلام‌های نوع مشخص — VoIP، Complication، FileProvider یا PushToTalk ثبت می‌کند.
  • از iOS 13 تنها کاربرد مجاز PushKit نمایش تماس‌های وارده از طریق CallKit است؛ به‌روزرسانی داده‌ها در پس‌زمینه از طریق PushKit ممنوع است.
  • تفاوت با APNs — کانال TCP اختصاصی بدون بافرینگ و بیدارسازی تضمینی برنامه از هر وضعیتی.
  • Payload به 5 کیلوبایت محدود است؛ هر VoIP-push باید طی 5 ثانیه reportNewIncomingCall را فراخوان کند.
  • عیب‌یابی PushKit به یک دستگاه فیزیکی نیاز دارد — شبیه‌ساز پشتیبانی نمی‌شود؛ توکن باید در هر راه‌اندازی به‌روز شود.
  • PushKit + CallKit — اتصال معیار برای برنامه‌های VoIP: PushKit اعلام را تحویل می‌دهد، CallKit صفحه تماس سیستمی را نمایش می‌دهد.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید