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 (لبيانات واجهات الساعة)، 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 دون تخزين مؤقت.
يظهر الفرق في السيناريوهات الحاسمة للوقت: قد تصل مكالمة واردة من خلال APNs بتأخير من 10–30 ثانية أو قد لا تصل بالمرة إذا كان الجهاز في وضع توفير الطاقة. PushKit يوصل نفس الإشعار في 100–500 ملي ثانية بغض النظر عن حالة الجهاز، لأن قناة TCP الخاصة به تظل نشطة بواسطة النظام بأولوية.
| المعلمة | PushKit | APNs |
|---|---|---|
| نوع الاتصال | TCP ثابت (قناة مخصصة) | قناة مشتركة مع تخزين مؤقت |
| زمن الاستجابة الوسطي | 120–350 ملي ثانية | 1–5 ثوانٍ |
| إيقاظ التطبيق | دائمًا، من أي حالة | فقط إذا لم يكن التطبيق مقتولًا |
| حجم الحمولة | حتى 5 كيلوبايت | حتى 4 كيلوبايت |
| تجميع iOS | لا | نعم |
تتبنى معمارية PushKit حول PKPushRegistry — كائن يسجل التطبيق لاستلام إشعارات من نوع معين. يقوم التطبيق بإنشاء مثال PKPushRegistry، وتحديد النوع المطلوب (على سبيل المثال، PKPushTypeVoIP)، وتعيين مفوض. بعد التسجيل، يحافظ النظام تلقائيًا على الاتصال مع APNs ويوصل إشعارات الدفع عبر المفوض.
يتم تمثيل كل إشعار بواسطة كائن PKPushPayload، الذي يحتوي على dictionaryPayload ببيانات من الخادم. حجم الحمولة محدود بـ 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. يجب أن يحتوي الحمول على بيانات أدنى لتحديد المكالمة.
// مثال على حمولة دفع VoIP
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
تصحيح أخطاء 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 |
الأسئلة الشائعة
نعم تقنيًا، ولكنه سيكون بدون جدوى. منذ iOS 13، الاستخدام الوحيد المسموح به لـ PushKit هو إشارة المكالمات الواردة، والتي تتطلب CallKit للعرض. سيؤدي استخدام PushKit بدون CallKit إلى رفض التطبيق من App Store.
الحد الأقصى لحجم الحمولة لـ PushKit هو 5 كيلوبايت (5120 بايت). هذا أكبر بـ 1 كيلوبايت من إشعارات APNs العادية، مما يسمح بنقل المزيد من بيانات المكالمة.
Apple تلغي تلقائيًا رمز الدفع عند حذف التطبيق. سيتلقى الخادم إشعارًا بالإلغاء ويجب أن يتوقف عن إرسال الدفعات إلى ذلك الرمز. سيؤدي حاولة إرسال دفعة إلى رمز غير صالح إلى خطأ APNs 410.
PushKit متاح على macOS 10.14+ لتطبيقات Mac المبنية باستخدام Mac Catalyst أو AppKit. الوظائف مكافئة تمامًا لنسخة iOS، بما في ذلك دعم إشعارات VoIP.
استخدم التحليل الخاص بك: تتبع الوقت بين إرسال دفعة من الخادم واستدعاء didReceiveIncomingPushWithPayload على العميل. يشير متوسط وقت أقل من 500 ملي ثانية إلى تشغيل PushKit بشكل صحيح.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.