APNS (Apple Push Notification Service) هو خدمة البنية التحتية من Apple لتوصيل الإشعارات الفورية إلى أجهزة النظام البيئي: iPhone وiPad وMac وApple Watch وApple TV. تضمن الخدمة تسليمًا موثوقًا للرسائل عبر اتصال TLS دائم بين الجهاز وخوادم Apple. وفقًا لـ توثيق مطوري Apple، يستخدم APNS بروتوكول HTTP/2 للاتصال ثنائي الاتجاه مع خوادم التطبيقات.
النقاط الرئيسية
Apple Push Notification Service (APNS) هي خدمة Apple الخاصة لتوجيه الإشعارات الفورية من خادم التطبيق إلى أجهزة المستخدمين. على عكس FCM، لا يدعم APNS Android أو المنصات الأخرى — فهو مرتبط بالكامل بالنظام البيئي لـ Apple.
تعمل الخدمة من خلال اتصال TLS دائم يقوم كل جهاز Apple بإنشائه مع خوادم APNS عند التشغيل. يتم الحفاظ على هذا الاتصال في الخلفية ويستخدم لتوصيل الإشعارات بأقل تأخير.
يتولى APNS جميع البنية التحتية للتسليم: التشفير، المصادقة، تحديد الأولويات، وإعادة الإرسال عندما يكون الجهاز غير متاح. يحتاج المطور فقط إلى توفير حمولة منسقة بشكل صحيح ورمز push صالح.
في الأصل، كان APNS يعمل من خلال بروتوكول ثنائي على المنافذ 2195–2196. منذ عام 2015، قامت Apple بنقل الخدمة إلى بروتوكول HTTP/2 الحديث، الذي يدعم تعدد الإرسال وضغط الرؤوس وإشعارات push من الخادم. أصبح HTTP/2 إلزاميًا في يونيو 2020.
تتكون عملية توصيل الإشعارات الفورية عبر APNS من خمس مراحل: تسجيل الجهاز، الحصول على رمز push، إرسال الطلب من الخادم، توجيه APNS، والتسليم إلى الجهاز.
إذا كان الجهاز غير متاح (مغلق أو لا توجد شبكة)، يخزن APNS أحدث رسالة لكل تطبيق ويوصلها عند استعادة الاتصال. المدة القصوى للتخزين هي 4 أسابيع، وبعدها يتم حذف الرسالة.
يدعم Apple طريقتين لمصادقة خادم التطبيق عند إرسال الإشعارات الفورية. لكل طريقة خصائصها الخاصة فيما يتعلق بفترة الصلاحية والإدارة وسهولة الاستخدام.
| المعامل | قائم على الرمز المميز (p8) | قائم على الشهادة (.p12) |
|---|---|---|
| الصلاحية | غير محدودة (المفتاح لا ينتهي) | محدودة بصلاحية الشهادة (عادةً سنة واحدة) |
| التدوير | غير مطلوب ما لم يتم اختراق المفتاح | استبدال سنوي إلزامي |
| تعدد التطبيقات | مفتاح واحد لجميع تطبيقات الحساب | شهادة منفصلة لكل تطبيق |
| البيئة | مفتاح واحد لـ Sandbox و Production | شهادات مختلفة لـ Sandbox و Production |
المصادقة قائم على الرمز المميز هي الطريقة الموصى بها من Apple منذ 2019. تقوم بإنشاء مفتاح p8 واحد في Apple Developer Console، وتحميله على خادمك، وتوقيع كل طلب APNS به. المفتاح لا ينتهي أبدًا ويعمل لجميع تطبيقات حسابك.
للمشاريع الجديدة، المصادقة قائم على الرمز المميز هي الأفضل بالتأكيد: مفتاح p8 واحد للحساب بالكامل، غير محدود، بدون ربط بالبيئة. الطريقةقائم على الشهادة (.p12) لا تزال مستخدمة في المشاريع القديمة لكنها تتطلب استبدالًا سنويًا وشهادات منفصلة لـ Sandbox و Production. ضع في اعتبارك انتهاء صلاحية الشهادة عند التخطيط لـ CI/CD.
يدعم APNS ثلاثة أنواع من الإشعارات الفورية، تختلف في سلوكها على الجهاز ومتطلبات سمات الطلب. يعتمد اختيار النوع على سيناريو تجربة المستخدم وإلحاح الرسالة.
للإشعارات Background، يجب عليك تحديد المفتاح content-available: 1 وتعيين الأولوية إلى 5 (تسليم موفر للطاقة). قد يحد النظام من عدد الإشعارات الخلفية إذا لم يعالجها التطبيق في الوقت المناسب.
يدعم APNS قيمتين للأولوية: 10 (تسليم فوري) و 5 (موفر للطاقة). لإشعارات التنبيه، استخدم 10 — يجب أن يتلقاها المستخدم على الفور. للإشعارات الخلفية، استخدم 5 — قد يؤخر النظام التسليم لتوفير البطارية. الأولوية غير الصحيحة للخلفية قد تؤدي إلى رفض APNS.
يقبل APNS الحمولة بتنسيق JSON بحجم أقصى 4 كيلوبايت للإشعارات العادية و5 كيلوبايت لـ VOIP. تحتوي الحمولة على قاموس aps الإلزامي مع إعدادات العرض وحقول مخصصة اختيارية.
{
"aps": {
"alert": {
"title": "رسالة جديدة",
"body": "لديك 3 محادثات غير مقروءة"
},
"badge": 3,
"sound": "default",
"category": "message_category",
"thread-id": "chat_room_42"
},
"customData": {
"chatId": "42"
}
}
المفتاح thread-id يجمع الإشعارات في مجموعات في مركز إشعارات iOS. المفتاح category يربط الإشعار بـ UNNotificationCategory لعرض أزرار الإجراء. بدون هذه المفاتيح، تظهر جميع الإشعارات بشكل فردي.
بالإضافة إلى قاموس aps الإلزامي، يمكن أن تحتوي حمولة APNS على أي حقول مخصصة في المستوى العلوي. هذه الحقول متاحة للتطبيق من خلال قاموس userInfo عند معالجة الإشعار. البيانات المخصصة مناسبة لتمرير معرفات الكيانات أو الشاشات أو الروابط. الحجم الأقصى للحمولة هو 4 كيلوبايت، لذا تجنب نقل كميات كبيرة من البيانات عبر push؛ قم بتحميلها عبر API بعد فتح الإشعار.
لإرسال إشعار push من الخادم، تحتاج إلى تنفيذ طلب POST إلى نقطة نهاية APNS مع رؤوس المصادقة الصحيحة. فيما يلي مثال في Node.js باستخدام المصادقةقائم على الرمز المميز.
const http2 = require("http2")
const fs = require("fs")
const jwt = require("jsonwebtoken")
const token = jwt.sign(
{ iss: "TEAM_ID", iat: Math.floor(Date.now() / 1000) },
fs.readFileSync("AuthKey.p8"),
{ algorithm: "ES256", keyid: "KEY_ID" }
)
const payload = JSON.stringify({
aps: { alert: { title: "مرحبًا!", body: "دفع اختباري" } }
})
const client = http2.connect(
"https://api.push.apple.com"
)
const req = client.request({
":method": "POST",
":path": "/3/device/DEVICE_PUSH_TOKEN",
"authorization": "bearer " + token,
"apns-push-type": "alert",
"apns-topic": "com.example.app",
"apns-priority": "10"
})
req.end(payload)
req.on("response", (headers) => {
if (headers[":status"] === 200) {
console.log("تم إرسال الدفع بنجاح")
}
})
بعد الإرسال، يعيد APNS حالة HTTP 200 عند التسليم الناجح أو رمز خطأ مع وصف في جسم الاستجابة. من المهم معالجة أخطاء token-unregistered (410) — يجب إزالة هذه الرموز من الخادم، حيث تم حذف التطبيق من الجهاز.
يعيد APNS رموز حالة HTTP لكل طلب إرسال. التسليم الناجح يعيد الحالة 200. تتطلب الأخطاء استراتيجيات معالجة مختلفة. BadDeviceToken (400) أو Unregistered (410) — رمز الجهاز قديم ويجب إزالته من الخادم. PayloadTooLarge (413) — تم تجاوز الحد 4 كيلوبايت، قلل الحمولة.
TooManyRequests (429) — تم تجاوز حد الطلبات. يحدد APNS حصة لعدد الإرساليات في الثانية. عند تلقي 429، قم بتطبيق التأخير الأسي (exponential backoff) وأعد المحاولة. يوصى بعدم تجاوز 100 طلب في الثانية لكل اتصال HTTP/2.
أخطاء جانب APNS — 500 و 503 (خطأ خادم داخلي / الخدمة غير متاحة). هذه أعطال مؤقتة في البنية التحتية لـ Apple. في هذه الحالات، أعد المحاولة بتأخير 1-5 ثوانٍ، لا يزيد عن 3 محاولات. الأخطاء المستمرة 5xx مع خادم يعمل بكامل طاقته نادرة وعادة ما تكون مرتبطة بمشاكل اتصال TLS.
لبيئات Production، تأكد من تنفيذ تسجيل جميع أخطاء APNS مع الرمز المميز ورمز الخطأ والوقت. سيساعد هذا في تحديد المشكلات بسرعة مع الشهادات أو الحصص أو رموز الأجهزة المحددة. تحقق بانتظام من تواريخ انتهاء صلاحية الشهادات إذا كنت تستخدم المصادقةقائم على الشهادة.
الأسئلة الشائعة
يعمل APNS من خلال TCP 443 (HTTPS) لواجهة API HTTP/2. سابقًا، كانت تستخدم المنافذ 2195 و 2196 للبروتوكول الثنائي. منذ يونيو 2020، تطلب Apple استخدام HTTP/2 حصريًا على المنفذ 443. تأكد من أن خادمك لديه حق الوصول إلى api.push.apple.com.
Sandbox هي بيئة اختبار APNS لتصحيح أخطاء الإشعارات الفورية. Production هي البيئة الحقيقية للمستخدمين الفعليين. مع المصادقةقائم على الرمز المميز، يعمل مفتاح واحد لكلتا البيئتين — تختلف نقطة النهاية: api.sandbox.push.apple.com أو api.push.apple.com.
يمكن أن يتغير رمز push عند: استعادة التطبيق من النسخة الاحتياطية، إعادة تثبيت التطبيق، تحديث نظام التشغيل، إعادة تعيين إعدادات الشبكة. الرمز لا يتغير أثناء التحديثات العادية للتطبيق عبر App Store. يجب على الخادم معالجة خطأ BadDeviceToken (400) كإشارة لإزالة الرمز.
4 كيلوبايت (4096 بايت) للإشعارات العادية alert/background. لإشعارات VOIP عبر PushKit — 5 كيلوبايت (5120 بايت). تجاوز الحجم يعيد خطأ PayloadTooLarge (413). يوصى بالحفاظ على الحمولة صغيرة وتحميل البيانات الإضافية عبر الخادم.
APNS لا يمكنه توصيل إشعار إلى جهاز بدون اتصال بالإنترنت. إذا كان الجهاز غير متصل، يخزن APNS أحدث رسالة (لكل تطبيق لكل جهاز) لمدة تصل إلى 28 يومًا. عند استعادة الاتصال، يتم تسليم الرسالة فورًا. لا يتم الاحتفاظ بالرسائل الأقدم.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا