واحدة من أهم الإمور التي يجب القيام بها عند إستخدام لارافيل كـ backend لتطبيقات الهواتف الذكية هي إرسال الإشعارات للهواتف، في هذه المقالة سوف يتم شرح كيفية تجهيز لارافيل لإرسال الإشعارات، مع العلم إنه لن يتم شرح كيف يتم إستقبالها في الهواتف، فما يهمنا هنا هو أعدادات لارافيل.
لإرسال الإشعارات يمكنن لنا إستخدام google FCM فإننا بحاجة لإستخدام CURL request لإستدعاء FCM Api لإرسال الإشعارات، ونحتاج إلى Token و 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، لكن أحببت أن يتم شرحها لكم.
هو 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', 'تم إضافة الخبر بنجاح'); } }
شرح جميل جزاك الله خيرا اتمنى المزيد من المقالات الشيقة
اعتقد فيه مشكلة موجوده ولم دورت على مثال اخر لقيت شكل الداتا اللى بتتبعت مختلف $data = [ \"registration_ids\" => $firebaseToken, \"notification\" => [ \"title\" => $request->title, \"body\" => $request->body, ] ]; registration_ids ولم استخدمت طريقة حضرتك وشوفت ال response كان بيبقى to\\n
hazem
حلو مشكور جدا طيب الكلام هادا كيف هيكون مع الويب وكيف هستقبل الاشعارات و ازيد العداد