A comprehensive solution for sending Firebase Cloud Messaging (FCM) notifications from a Laravel backend to Flutter applications.
This section explains how to set up and use the Laravel package to send notifications.
- Laravel Version: 8+
- Firebase Project: Create one in the Firebase Console
- Service Account Key: Download the JSON file from your Firebase project settings
-
Install via Composer:
composer require sendfirebase/notificationphp
-
Publish the Configuration:
php artisan vendor:publish --provider="SendFireBaseNotificationPHP\Providers\FireBaseNotificationServiceProvider" --tag="config"
-
Configure Your Environment:
Add these lines to your
.env
file:FIREBASE_PROJECT_ID=your-project-id FIREBASE_API_VERSION=v1
-
Store Firebase Credentials:
Create a directory and move your service account JSON file:
mkdir -p storage/app/firebase mv path/to/your-service-account.json storage/app/firebase/firebase_credentials.json
Ensure your config/firebase.php
file contains:
return [
'project_id' => env('FIREBASE_PROJECT_ID'),
'version' => env('FIREBASE_API_VERSION', 'v1'),
'credentials_file' => storage_path('app/firebase/firebase_credentials.json'),
];
1. Send a Notification to a Single User:
use App\Models\User;
use SendFireBaseNotificationPHP\FirebaseNotificationService;
public function notifyUser(Request $request)
{
$firebaseService = new FirebaseNotificationService();
$response = $firebaseService->sendNotificationToSingle(
new User(), // User model instance
$request->user_id, // Target user ID
"New Message", // Notification title
"You have a new notification!", // Notification body
'fcm_token' // Column name where FCM token is stored
);
return response()->json($response);
}
2. Broadcast a Notification to All Users:
$firebaseService->sendNotificationToAll(
new User(), // User model instance
"Global Alert", // Notification title
"Important system update!", // Notification body
'fcm_token' // Column name for FCM token
);
3. Send a Notification to a Topic:
$firebaseService->sendNotificationToTopic(
"all_users", // Topic name
"Topic Update", // Notification title
"New content available!" // Notification body
);
-
Missing Credentials:
Verify that the service account JSON is located instorage/app/firebase
and that your Firebase project ID in the.env
file matches your Firebase credentials. -
General Issues:
Check your Laravel logs for errors and review the configuration inconfig/firebase.php
.
This section details the steps for setting up your Flutter application to receive and handle Firebase notifications.
- Flutter Version: 3.0+
- Firebase Project: Ensure your Firebase project is configured for both Android and iOS
- Platform-Specific Setup: For iOS, follow the Firebase iOS Setup
-
Add Dependencies:
Add the following dependencies to your
pubspec.yaml
:dependencies: firebase_messaging: ^15.2.1 flutter_local_notifications: ^18.0.1
-
Basic App Initialization:
In your
main.dart
, initialize notifications before running the app:void main() async { WidgetsFlutterBinding.ensureInitialized(); await FbNotifications.initNotifications(); runApp(MyApp()); }
Implement a mixin to centralize notification setup and handling:
mixin FbNotifications on State<MyApp> {
static late AndroidNotificationChannel channel;
static late FlutterLocalNotificationsPlugin localNotificationsPlugin;
// Background Handler
static Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print("Handling background message: ${message.messageId}");
}
// Initialization: Set up channels and permissions
static Future<void> initNotifications() async {
FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
// Android Channel Setup
channel = const AndroidNotificationChannel(
'high_importance_channel',
'Important Notifications',
importance: Importance.high,
playSound: true,
);
localNotificationsPlugin = FlutterLocalNotificationsPlugin();
await localNotificationsPlugin
.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
// iOS Notification Presentation Options
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
}
// Request Notification Permissions (especially for iOS)
Future<void> requestNotificationPermissions() async {
final settings = await FirebaseMessaging.instance.requestPermission(
alert: true,
badge: true,
sound: true,
);
if (settings.authorizationStatus == AuthorizationStatus.authorized) {
print('Notifications granted');
}
}
// Foreground Notification Handling for Android
void initializeForegroundNotificationForAndroid() {
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification? notification = message.notification;
AndroidNotification? android = notification?.android;
if (notification != null && android != null) {
localNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
icon: '@mipmap/ic_launcher',
),
),
);
}
});
}
}
-
Platform-Specific Configurations:
-
Android:
Update yourAndroidManifest.xml
to include:<application ...> <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="high_importance_channel"/> </application>
-
iOS:
Follow the official Firebase iOS setup guide and ensure push notifications are enabled in Xcode.
-
Subscribing to a Topic:
FirebaseMessaging.instance.subscribeToTopic("all_users");
Handling Background Messages:
FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
Handling Notification Taps (when the app is opened via a notification):
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
Navigator.pushNamed(context, '/message');
});
Listening for Token Refresh:
FirebaseMessaging.instance.onTokenRefresh.listen((newToken) {
// Update your server with the new token
});
-
iOS Notifications Not Showing:
Make sure you have completed the iOS setup in Xcode, requested user permissions, and enabled push notifications in your Apple Developer account. -
Android Notifications Silent:
Confirm that the notification channel’s importance is set to high, and verify the metadata inAndroidManifest.xml
. -
Token Issues:
Ensure that you handle token refresh correctly to keep the server updated with the latest token.
We welcome your contributions to improve the project for both Laravel and Flutter users!
-
Report Issues:
Use GitHub Issues to report bugs or request new features. -
Development Setup:
git clone https://github.com/YacoubAl-hardari/firebasenotificationphp.git cd firebasenotificationphp composer install
-
Testing: Create tests in the
tests/
directory and run:php artisan test
-
Coding Standards:
Follow the PSR-12 coding style, use PHPStan (level 6), and include PHPDoc comments. -
Pull Requests:
Fork the repository, create feature branches, and submit a PR with a detailed description of your changes.