جميع حزم المصدر المفتوح
المنصةSwift

iOS-Notification-Framework

جدولة إشعارات محلية (local notifications) بما يتجاوز حد iOS البالغ 64، وتوجيه النقرات (taps)، وإرسال push عبر APNs.

3النجومآخر إصدار: v2.0.0 · آخر تحديث: 15 أكتوبر 2026
الأنظمة الأساسية:iOS 17macOS 14watchOS 10visionOS 1

الترخيص: MIT

NotificationKit حزمة Swift للتطبيقات التي تُجدوِل إشعارات على الجهاز، وللخوادم (servers) التي تُرسِل إليها push. تُغلِّف UserNotifications في أنواع قيمة (value types) وتُصلِح الأجزاء التي تفشل بصمت: يحتفظ iOS بأقرب 64 إشعارًا بانتظار من تطبيق واحد فقط ويتجاهل الباقي بلا خطأ، وبعض القيم غير الصالحة تُسقِط (crash) التطبيق بدل أن تُلقي throw، وdelegate callbacks صعبة الاستخدام من Swift concurrency. مكتبة ثانية، NotificationKitAPNs، تُرسِل push عبر APNs بنوع payload نفسه الذي يقرؤه التطبيق. لا تعتمد أي من المكتبتين على شيء خارج Apple SDK.

الميزات

  • لا إشعارات مفقودة بعد 64: NotificationScheduler يُسلِّم iOS أقرب 64 إشعارًا، ويحتفظ بالباقي في queue محفوظة، ويُرقِّيها عندما تُفرَّغ slots
  • ساعات هادئة (quiet hours) وحد تكرار (frequency cap) يُفحَصان بناءً على وقت تنفيذ الإشعار، لذا تذكير مضبوط في 21:00 لوقت 23:00 ينتظر إلى الصباح
  • أخطاء بدل الانهيار (crashes): فاصل زمني متكرر أقل من 60 ثانية، أو relevance score بقيمة NaN، أو الساعة 25، يُلقي NotificationValidationError قبل أن يراه UNUserNotificationCenter
  • النقرات (taps) والـ actions وdeep links كقيم: NotificationEventHandler يحوّل delegate callbacks إلى AsyncStreams، وDeepLinkRouter يفتح الشاشات فقط من schemes وhosts مسموح بها
  • push على الجانبين: PushPayload ذو نوع صريح بحدود حجم APNs، وDeviceToken لا يُطبَع كاملًا أبدًا، وNotification Service Extension يُنزِّل الوسائط، وclient لـ APNs بمصادقة توكِن (token authentication)
  • InMemoryNotificationCenter يحافظ على حد النظام البالغ 64 إشعارًا، لذا يعمل منطق الجدولة في unit tests عادية

البدء السريع

swift
1import NotificationKit
2import SwiftUI
3 
4let scheduler = NotificationScheduler() // one for the whole app
5 
6struct ContentView: View {
7 var body: some View {
8 Button("Remind me in 10 seconds") {
9 Task {
10 do {
11 try await scheduler.requestAuthorization()
12 try await scheduler.schedule(LocalNotification(
13 id: "water",
14 title: "Time for a glass of water",
15 body: "You asked for this reminder 10 seconds ago.",
16 trigger: .after(seconds: 10)
17 ))
18 } catch {
19 print("Could not schedule the reminder:", error)
20 }
21 }
22 }
23 }
24}

التثبيت

Swift Package Manager

swift
1dependencies: [
2 .package(url: "https://github.com/muhittincamdali/iOS-Notification-Framework.git", from: "2.0.0")
3],
4targets: [
5 .target(name: "YourApp", dependencies: [
6 .product(name: "NotificationKit", package: "iOS-Notification-Framework")
7 ]),
8 // A server or command-line tool that sends pushes:
9 .executableTarget(name: "PushServer", dependencies: [
10 .product(name: "NotificationKitAPNs", package: "iOS-Notification-Framework")
11 ])
12]

Xcode

text
1https://github.com/muhittincamdali/iOS-Notification-Framework.git

لقطات الشاشة

لافتة (banner) تذكير من تطبيق المثال NotificationLab على محاكي iPhone، الوضع الفاتح
لافتة (banner) تذكير من تطبيق المثال NotificationLab على محاكي iPhone، الوضع الداكن
قائمة مُجدوَلة بـ 64 إشعارًا في النظام والباقي في الـ queue، الوضع الفاتح
قائمة مُجدوَلة بـ 64 إشعارًا في النظام والباقي في الـ queue، الوضع الداكن
شاشة طلب (order) مفتوحة من push على المحاكي، الوضع الفاتح
شاشة طلب (order) مفتوحة من push على المحاكي، الوضع الداكن

الجدول الزمني

  1. فُتح المستودع كنموذج أولي (prototype) لـ framework إشعارات؛ معظم الـ commits الأولى كانت دوكيومنتيشن وأمثلة وCI

  2. صدر v1.0.0؛ أُعيد تشغيل main من commit واحد بـ API مستند إلى builder

  3. إضافات صغيرة للنموذج الأولي: معاينة (preview) SwiftUI، ومدير Live Activity، ونوع push تنبّئي (predictive)

  4. أُعيد البناء كـ 2.0.0 حول notification center قابل للاختبار؛ أُزيلت مصادر النموذج الأولي ولم يُحتفَظ بأي API من 1.x

الروابط

مقالة ذات صلة

قراءة المقالة (English)