تنبيهات أبل: التسجيل والإعداد

إرسال التنبيهات إلى أجهزة iOS باستخدام Apple Push Notifications

Alhoqbaniمنذ سنتين

بسم الله الرحمن الرحيم

سوف نستعرض طريقة إرسال التنبهيات من سيرفرك أو موقعك الخاص إلى تطبيقات الـiOS.

لابد أن يتوفر لديك عضوية في برنامج مطور أبل حتى تتمكن من إرسال التنبيهات وتطبيق الخطوات الواردة في المقال. قيمة الاشتراك في العضوية 99 دولار سنويًا.

كما أننا سوف نستخدم Xcode و Swift لعمل تطبيق الـiOS وفي المقال القادم سوف نقوم بعمل موقع لإرسال التنبيهات باستخدام php وLaravel

هنالك العديد من الطرق المختلفة لإرسال التنبيهات إلى أجهزة مستخدمي تطبيقك على الـiOS عبر الاتصال بخدمة أبل لدفع التنبيهات APNs، ومن أشهرها Firebase FCM و pusher.com. ولكن في هذي السلسلة من المقالات سوف نقوم بعمل ذلك بالاتصال مباشرة بالAPI الخاص بأبل دون استخدام طرف ثالث.

وقد لا تكون هذه الطريقة هي المثالية، حيث أنها تستغرق الكثير من الخطوات لتنفيذها، ولكن سوف نقوم بعملها بشكل مبسط، وتستطيع بعد ذلك تطويرها لتناسب احتياجك أو استخدام أحد مزودي الخدمة المذكورين أعلاه.

تنبيهات أبل

التنبيهات في أجهزة الـiOS تنقسم إلى نوعين: Local Notifications وهي التنبيهات التي يقوم بها التطبيق من داخل الجهاز دون الحاجة إلى القيام باتصال خارجي، مثل التنبية الذي يقوم به المنبه، والنوع الثاني Remote Notifications والتي يتم تفعيلها باستقبال اتصال خارجي، مثل تنبهيات الرسائل، والواتس اب وغيرها. وهناك تشابه كبير بين النوعين حيث كلاهما يعمل من خلال الـUserNotifications Framework ولكن سوف ينحصر حديثنا على الـRemote Notifications.

طريقة عمل التنبيهات

الخطوة الأولى لإرسال التنبيهات إلى أجهزة الـiOS هي الحصول على إذن من المستخدم لاستخدام التنبيهات Asking Permission to Use Notifications، وعند موافقة المستخدم يقوم تطبيقك بالتسجيل في نظام التنبيهات Registering Your App with APNs، ويزودك برقم خاص بجهاز المستخدم (Device Token) تستطيع من خلاله إرسال التنبيهات عبر الاتصال بخدمة أبل لدفع التنبيهات Apple Push Notification service (APNs).

وحتى تتمكن من إرسال التنبيهات إلى أجهزة مستخدمي تطبيقك فيجب أن يكون اتصالك بالـAPNs موثقًا وذلك بالحصول على شهادة Certificate أو بإصدار مفتاح Key يخولك التواصل مع APNs وذلك من بوابة أبل للمطورين.

وأخيرًا يمكنك إرسال التنبيهات باستخدام الـDevice Token الذي تم الحصول عليه عند التسجيل في نظام التنبيهات، وذلك عبر خدمة أبل لدفع التنبيهات APNs.

في هذا المقال سوف نقوم بإنشاء تطبيق iOS جديد، وعمل الاجراءات اللازمة للحصول على الـDevice Token تجهيزًا لإرسال التنبيهات في المقال القادم بإذن الله.

تفعيل التنبيهات في التطبيق

للحصول على شهادة مصادقة الاتصال بــAPNs فإننا نحتاج إلى إنشاء تطبيق iOS جديد، وتفعيل الـBundle Identifier الخاص به مع خدمة Push Notification.

نبدأ بإنشاء مشروع جديد باستخدام Xcode.

قم بفتح Xcode وإنشاء مشروع جديد واختيار قالب Single View App.

قم باختيار اسم للتطبيق Product Name، والأهم التركيز على الـBundle Identifier والذي سوف نستخدمه لاستخراج الشهادة.

Bundle

كما يمكن تعديل نسخة الـiOS التي يدعمها تطبيقك إلى 10.0 حيث أن الـUserNotifications والذي سنقوم باستخدامه للتسجيل مع نظام التنبيهات تم إصداره في النسخة 10.0. نقوم بذلك بتعديل الـDeployment Target إلى 10.0

Deployment Target

الخطوة التالية هي التعديل على الصلاحيات الممنوحة للتطبيق حتى نتمكن من استقبال التنبيهات.

من إعدادات المشروع الخاصة بالـTarget قم باختيار Capabilities وسنقوم بتفعيل اثنين من هذه الصلاحيات Background Modes و Push Notifications.

قم بتفعيل خيار الـBackground Modes واختيار Remote notifications من القائمة.

Background Modes

ثم نقوم بتفعيل خيار الـPush Notifications من نفس الشاشة

cap-push

شهادة المصادقة

الخطوة الأولى: إنشاء طلب توقيع شهادة.

قبل طلب الشهادة من موقع أبل يجب إنشاء طلب توقيع شهادة Certificate Signing Request (CSR) لنقوم بإرفاقه مع طلب الشهادة،

ويمكن إنشاء ملف CSR مباشرة من جهاز الماك الخاص بك. 

قم بفتح برنامج الـKeychain Acees ومن القائمة الرئيسية بأعلى الشاشة قم باختيار: 

 Keychain Access > Certificate Assistance > Request A Certificate From A Certificate Authority

csr

قم بإدخال اسمك وبريدك الالكتروني وتغيير Request is إلى Saved to disk كما هو موضح بالصورة أعلاه.

قم بحفظ الملف والذي سيكون غالبًا باسم CertificateSigningRequest.certSigningRequest بنفس الاسم إلى مجلد جديد على سطح المكتب باسم Certificates

سوف نقوم بإنشاء عدة ملفات في الأوامر التالية وسأفترض بأن الملف تم حفظه على المسار التالي:

~/Desktop/Certificates/CertificateSigningRequest.certSigningRequest

الخطوة الثانية: طلب شهادة المصادقة

بعد الدخول إلى حسابك في موقع Apple Developer توجه إلى قسم الشهادات والتعريفات Certificates, Identifiers & Profiles ومن قائمة iOS Certificates قم بالضغط على علامة الزائد لطلب شهادة جديدة.

لنوع الشهادة type of certificate سوف نختار Apple Push Notification service SSL (Sandbox & Production) والتي تمكننا من التواصل مع الـAPNs أثناء تطوير التطبيق وكذلك بعد رفع التطبيق إلى متجر أبل.

في الصفحة التالية تأكد من اختيار الـApp ID الخاص بالتطبيق الذي قمت بإنشائه، إذا لم يظهر لك في القائمة فتأكد من أنك قد قمت بتفعيل خاصية التنبيهات في إعدادات التطبيق، كم ذكرنا أعلاه.

بعذ ذلك قم برفع ملف طلب توقيع الشهادة CertificateSigningRequest.certSigningRequest الذي قمنا بإنشاءه في الخطوة السابقة.

وأخيرًا قم بتحميل الشهادة التي تم إصدارها asp.csr إلى المجلد Certificates الذي أنشأناه على سطح المكتب.

asp.gif

الخطوة الثالثة: تحويل نوع الشهادة

الشهادة التي تم الحصول عليها من موقع أبل تحمل الإمتداد cer ولكن للاتصال بخدمة APNs فإننا بحاجة إلى تغييرها إلى PEM أو P12. وبذلك يمكننا تجربة الخدمة عن طريق المواقع والخدمات المذكورة في الخطوة التالية، أو استخدامها في موقعنا الذي سنقوم ببناءه باستخدام PHP.

سنقوم بإنشاء ملفين إضافيين للشهادة، وبالتالي يصبح لدينا ثلاثة نسخ من الشهادة: cer, PEM, P12.

قم بإضافة الملف aps.cer الذي تم تحميله في الخطوة السابقة إلى برنامج Keychain Access وذلك بالضغط عليه مرتين.

بعد استيراد الملف سوف تجد الشهادة والتي تحمل الـApp ID الخاص بك تحت الـlogin keychain والـcategory My Certificates 

ستقوم بتصدير نسخة من نوع P12 وذلك بالضغط على اسمك بالزر اليمين واختيار Export.

export-certificate

سوف يطلب منك ادخال كلمة مرور جديدة لحماية الشهادة. يمكنك تجاوز هذه الخطوة وعدم اختيار كلمة مرور.

احفظ الملف بالاسم Certificates.p12 في المجلد Certificates على سطح المكتب.

أخيرًا، سنقوم باصدار الشهادة من النوع PEM وذلك بتنفيذ الأمر التالي من الـTerminal

openssl pkcs12 -in ~/Desktop/Certificates/Certificates.p12 -out ~/Desktop/Certificates/Certificates.pem -nodes

إذا لم تقم باختيار كلمة مرور قم بالضغط على Enter لتحويل الشهادة أو أدخل كلمة المرور.

الشهادات التي قمنا بإصدارها تمكننا من مصادقة الاتصال مع سيرفرات أبل. كما يمكن المصادقة على الاتصال باستخدام الـBearer Token Authentication وذلك بإصدار Key خاص بالتطبيق. وهذه النوع من المصادقة هو ما يتم استخدامه في حال رغبت في استخدام Firebase FCM أو Push.com

إذن المستخدم والـDevice Token

سنعود إلى تطبيقنا لإكمال الإعدادات والحصول على الـDevice Token لنتمكن من تجربة الخدمة وإرسال الإشعارات.

Device Token

هذه الخطوة تستوجب تشغيل التطبيق على جهاز الايفون مباشرة، ولا يمكن الحصول على الـToken بتشغيل التطبيق على الـsimulator

قم بفتح التطبيق في xcode وتعديل الدالة  application(_:didFinishLaunchingWithOptions:) في الملف AppDelegate.swift كالتالي:

   
// إضافة الفريمورك
import UIKit
import UserNotifications

//
//

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
// طلب الإذن من المستخدم لتفعيل التنبيهات
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
            
            if granted {

                // في حال الموافقة سوف نقوم بالتسجيل في نظام التنبيهات
                DispatchQueue.main.async {
                    application.registerForRemoteNotifications()
                }
                
            } else {
                print(error?.localizedDescription ?? "Notification registartion failed.")
            }
            
        }
        
        return true
    }

في حال الموافقة سوف يقوم النظام باستدعاء الدالة  application(_:didRegisterForRemoteNotificationsWithDeviceToken:) وإرفاق الـDevice Token.

سنقوم بتحويل الـToken إلى نص وطباعته في الكونسول لتجربة الخدمة، ولاحقًا سنقوم بإرساله إلى السيرفر الخاص بنا لنتمكن من إرسال التنبيهات.

قم بإضافة الدوال التالي للكلاس AppDelegate

    // MARK: - APNs
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // تحويل الرقم إلى نص حتى نتمكن من استخدامه وإرساله إلى السيرفر
        let token = deviceToken.map { String(format: "%.2hhx", $0) }.joined()
        
        print(">>> Token: \(token)")
    }
    
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        // طباعة الخطأ في حالة الفشل
        print(">>> didFailToRegisterForRemoteNotificationsWithError. Error: \(error)")
    }

والآن قم بتوصيل الآيفون بالجهاز وتشغيل التطبيق على الآيفون للحصول على الـToken. (لا تعمل الخدمة على المحاكي).

سوف تظهر شاشة طلب الموافقة على التنبيهات، وبعد الموافقة سوف يتم طباعة الـToken في الكونسول. قم بحفظه لاستخدامه في الخطوة القادمة.

token
طباعة الـDevice Token

تجربة الإرسال

قبل أن نبدأ في تجرب الإرسال لا بد أن نقوم بإضافة الدوال اللازمة لإظهار التنبيه عند وصوله. يقوم نظام iOS باستدعاء دالة userNotificationCenter(_:willPresent:withCompletionHandler:)  عند وصول التنبيه. هذي الدالة تتبع للكلاس: UNUserNotificationCenterDelegate ويمكن من خلالها إظهار التنبيه أو تعديله أو حتى تجاهله.

ولتفعيل الدالة نبدأ بتعيين الكلاس AppDelegate ليكون الـDelegate للـUNUserNotificationCenter وذلك بإضافة الكود التالي في بداية الدالة:  application(_:didFinishLaunchingWithOptions:)

UNUserNotificationCenter.current().delegate = self

أيضًا سنقوم بإضافة Extension في أسفل الملف AppDelegate.swift لاستخدام دوال الـDelegate

// MARK: - UNUserNotificationCenterDelegate

extension AppDelegate: UNUserNotificationCenterDelegate {
    
    // تستدعى هذه الدالة عند وصول التنبيه وقبل إظهاره
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // يمكن التعديل على التنبيه هنا ثم إظهاره
        //  في هذه الحالة، نقوم بإظهار التنبيه كما وصل وتفعيل الصوت والرقم
        completionHandler([.alert, .sound, .badge])
    }
    
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        // تستدعى الدالة عن تجاوب المستخدم مع التنبيه إما بتفح التطبيق أو إزالة التنبيه
        print(">>> User responded to notification with: \(response.actionIdentifier)")
        
        completionHandler()
    }
    
    
}

قم ببناء التطبيق وتشغيله على الأيفون ولنبدأ بتجربة الإرسال.

يمكن تجربة الإرسال باستخدام موقع pushtry.com أو البرنامج Pusher وهو الطريقة المفضلة لدي.

برنامج Pusher

إذا كنت تستخدم Homebrew على الماك فيمكنك تحميل البرنامج Pusher من خلال اللأمر:

brew cask install pusher

أو بتحميل النسخة من هذا الرابط.

بعد تشغيل البرنامج، سوف يقوم بقراءة الشهادات الموجودة لديك على الـkeychain access، قم باختيار الشهادة الخاصة بتطبيقك. إذا لم تكن الشهادة من ضمن القائمة يمكن إضافة ملف الشهادة من النوع P12 لاستخدامها.

ثم قم بادخال الـtoken الذي حصلت عليه في الخطوة السابقة، ثم الضغط على Push وسوف يصلك التنبيه مباشرة.

push

كما يمكنك تعديل محتوى الرسالة بتغيير الـpayload. وسوف نتطرق إلى ما يمكن إضافته إليه في المقالات القادمة بإذن الله.

موقع Pushtry 
قم بزيارة الموقع وتعبئة البيانات، يمكن إستخدام أي الشهادتين من النوع PEM أو P12، أضف الـtoken واختر نوع الرسالة json، ثم قم بالإرسال.

 

في المقال القادم سوف نقوم ببناء موقعنا الخاص بإرسال التنبيهات إلى مستخدمي التطبيق.

كلمات دليلية: apns apple ios swift
7
إعجاب
1531
مشاهدات
1
مشاركة
2
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !