Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cyberwani/f0987fd98acc65e4193f519344538bf0 to your computer and use it in GitHub Desktop.
Save cyberwani/f0987fd98acc65e4193f519344538bf0 to your computer and use it in GitHub Desktop.
PHP => FCM Push notification tutorial for Android and iOS
Below is a full tutorial on how to setup and use Googles Firebase push notification API for both Android and iOS. It is based on this
earlier implementation of Googles GCM method: https://gist.github.com/prime31/5675017 - FCM is the new method and GCM will eventually be
retired.
## THE BELOW METHOD IS THE NEWER FCM METHOD:
Register your app in the FCM Console: https://console.firebase.google.com (add project)
1. Click on the newly added project, in the upper left menu is the "Overview" and Gear Settings.
2. Click on the GEAR settings icon, and then on "Project Settings"
3. In the main screen, click on "Cloud Messaging"
4. Here you will find both your "Server Key" and "SenderID"
5. The "Server Key" is what is used below as the API_ACCESS_KEY
6. The "SenderID" is what your app (on the client phone) will need to generate a 'registration_ID'
7. You now need to register the "senderID" in your developer play console of your app
8. Go to: https://play.google.com, login to manage your app on the playstore
9. Click on the specific app and in the left menu under "Development Tools" click on "Serivces & APIs"
10. Under the Firebase Cloud Messaging (FCM) section, click "Link Sender ID", add your "server key" and click "link". After it links, your "senderID" will appear in the linked section.
OLD 11. In your App, (I use Cordova => phonegap-plugin-push plugin), make a call the FCM server, passing the senderID
NEW 11. I now use `cordova-plugin-firebasex` - a much more rebust and supported plugin that full integrates all of Firebase SDK into your project. In your App, make a call to the FCM server, passing the senderID
12. The client App will receive the "registration_ID". - this is a unique ID that specifically registers the users phone
to receive messages on behalf of your app.
13. Your app will need to pass the 'registration_ID' to your server. In my case, my app passes it via an api call. But
your app could simply pass a silent url call to your server to capture the users 'registration_ID'
(ie: http://yourserver.com/passID.php?userID=jdoe&regID=$registration_ID).
14. Ideally, you will want to store that registration_ID locally on your server (mysql).
15. In the future, when you need to push a notification to that user, call up the stored registration_ID and pass it to
the script below:
`NOTE: Once your register your app in the FCM console and retrieve your Server Key and SenderID, it might take 12 to 24 hours
for the IDs to propagate to the FCM messaging servers. I experienced this, minutes after registering my code worked but phone
never received the messages...10 hours later...no changes to my code...phone suddenly started getting the messages. I assume
it was a propagation issue.`
## REGISTERING YOUR APPLE APNs KEY in GOOGLE'S FCM CONSOLE:
1. You will need to link the Apple version of your app to your FCM App project. On the Firebase project main page, click add "+ Add another App". Then "iOS App"
2. After it is linked, in the same section as #4 & #5 above, you will see a section for "iOS Apps" and you should see
your App name listed
3. Here you can add your APNs Auth Key ....OR....add APNs Certificates - it is easier and recommend to do the Auth Key method.
4. Login to your Apple Developer Account: https://developer.apple.com/
5. Click on "Account" , then on "Certificates, IDs & Profiles"
6. Make certain your on the "ALL" section in the left hand menu, the click the (+) sign in the top right of the main screen
7. Under the "Production" section, select the "Apple Push Notification Authentication Key (Sandbox & Production) option.
8. Click on continue
9. You will be provided with an Auth Key AND a downloadable authkey file - you will need both. Download the file - but
do NOT change the name of the file
10. While here copy down your Team ID - click on "Account" again, then on "Membership" in the left hand menu
11. Copy your "Team ID"
12. Back in the FCM Console (#3), click on the "add/upload" button in the Apple APNs section next to your listed app.
13. KeyID = #9 Auth Key, File = "#9 downloaded file", App ID Prefix = "#11 Team ID"
14. Save/upload
`You iOS app is now registered with Googles FCM, Google FCM can now send/relay messages to iPhones/iPads
The only remaining step is to have your client iOS/iPhone App retrieve and send a proper registrationID to your server
side script (below). In my case, the same Cordova phonegap-plugin-push plugin extracts the Apple registrationID too.`
`NOTE: If you are integrating the Firebase SDK into a phonegap/cordova project, when your App launches it will try to connect to Firebase Crashlytics automatically, you will need to setup Crashlytics in our FCM App Project. If you are using Fabric in our current project you will need to link your Fabric account to your FCM Project App or you will get [Fabric] errors in the app launch. How to link Fabric to FCM Crashlytics: https://proandroiddev.com/migrating-crashlytics-to-the-firebase-console-5e05b6ff8c12`
// I migrated my server side code to a php-fcm class project, making server side FCM notification mgmt MUCH easier and cleaner.
// The guy who wrote the original no longer supports it so I expanded it out to include a lot more functionality and plan
// on adding more.
//
// NEW PHP SERVER SIDE CODE
// https://github.com/rolinger/php-fcm
<?php
// Load composer
require 'vendor/autoload.php';
// Instantiate the client with the project api_token and sender_id.
$client = new \Fcm\FcmClient($apiToken, $senderId);
// Instantiate the push notification request object.
$notification = new \Fcm\Push\Notification();
// Enhance the notification object with our custom options.
$notification
->addRecipient($deviceId)
->setTitle('Hello from php-fcm!')
->setBody('Notification body')
->addData('key', 'value'), // add single key/value pair
->addDataArray($myArray); // add preset array of key/value
// Send the notification to the Firebase servers for further handling.
$client->send($notification);
//
// OLD PHP SERVER SIDE CODE BELOW -
//
<?php
// API access key from Google FCM App Console
define( 'API_ACCESS_KEY', 'AAAAkPyMydI:A.............FWPt6AfWsrEFb6Ww' );
// generated via the cordova phonegap-plugin-push using "senderID" (found in FCM App Console)
// this was generated from my phone and outputted via a console.log() in the function that calls the plugin
// my phone, using my FCM senderID, to generate the following registrationId
$singleID = 'eEvFbrtfRMA:APA91bFoT2XFPeM5bLQdsa8-HpVbOIllzgITD8gL9wohZBg9U.............mNYTUewd8pjBtoywd' ;
$registrationIDs = array(
'eEvFbrtfRMA:APA91bFoT2XFPeM5bLQdsa8-HpVbOIllzgITD8gL9wohZBg9U.............mNYTUewd8pjBtoywd',
'eEvFbrtfRMA:APA91bFoT2XFPeM5bLQdsa8-HpVbOIllzgITD8gL9wohZBg9U.............mNYTUewd8pjBtoywd'
'eEvFbrtfRMA:APA91bFoT2XFPeM5bLQdsa8-HpVbOIllzgITD8gL9wohZBg9U.............mNYTUewd8pjBtoywd'
) ;
// prep the bundle
// to see all the options for FCM to/notification payload:
// https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
// 'vibrate' available in GCM, but not in FCM
$fcmMsg = array(
'body' => 'here is a message. message',
'title' => 'This is title #1',
'sound' => "default",
'color' => "#203E78"
);
// I haven't figured 'color' out yet.
// On one phone 'color' was the background color behind the actual app icon. (ie Samsung Galaxy S5)
// On another phone, it was the color of the app icon. (ie: LG K20 Plush)
// 'to' => $singleID ; // expecting a single ID
// 'registration_ids' => $registrationIDs ; // expects an array of ids
// 'priority' => 'high' ; // options are normal and high, if not set, defaults to high.
$fcmFields = array(
'to' => $singleID,
'priority' => 'high',
'notification' => $fcmMsg
);
$headers = array(
'Authorization: key=' . API_ACCESS_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_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fcmFields ) );
$result = curl_exec($ch );
curl_close( $ch );
echo $result . "\n\n";
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment