Pushok is a simple PHP library for sending push notifications to APNs.
Docker image that meets requirements can be found here. Or you can follow this tutorial to create your own docker image with curl with HTTP/2 support.
Via Composer
$ composer require edamov/pushok
Using JWT token. See Handling Notification Responses from APNs for more info.
<?php
require __DIR__ . '/vendor/autoload.php';
use Pushok\AuthProvider;
use Pushok\Client;
use Pushok\Notification;
use Pushok\Payload;
use Pushok\Payload\Alert;
$options = [
'key_id' => 'AAAABBBBCC', // The Key ID obtained from Apple developer account
'team_id' => 'DDDDEEEEFF', // The Team ID obtained from Apple developer account
'app_bundle_id' => 'com.app.Test', // The bundle ID for app obtained from Apple developer account
'private_key_path' => __DIR__ . '/private_key.p8', // Path to private key
'private_key_secret' => null // Private key secret
];
// Be aware of thing that Token will stale after one hour, so you should generate it again.
// Can be useful when trying to send pushes during long-running tasks
$authProvider = AuthProvider\Token::create($options);
$alert = Alert::create()->setTitle('Hello!');
$alert = $alert->setBody('First push notification');
$payload = Payload::create()->setAlert($alert);
//set notification sound to default
$payload->setSound('default');
//add custom value to your notification, needs to be customized
$payload->setCustomValue('key', 'value');
$deviceTokens = ['<device_token_1>', '<device_token_2>', '<device_token_3>'];
$notifications = [];
foreach ($deviceTokens as $deviceToken) {
$notifications[] = new Notification($payload,$deviceToken);
}
// If you have issues with ssl-verification, you can temporarily disable it. Please see attached note.
// Disable ssl verification
// $client = new Client($authProvider, $production = false, [CURLOPT_SSL_VERIFYPEER=>false] );
$client = new Client($authProvider, $production = false);
$client->addNotifications($notifications);
$responses = $client->push(); // returns an array of ApnsResponseInterface (one Response per Notification)
foreach ($responses as $response) {
// The device token
$response->getDeviceToken();
// A canonical UUID that is the unique ID for the notification. E.g. 123e4567-e89b-12d3-a456-4266554400a0
$response->getApnsId();
// Status code. E.g. 200 (Success), 410 (The device token is no longer active for the topic.)
$response->getStatusCode();
// E.g. The device token is no longer active for the topic.
$response->getReasonPhrase();
// E.g. Unregistered
$response->getErrorReason();
// E.g. The device token is inactive for the specified topic.
$response->getErrorDescription();
$response->get410Timestamp();
}
Using Certificate (.pem). Only the initilization differs from JWT code (above). Remember to include the rest of the code by yourself.
<?php
$options = [
'app_bundle_id' => 'com.app.Test', // The bundle ID for app obtained from Apple developer account
'certificate_path' => __DIR__ . '/private_key.pem', // Path to private key
'certificate_secret' => null // Private key secret
];
$authProvider = AuthProvider\Certificate::create($options);
...
Note : Please see this post about ssl verification
Options to fiddle around. See Sending Notification Requests to APNs
<?php
$client = new Client($authProvider, $production = false);
$client->addNotifications($notifications);
// Set the number of concurrent requests sent through the multiplexed connections. Default : 20
$client->setNbConcurrentRequests( 40 );
// Set the number of maximum concurrent connections established to the APNS servers. Default : 1
$client->setMaxConcurrentConnections( 5 );
$responses = $client->push();
$ composer test
If you discover any security related issues, please email edamov@gmail.com instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.