PushKit هو إطار عمل iOS لتوصيل إشعارات VoIP بزمن وصول منخفض، متجاوزًا APNs القياسي. وفقًا لـ Apple Developer Documentation (2025)، يضمن PushKit توصيل المكالمات في غضون 5 ثوانٍ حتى في الخلفية. تتم معالجة إشعارات VoIP مباشرة، دون الحاجة إلى عرض لافتة للمستخدم، مما يجعل الإطار الأداة الرئيسية لتطبيقات المراسلة والاتصال المرئي على iOS.
الملامح الرئيسية
PushKit هو إطار عمل من Apple، تم تقديمه في iOS 8، والذي يوفر توصيل إشعارات push بزمن وصول منخفض لتطبيقات VoIP. على عكس APNs القياسي (Apple Push Notification service)، يسمح PushKit للتطبيق بالاستيقاظ في الخلفية عند استلام مكالمة واردة، دون عرض إشعار للمستخدم. هذا أمر بالغ الأهمية لتطبيقات الصوت والفيديو — يتلقى المستخدم المكالمة فورًا، حتى إذا كان التطبيق مغلقًا. وفقًا لـ Apple WWDC 2024، يعالج PushKit أكثر من 2 مليار إشعار VoIP يوميًا حول العالم.
آلية العمل مبنية على اتصال مباشر بين الجهاز وخادم push الخاص بـ Apple، متجاوزًا قناة الإشعارات القياسية. عندما يرسل خادم التطبيق إشعار VoIP، فإنه يمر عبر خادم PushKit مخصص ويتم توصيله إلى الجهاز بأولوية قصوى. يقوم النظام بإيقاظ التطبيق في الخلفية واستدعاء طريقة المفوض pushRegistry:didReceiveIncomingPushWithPayload:forType:. يستقبل التطبيق الحمولة (payload)، ويعالج المكالمة، ويستدعي معالج الإكمال للتأكيد. تستغرق الدورة بأكملها من الإرسال إلى المعالجة ما لا يزيد عن 5 ثوانٍ، وفقًا لمواصفات Apple.
الفرق الرئيسي بين PushKit و APNs يكمن في آلية التوصيل والمعالجة. يستخدم APNs قناة الإشعارات القياسية مع عرض لافتة أو صوت أو شارة، بينما يوصل PushKit البيانات مباشرة إلى التطبيق دون إشعار مرئي. فيما يلي جدول مقارنة للخصائص الرئيسية.
| الخاصية | PushKit | APNs |
|---|---|---|
| أولوية التوصيل | عالية (توصيل فوري) | متوسطة (تأخير محتمل) |
| إيقاظ التطبيق | نعم، في الخلفية | فقط عند النقر على الإشعار |
| عرض اللافتة | لا | نعم (اختياري) |
| الاستخدام | VoIP، مكالمات، اتصال مرئي | جميع أنواع الإشعارات |
| الحمولة | JSON فقط، بدون وسائط | JSON + مرفقات |
PushKit أيضًا لا يدعم المرفقات الوسائطية الغنية ولا يمكن استخدامه للإشعارات التسويقية العادية. تتحكم Apple بصرامة في استخدام PushKit — يجب أن يحتوي التطبيق على وظائف VoIP صريحة، وإلا سيتم رفضه أثناء المراجعة. يبقى APNs الحل العام لجميع السيناريوهات الأخرى.
لاستخدام PushKit، يجب على التطبيق التسجيل عبر PKPushRegistry مع نوع pushType .voIP. يتم التسجيل مرة واحدة عند التشغيل الأول، وبعد ذلك يقوم النظام بإنشاء رمز push فريد وتمريره عبر المفوض. يتم إرسال هذا الرمز إلى خادم التطبيق للإرسال اللاحق لإشعارات VoIP. فيما يلي مثال على تسجيل PushKit والحصول على الرمز في Swift.
import PushKit
let registry = PKPushRegistry(queue: DispatchQueue.main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]
// MARK: - PKPushRegistryDelegate
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let deviceToken = pushCredentials.token
.map { String.format("%02x", $0) }
.joined()
sendVoIPTokenToServer(deviceToken)
}
بعد استدعاء desiredPushTypes مع PKPushType.voIP، يطلب النظام تلقائيًا الإذن لتلقي إشعارات VoIP. في طريقة pushRegistry:didUpdatePushCredentials:forType:، يتلقى التطبيق رمز الجهاز كـ Data، والذي يتم تحويله إلى سلسلة سداسية عشرية وإرساله إلى الخادم. الرمز فريد لكل جهاز ويتغير عند إعادة تثبيت التطبيق — يجب على الخادم معالجة تحديثات الرمز.
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping VoidBlock
) {
guard let caller = payload.dictionaryPayload["caller"] as? String else {
completion()
return
}
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: caller)
provider.reportNewIncomingCall(
with: UUID(),
update: update,
completion: { error in
if let error = error {
print("Call error: \(error)")
}
completion()
}
)
}
في طريقة didReceiveIncomingPushWith، يتلقى التطبيق الحمولة مع بيانات المكالمة. بعد استخراج معلومات المتصل، يتم إنشاء CXCallUpdate من إطار عمل CallKit لعرض شاشة المكالمة الواردة. من المهم استدعاء معالج الإكمال بعد المعالجة — وإلا قد يقوم النظام بإنهاء عملية التطبيق قسريًا بسبب انتهاء المهلة. الحد الأقصى لوقت المعالجة هو 30 ثانية، وبعدها يعتبر iOS الإشعار غير معالج.
PushKit متكامل بشكل وثيق مع CallKit — إطار عمل لعرض واجهة المكالمات النظامية على iOS. عندما يتلقى التطبيق إشعار VoIP عبر PushKit، يجب عليه إنشاء CXProvider و CXCallController لإدارة المكالمة. يعرض CallKit تلقائيًا شاشة المكالمة الواردة على شاشة القفل، حتى إذا كان التطبيق مصغرًا. فيما يلي مثال على إعداد مزود CallKit.
let config = CXProviderConfiguration(localizedName: "MyApp")
config.supportsVideo = true
config.maximumCallGroups = 1
config.maximumCallsPerCallGroup = 1
config.supportedHandleTypes = [.phoneNumber, .generic]
let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)
CXProviderConfiguration يحدد مظهر وسلوك شاشة المكالمة — اسم التطبيق، دعم الفيديو، عدد المكالمات المتزامنة. دمج PushKit مع CallKit إلزامي لتطبيقات VoIP: بدونه، لن يعرض النظام شاشة المكالمة الواردة، وسيفوت المستخدم المكالمة. تطلب Apple استخدام CallKit لجميع التطبيقات التي تستخدم PushKit.
استخدام PushKit يفرض عددًا من القيود الصارمة التي وضعتها Apple. يمكن استخدام الإطار فقط لوظائف VoIP — أي محاولة لإرسال إشعارات تسويقية عبر PushKit ستؤدي إلى حظر التطبيق. يجب ألا يتجاوز حجم الحمولة 4 كيلوبايت، ويمكن أن تحتوي فقط على بيانات JSON بدون مرفقات. بدءًا من iOS 13، فرضت Apple حدًا على تكرار إرسال إشعارات VoIP — لا يزيد عن إشعار واحد في الدقيقة لكل جهاز. يجب على الخادم الامتثال لهذا الحد، وإلا سيتم رفض الإشعارات من قبل النظام. PushKit أيضًا لا يعمل على محاكي iOS — الاختبار ممكن فقط على جهاز فعلي.
حمولة إشعار VoIP هي قاموس JSON مع بيانات مكالمة مخصصة. على عكس APNs، لا يدعم PushKit الحقول القياسية alert و badge و sound — يتم تعريف جميع البيانات من قبل المطور. يتضمن الهيكل النموذجي معرف المتصل (caller)، نوع المكالمة (صوت أو فيديو)، معرف الغرفة أو الجلسة وطابع زمني. يجب أن يكون حجم كل حقل ضئيلًا لتوفير المساحة ضمن حد 4 كيلوبايت. توصي Apple بتضمين فقط البيانات اللازمة لعرض شاشة المكالمة الواردة على شاشة القفل في الحمولة، وتحميل باقي المعلومات (الصورة الرمزية، سجل المحادثة) بعد أن يرد المستخدم عبر طلب شبكة منفصل. مثال على حمولة دنيا: { "caller": "آنا", "caller_id": "+79161234567", "type": "audio", "room": "uuid-room-1234", "ts": 1718534400 }. يجب أن تكون جميع المفاتيح في الحمولة قصيرة، لا لبس فيها، وموثقة على جانب الخادم للتوافق بين إصدارات التطبيق.
عند العمل مع PushKit، من الضروري معالجة فشل التوصيل وفقدان الاتصال. إذا كان الجهاز غير متصل بالإنترنت أو مفصولاً عن الشبكة، فلن يتم توصيل إشعار VoIP — PushKit لا يدعم التخزين وإعادة الإرسال، على عكس APNs التي تخزن الإشعارات لمدة تصل إلى 24 ساعة لإعادة المحاولة. يجب على الخادم تتبع الإشعارات غير المسلمة بشكل مستقل وإعادة المحاولة عند استعادة الاتصال. يتم استخدام آلية push kit feedback service لهذا الغرض — حيث يعيد قائمة بالإشعارات غير المسلمة مع سبب الفشل. يوصى بإعداد مراقبة نجاح توصيل إشعارات VoIP من خلال تحليلات الخادم وإخطار المطور إذا انخفض معدل التوصيل الناجح عن 95%. يضمن نظام PushKit التوصيل فقط عندما يكون الجهاز متصلاً بالإنترنت بنشاط — في حالة absence، يتم فقدان الإشعار بشكل دائم، وهو أمر بالغ الأهمية عند تصميم نظام موثوق لمكالمات VoIP مع توصيل مضمون.
الأسئلة الشائعة
PushKit هو إطار عمل من Apple لتوصيل إشعارات VoIP بزمن وصول منخفض يسمح للتطبيق بالاستيقاظ في الخلفية عند مكالمة واردة دون عرض لافتة. يُستخدم في تطبيقات المراسلة والاتصال المرئي.
PushKit لديه أولوية توصيل أعلى ويوقظ التطبيق في الخلفية دون عرض إشعار للمستخدم. APNs يوصل الإشعارات مع لافتة ولا يمكنه إيقاظ التطبيق لمعالجة مكالمة دون تفاعل المستخدم.
نعم، تطلب Apple دمج PushKit مع CallKit لعرض شاشة المكالمة الواردة للنظام. بدون CallKit، لا يمكن للتطبيق عرض المكالمة الواردة على شاشة القفل، مما يجعل وظيفة VoIP عديمة الفائدة.
يتم الحصول على الرمز بعد إنشاء PKPushRegistry بالنوع .voIP وتنفيذ طريقة المفوض pushRegistry:didUpdatePushCredentials:forType:. يتم تمرير الرمز كـ Data ويجب تحويله إلى سلسلة سداسية عشرية لإرسالها إلى الخادم.
الحد الأقصى لحجم الحمولة لـ PushKit هو 4 كيلوبايت. يجب أن تكون البيانات بتنسيق JSON. المرفقات الوسائطية غير مدعومة. منذ iOS 13، هناك حد لا يزيد عن إشعار VoIP واحد في الدقيقة لكل جهاز.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا