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 (لبيانات واجهات الساعة)، 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 دون تخزين مؤقت.

يظهر الفرق في السيناريوهات الحاسمة للوقت: قد تصل مكالمة واردة من خلال APNs بتأخير من 10–30 ثانية أو قد لا تصل بالمرة إذا كان الجهاز في وضع توفير الطاقة. PushKit يوصل نفس الإشعار في 100–500 ملي ثانية بغض النظر عن حالة الجهاز، لأن قناة TCP الخاصة به تظل نشطة بواسطة النظام بأولوية.

مقارنة الخصائص

المعلمةPushKitAPNs
نوع الاتصالTCP ثابت (قناة مخصصة)قناة مشتركة مع تخزين مؤقت
زمن الاستجابة الوسطي120–350 ملي ثانية1–5 ثوانٍ
إيقاظ التطبيقدائمًا، من أي حالةفقط إذا لم يكن التطبيق مقتولًا
حجم الحمولةحتى 5 كيلوبايتحتى 4 كيلوبايت
تجميع iOSلانعم

معمارية PushKit: PKPushRegistry و PKPushPayload

تتبنى معمارية PushKit حول PKPushRegistry — كائن يسجل التطبيق لاستلام إشعارات من نوع معين. يقوم التطبيق بإنشاء مثال PKPushRegistry، وتحديد النوع المطلوب (على سبيل المثال، PKPushTypeVoIP)، وتعيين مفوض. بعد التسجيل، يحافظ النظام تلقائيًا على الاتصال مع APNs ويوصل إشعارات الدفع عبر المفوض.

يتم تمثيل كل إشعار بواسطة كائن PKPushPayload، الذي يحتوي على dictionaryPayload ببيانات من الخادم. حجم الحمولة محدود بـ 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 reportNewIncomingCall خلال 5 ثوانٍ من استلام الدفعة
  • لا تستخدم PushKit للإشعارات الدورية، مزامنة المحتوى، أو تحديث الرموز — لذلك يوجد background fetch
  • يجب على الخادم إرسال دفعة فقط عند وجود مكالمة واردة فعلية، ليس للإيقاظ الأولي
  • عند استلام دفعة دون مكالمة لاحقة، سيظهر مكالمة فاتة في الأخيرة — وهذا يربك المستخدم

دمج 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. يجب أن يحتوي الحمول على بيانات أدنى لتحديد المكالمة.

json
// مثال على حمولة دفع VoIP
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

تشخيص وتصحيح أخطاء إشعارات PushKit

تصحيح أخطاء PushKit أكثر تعقيدًا من APNs القياسية لأن PushKit لا يعمل على محاكي iOS. تحتاج إلى iPhone أو iPad فعلي للتشخيص. أول علامة على التشغيل الصحيح هي استدعاء pushRegistry:didUpdatePushCredentials عند البدء وظهور رمز دفع بتنسيق محدد (64 حرفًا سداسي عشريًا لـ VoIP). إذا لم يتم استدعاء المفوض، تحقق من التصاريح (entitlements) لتطبيقك.

مشكلة شائعة أخرى هي عدم توصيل PushKit للإشعارات بعد تحديث التطبيق. يحدث هذا إذا تغير رمز الدفع ولكن الخادم يستمر في استخدام القديم. الحل هو إرسال الرمز الجديد إلى الخادم عند بدء التطبيق وإزالة الرموز غير الصالحة عند استدعاء pushRegistry:didInvalidatePushTokenForType. توصي Apple أيضًا بتنفيذ آلية احتياطية عبر APNs العادية.

المشاكل الشائعة وحلولها

المشكلةالسببالحل
لم يتم استدعاء didUpdatePushCredentialsعدم وجود التصاريح أو نوع خاطئتحقق من Capabilities → Push Notifications + VoIP في Xcode
الدفع يصل متأخرًاالجهاز في وضع الطاقة المنخفضة أو إشارة ضعيفةلا يستطيع PushKit تجاوز قيود العدات
لا تصل إشعارات بعد إعادة التشغيلتغير رمز الدفع بعد إعادة تثبيت التطبيقاطلب رمزًا جديدًا وحدثه على الخادم
رفض App Store بسبب PushKitاستخدام PushKit لأغراض غير المكالماتتأكد من أن كل دفعة تؤدي إلى reportNewIncomingCall

الأسئلة الشائعة

هل يمكن استخدام PushKit بدون CallKit؟

نعم تقنيًا، ولكنه سيكون بدون جدوى. منذ iOS 13، الاستخدام الوحيد المسموح به لـ PushKit هو إشارة المكالمات الواردة، والتي تتطلب CallKit للعرض. سيؤدي استخدام PushKit بدون CallKit إلى رفض التطبيق من App Store.

ما هو الحد الأقصى لحجم حمولة PushKit؟

الحد الأقصى لحجم الحمولة لـ PushKit هو 5 كيلوبايت (5120 بايت). هذا أكبر بـ 1 كيلوبايت من إشعارات APNs العادية، مما يسمح بنقل المزيد من بيانات المكالمة.

ماذا يحدث إذا قمت بحذف تطبيق يستخدم PushKit؟

Apple تلغي تلقائيًا رمز الدفع عند حذف التطبيق. سيتلقى الخادم إشعارًا بالإلغاء ويجب أن يتوقف عن إرسال الدفعات إلى ذلك الرمز. سيؤدي حاولة إرسال دفعة إلى رمز غير صالح إلى خطأ APNs 410.

هل يعمل PushKit على macOS؟

PushKit متاح على macOS 10.14+ لتطبيقات Mac المبنية باستخدام Mac Catalyst أو AppKit. الوظائف مكافئة تمامًا لنسخة iOS، بما في ذلك دعم إشعارات VoIP.

كيف يمكنني التحقق من أن اتصال PushKit نشط؟

استخدم التحليل الخاص بك: تتبع الوقت بين إرسال دفعة من الخادم واستدعاء didReceiveIncomingPushWithPayload على العميل. يشير متوسط وقت أقل من 500 ملي ثانية إلى تشغيل PushKit بشكل صحيح.

الملخص

  • PushKit — إطار عمل Apple لتوصيل إشعارات الدفع بأولوية مرتفعة، يستخدم اتصال TCP ثابت ويوفر زمن استجابة أقل من 500 ملي ثانية.
  • PKPushRegistry يسجل التطبيق لاستلام إشعارات من نوع محدد — VoIP، Complication، FileProvider أو PushToTalk.
  • منذ iOS 13، الاستخدام الوحيد المسموح به لـ PushKit هو إشارة المكالمات الواردة عبر CallKit؛ تحديثات البيانات خلفية عبر PushKit محظورة.
  • الفرق عن APNs — قناة TCP مخصصة دون تخزين مؤقت وإيقاظ مضمون للتطبيق من أي حالة.
  • الحمولة محدودة بـ 5 كيلوبايت؛ يجب أن يستدعي كل دفع VoIP reportNewIncomingCall خلال 5 ثوانٍ.
  • تشخيص PushKit يتطلب جهازًا فعليًا — المحاكي غير مدعوم؛ يجب تحديث الرمز عند كل بدء.
  • PushKit + CallKit — المزيج القياسي لتطبيقات VoIP: PushKit يوصل الإشعار، و CallKit يعرض شاشة الاتصال النظامية.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا