edamov / pushok
PHP client for Apple Push Notification Service (APNs) - Send push notifications to iOS using the new APNs HTTP/2 protocol with token-based (JWT with p8 private key) or certificate-based authentication
Installs: 1 846 918
Dependents: 14
Suggesters: 0
Security: 0
Stars: 379
Watchers: 14
Forks: 121
Open Issues: 19
Requires
- php: ^8.1
- ext-curl: *
- ext-intl: *
- ext-json: *
- ext-openssl: *
- ext-xml: *
- lib-curl: >=7.46.0
- lib-openssl: >=1.0.2.5
- web-token/jwt-library: ^3.0
Requires (Dev)
- ext-xdebug: *
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^10.5
- squizlabs/php_codesniffer: ^3.4
- 0.16.0
- 0.15.6
- 0.15.5
- 0.15.4
- 0.15.3
- 0.15.2
- 0.15.1
- 0.15.0
- 0.14.3
- 0.14.2
- 0.14.1
- 0.14.0
- 0.13.0
- 0.12.1
- 0.12.0
- 0.11.4
- 0.11.3
- 0.11.2
- 0.11.1
- 0.11.0
- 0.10.5
- 0.10.4
- 0.10.3
- 0.10.2
- 0.10.1
- 0.10.0
- 0.9.0
- 0.8.0
- 0.7.0
- 0.6.4
- 0.6.3
- 0.6.2
- 0.6.1
- 0.6.0
- 0.5.2
- 0.5.1
- 0.5.0
- 0.4.3
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.1
- 0.3.0
- 0.2.6
- 0.2.5
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- dev-master / 0.1.x-dev
- 0.1.0
- dev-php-8.0
- dev-feature/support-ukraine
- dev-feature/update-jwt-libraries
This package is auto-updated.
Last update: 2024-10-26 12:05:41 UTC
README
Do you like the library? Please consider donating to support Ukraine πΊπ¦
Pushok is a simple PHP library for sending push notifications to APNs.
Features
- Uses new Apple APNs HTTP/2 connection
- Supports JWT-based authentication
- Supports Certificate-based authentication
- Supports new iOS 10 features such as Collapse IDs, Subtitles and Mutable Notifications
- Uses concurrent requests to APNs
- Tested and working in APNs production environment
Requirements
- PHP >= 8.1
- lib-curl >= 7.46.0 (with http/2 support enabled)
- lib-openssl >= 1.0.2e
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.
Install
Via Composer
$ composer require edamov/pushok
Getting Started
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();
Testing
$ composer test
Security
If you discover any security related issues, please email edamov@gmail.com instead of using the issue tracker.
Credits
License
The MIT License (MIT). Please see License File for more information.