This is an easy to use package to send push notification.
- GCM
- FCM
- FCMV1
- APN
type in console:
composer require "edujugon/push-notification:^v3.0.0"
type in console:
composer require edujugon/push-notification
The package will automatically register its service provider.
Publish the package's configuration file to the application's own config directory
php artisan vendor:publish --provider="Edujugon\PushNotification\Providers\PushNotificationServiceProvider" --tag="config"
Go to laravel facade sample directly.
After publishing the configuration, you can find the Push service config in config/pushnotification.php
The default configuration parameters for GCM and FCM are :
- priority => normal
- dry_run => false
- apiKey => Your ApiKey
You can dynamically update those values or adding new ones calling the method setConfig like so:
$push->setConfig([
'priority' => 'high',
'dry_run' => true,
'time_to_live' => 3
]);
The default configuration parameters for FCMV1 are :
priority => 'normal'
dry_run => false
projectId => 'my-project-id'
jsonFile => __DIR__ . '/fcmCertificates/file.json'
You can dynamically update those values or adding new ones calling the method setConfig like so:
$push->setConfig([
'priority' => 'high',
'projectId' => 'my-real-project-id',
'jsonFile' => 'path/to/credentials.json'
]);
To generate a credentials json file for your service account:
- In the Firebase console, open Settings > Service Accounts.
- Click Generate New Private Key, then confirm by clicking Generate Key.
- Securely store the JSON file containing the key.
The default configuration parameters for APN are:
certificate => __DIR__ . '/iosCertificates/yourCertificate.pem'
passPhrase => 'MyPassPhrase'
passFile => __DIR__ . '/iosCertificates/yourKey.pem' //Optional
dry_run => false
(Make sure to set dry_run
to true
if you're using development *.pem certificate, and false
for production)
Also you can update those values and add more dynamically
$push->setConfig([
'passPhrase' => 'NewPass',
'custom' => 'MycustomValue',
'dry_run' => true
]);
Even you may update the url of the Push Service dynamically like follows:
$push->setUrl('http://newPushServiceUrl.com');
Not update the url unless it's really necessary.
You can specify the number of client-side attempts to APN before giving
up. The default amount is 3 attempts. You can override this value by
specifying connection_attempts
in setConfig()
assoc-array. Keep in
mind the default number of requested attempts is 3.
If you prefer to retry indefinitely, set connection_attempts
to zero.
$push->setConfig([
'passPhrase' => 'NewPass',
'custom' => 'MycustomValue',
'connection_attempts' => 0,
'dry_run' => true
]);
$push = new PushNotification;
By default it will use GCM as Push Service provider.
For APN Service:
$push = new PushNotification('apn');
For FCM Service:
$push = new PushNotification('fcm');
For FCMV1 Service:
$push = new PushNotification('fcmv1');
Now you may use any method that you need. Please see the API List.
Go to Usage samples directly.
setService
method sets the push service to be used, which you pass the name through parameter as a string.
Syntax
object setService($name)
setMessage
method sets the message parameters, which you pass the values through parameter as an array.
Syntax
object setMessage(array $data)
Only for gcm and fcm
setApiKey
method sets the API Key of your App, which you pass the key through parameter as a string.
Syntax
object setApiKey($api_key)
Only for fcmv1
setProjectId
method sets the Project ID of your App as a string.
Syntax
object setProjectId($project_id)
Only for fcmv1
setJsonFile
method sets the path of credentials json file of your App.
Syntax
object setJsonFile($api_key)
setDevicesToken
method sets the devices' tokens, which you pass the token through parameter as array or string if it was only one.
Syntax
object setDevicesToken($deviceTokens)
send
method sends the notification.
Syntax
object send()
getFeedback
method gets the notification response, which you may use it chaining it to send
method or call it whenever after sending a notification.
Syntax
object getFeedback()
getUnregisteredDeviceTokens
method gets the devices' tokens that couldn't receive the notification because they aren't registered to the Push service provider.
You may use it chaining it to send
method or call it whenever after sending a notification.
Syntax
array getUnregisteredDeviceTokens()
setConfig
method sets the Push service configuration, which you pass the name through parameter as an array.
Syntax
object setConfig(array $config)
setUrl
method sets the Push service url, which you pass the name through parameter as a string.
Syntax
object setUrl($url)
Not update the url unless it's really necessary.
Only for fcm
sendBytopic
method sends a message by topic. It also accepts the topic condition. more details here
If isCondition is true, $topic will be treated as an expression
Syntax
object sendByTopic($topic,$isCondition)
You can chain the methods.
GCM sample:
$push->setMessage([
'notification' => [
'title'=>'This is the title',
'body'=>'This is the message',
'sound' => 'default'
],
'data' => [
'extraPayLoad1' => 'value1',
'extraPayLoad2' => 'value2'
]
])
->setApiKey('Server-API-Key')
->setDevicesToken(['deviceToken1','deviceToken2','deviceToken3'...]);
APN sample:
$push->setMessage([
'aps' => [
'alert' => [
'title' => 'This is the title',
'body' => 'This is the body'
],
'sound' => 'default',
'badge' => 1
],
'extraPayLoad' => [
'custom' => 'My custom data',
]
])
->setDevicesToken(['deviceToken1','deviceToken2','deviceToken3'...]);
or do it separately
$push->setMessage([
'notification' => [
'title'=>'This is the title',
'body'=>'This is the message',
'sound' => 'default'
],
'data' => [
'extraPayLoad1' => 'value1',
'extraPayLoad2' => 'value2'
]
]);
$push->setApiKey('Server-API-Key');
$push->setDevicesToken(['deviceToken1'
,'deviceToken2',
'deviceToken3'
]);
If you want send the notification to only 1 device, you may pass the value as string.
$push->setDevicesToken('deviceToken');
Method send() can be also chained to the above methods.
$push->setMessage([
'notification' => [
'title'=>'This is the title',
'body'=>'This is the message',
'sound' => 'default'
],
'data' => [
'extraPayLoad1' => 'value1',
'extraPayLoad2' => 'value2'
]
])
->setApiKey('Server-API-Key')
->setDevicesToken(['deviceToken1','deviceToken2','deviceToken3'...])
->send();
$push = new PushNotification('fcm');
$response = $push->setMessage(['message'=>'Hello World'])
->setApiKey('YOUR-API-KEY')
->setConfig(['dry_run' => false])
->sendByTopic('dogs');
or with a condition:
$push = new PushNotification('fcm');
$response = $push->setMessage(['message'=>'Hello World'])
->setApiKey('YOUR-API-KEY')
->setConfig(['dry_run' => false])
->sendByTopic("'dogs' in topics || 'cats' in topics",true);
Add a notification
key when setting the message in setMessage
method. like follows:
$push->setMessage([
'notification' => [
'title'=>'This is the title',
'body'=>'This is the message',
'sound' => 'default'
]
);
You may add some extra payload adding a data
key when setting the message in setMessage
method.
$push->setMessage([
'notification' => [
'title'=>'This is the title',
'body'=>'This is the message',
'sound' => 'default'
],
'data' => [
'extraPayLoad1' => 'value1',
'extraPayLoad2' => 'value2'
]
]);
By default, this package sends the notification as Data Message. So no need to add a data
key.
$push->setMessage([
'title'=>'This is the title',
'body'=>'This is the message',
'myCustomVAlue' => 'value'
]);
The above example is like you were sending the following:
$push->setMessage([
'data' => [
'title'=>'This is the title',
'body'=>'This is the message',
'myCustomVAlue' => 'value'
]
]);
For more details, have a look at gcm/fcm notification paypload support and the concept options
If you want to get the push service response, you can call the method getFeedback
:
$push->getFeedback();
Or again, chain it to the above methods:
$push->setMessage(['body'=>'This is the message','title'=>'This is the title'])
->setApiKey('Server-API-Key')
->setDevicesToken(['deviceToken1','deviceToken2','deviceToken3'...])
->send()
->getFeedback();
It will return an object with the response.
Any time you send a notification, it will check if APN server has any feedback for your certificate. If so, the responses are merged to our feedback like below:
class stdClass#21 (4) {
public $success =>
int(0)
public $failure =>
int(1)
public $tokenFailList =>
array(1) {
[0] =>
string(64) "c55741656e6c3185f3474291aebb5cf878b8719288e52bf4c497292b320312c5"
}
public $apnsFeedback =>
array(1) {
[0] =>
class stdClass#16 (3) {
public $timestamp =>
int(1478272639)
public $length =>
int(32)
public $devtoken =>
string(64) "c55741656e6c3185f3474291aebb5cf878b8719288e52bf4c497292b320312c5"
}
}
}
After sending a notification, you may retrieve the list of unregistered tokens
$push->getUnregisteredDeviceTokens();
This method returns an array of unregistered tokens from the Push service provider. If there isn't any unregistered token, it will return an empty array.
After register the Alias Facade for this Package, you can use it like follows:
PushNotification::setService('fcm')
->setMessage([
'notification' => [
'title'=>'This is the title',
'body'=>'This is the message',
'sound' => 'default'
],
'data' => [
'extraPayLoad1' => 'value1',
'extraPayLoad2' => 'value2'
]
])
->setApiKey('Server-API-Key')
->setDevicesToken(['deviceToken1','deviceToken2','deviceToken3'...])
->send()
->getFeedback();
It would return the Push Feedback of the Notification sent.
If a notification supports being sent as an push message, you should define toApn
and/or toFcm
/toGcm
methods on the notification class. This method will receive a $notifiable
entity and should return a Edujugon\PushNotification\Messages\PushMessage
instance:
public function toApn($notifiable)
{
return new PushMessage('Hello world');
}
public function toApn($notifiable)
{
return (new PushMessage)
->title('Hello world')
->body('...');
}
public function toApn($notifiable)
{
return (new PushMessage)
->body('Hello world')
->sound('default');
}
public function toApn($notifiable)
{
return (new PushMessage)
->body('Hello world')
->sound('default')
->badge(7);
}
public function toApn($notifiable)
{
return (new PushMessage)
->body('Hello world')
->config(['dry_run' => false]);
}
public function via($notifiable)
{
return [ApnChannel::class];
}
Don't forget the use statement at the top of the class
Just define routeNotificationForApn
and/or routeNotificationForFcm
/routeNotificationForGcm
methods on the entity
/**
* Route notifications for the Apn channel.
*
* @return string|array
*/
public function routeNotificationForApn()
{
return $this->ios_push_token;
}