لارافيل, Others / 2024-12-27

إرسال الإشعارات لأجهز الهواتف ( أندرويد و IOS ) في لارافيل.

إرسال الإشعارات لأجهز الهواتف ( أندرويد و IOS ) في لارافيل.

2024-12-27 وقت القراءه : 3 دقائق

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


لإرسال الإشعارات يمكنن لنا إستخدام google FCM فإننا بحاجة لإستخدام CURL request لإستدعاء FCM Api لإرسال الإشعارات، ونحتاج إلى Token و Firebase Key.


الحصول على Firebase Key

الذهاب إلى https://firebase.google.com/

الضغط على Go to console ثم create a project

تعبئة إسم المشروع. هنا قمت بإختيار laravel send notification

إختيار continue

إختيار create project.

ننتظر قليلا حتى يتم إنشاء المشروع، وبعد الإنشاء ستظهر لنا نافذه جديده .

من القائمة الجانبية نضغط على إيقنة الإعدادات وإختيار project settings

نذهب للتبويب cloud messagint فيظهر لنا server key.

مع العلم أن مبرمج التطبيقات هو من يجب أن يقوم بتزويدنا بالـ ServerKey، لكن أحببت أن يتم شرحها لكم.


الأن بعد أن حصلنا على server key يجب أن نحصل على token فما هو token؟

هو unique number يكون لكل هاتف مثبت عليه التطبيق، هنا في هذه الحالة أفترض ان التطبيق يتطلب تسجيل دخول من خلال الإسم، البريد الإلكتروني، كلمة المرور، ففي جدول users يجب إضافة حقل جديد بإسم token مثلا

php artisan make:migration addSocialToUsers 
public function up()
{
    Schema::table('users', function ($table) {
        $table->string('token');
    });
}

تنفيذ migration

php artisan:migrate

الأن كل مستخدم يتم تسجيله في قاعدة البيانات يكون له token خاص بالجهاز الخاص به، لكن تم ربطه مع المستخدم في قاعدة البيانات، وهذا يجب أن يقوم به مطور التطبيق (الهواتف)، حيث يجب أن يقوم بإرسال ( التوكين مع كل مستخدم ).


إعدادات لارافيل لإرسال الإشعارات

أفضل إنشاء class / trait منفصل لإرسال الإشعارات، ويتم إستدعائه في كل مكان نريد أن يتم إرسال الإشعارات.

<?php
namespace App\Http\Traits;
trait SendNotification
{
    public function notification($to,$title, $body, $page)
    {
        $firebase_key = => env('FIREBASE_KEY');
        $dataArr = array(
            'click_action' => 'FLUTTER_NOTIFICATION_CLICK',
            'status'=>"done",
            'screen'=>$page
        );
        $notification = array(
            'title' =>$title,
            'body' => $body,
            'sound' => 'default',
            'badge' => '1',
            );
        $arrayToSend = array(
            'to' => $to,
            'notification' => $notification,
            'data' => $dataArr,
            'priority'=>'high'
        );
        $dataString = json_encode ($arrayToSend);
        $headers = [
            'Authorization: key=' . $firebase_key,
            'Content-Type:application/json',
        ];


        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
        $response = curl_exec($ch);
        dd($response);
    }
}

كما نلاحظ أن الدالة notification تحتاج إلى (العنوان، نص الرسالة، مستلم الرسالة، الشاشة التي سيتم الذهاب اليها عند الضغط على الإشعار).

في ملف .env نقوم بتعريف FIREBASE_KEY

FIREBASE_KEY =AAAAXAYPuZg:APA91bGZoT4V8ot2uOCxt6TDRnEFVDXAoUguNaGkn12koPjsq5Ew3BNgtdyozLqzFd3y2uFObt15yuZjy8GYTx_JgI6WsW0EHG47Q8n7dI4T7Ddm-LtcU-u71JTwmxBRFZh-jPDRj1AI


إرسال الإشعارات

في كل كلاس نريد أن نستدعي دالة notifications يجب أن نستدعي SentNotification trait.

class NotificationController extends Controller
{
    use SendNotification;
    public function sendNotification(Request $request)
    {
       $users=User::select('token')->get();
       foreach ($users as $user){
            $this->notification($user->token, $request->title, $request->body, $notification->screen);
       }
    }
}

لفرض إنني إريد أن يتم إرسال إشعار عند كل إضافة لمقال

class ArticleController extends Controller{
    use SendNotification;
    
    public function store(Request $request)
    {
        $article = new Article();
        $article->title_ar = $request->input('title_ar');
        $article->text_ar = $request->input('text_ar');
        $article->save();
        $users=User::select('token')->get();

        //send notification
        foreach ($users as $user){
            $this->notification($user->token, $request->title, $request->text_ar, 'articles');
        }
        return redirect('/admin/article')->with('success', 'تم إضافة الخبر بنجاح');
    }
}

التعليقات
hazem
منذ 3 سنوات

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

moemen gaballa
منذ سنتين

شرح جميل جزاك الله خيرا اتمنى المزيد من المقالات الشيقة

moemen gaballa
منذ سنتين

اعتقد فيه مشكلة موجوده ولم دورت على مثال اخر لقيت شكل الداتا اللى بتتبعت مختلف $data = [ \"registration_ids\" => $firebaseToken, \"notification\" => [ \"title\" => $request->title, \"body\" => $request->body, ] ]; registration_ids ولم استخدمت طريقة حضرتك وشوفت ال response كان بيبقى to\\n

إضافة تعليق
Loading...