iOS-Notification-Framework
جدولة إشعارات محلية (local notifications) بما يتجاوز حد iOS البالغ 64، وتوجيه النقرات (taps)، وإرسال push عبر APNs.
الترخيص: 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 عادية
البدء السريع
1import NotificationKit2import SwiftUI3 4let scheduler = NotificationScheduler() // one for the whole app5 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
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
1https://github.com/muhittincamdali/iOS-Notification-Framework.gitلقطات الشاشة






الجدول الزمني
فُتح المستودع كنموذج أولي (prototype) لـ framework إشعارات؛ معظم الـ commits الأولى كانت دوكيومنتيشن وأمثلة وCI
صدر v1.0.0؛ أُعيد تشغيل main من commit واحد بـ API مستند إلى builder
إضافات صغيرة للنموذج الأولي: معاينة (preview) SwiftUI، ومدير Live Activity، ونوع push تنبّئي (predictive)
أُعيد البناء كـ 2.0.0 حول notification center قابل للاختبار؛ أُزيلت مصادر النموذج الأولي ولم يُحتفَظ بأي API من 1.x