smileythane / laravel-apn-notification-channel
Apple Push Notification Service (APNs) notifications channel for Laravel 6 using the new APNs HTTP/2 protocol with token-based (JWT with p8 private key)
Requires
- php: ^7.2
- edamov/pushok: ^0.10
- illuminate/notifications: ~5.3|~5.4|~5.5|~5.6|~5.7|~5.8|^6.0
- illuminate/support: ~5.1|~5.2|~5.3|~5.4|~5.5|~5.6|~5.7|~5.8|^6.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^8.4
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2024-12-09 19:38:02 UTC
README
This package makes it easy to send notifications with Laravel 6 to iOS using the new APNs HTTP/2 protocol with token-based (JWT with p8 private key).
Contents
- Features
- Requirements
- Installation
- Usage
- TODO
- Changelog
- Testing
- Security
- Contributing
- Credits
- License
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 >= 7.2
- lib-curl >= 7.46.0 (with http/2 support enabled)
- lib-openssl >= 1.0.2e
Installation
Install this package with Composer:
composer require SmileyThane/laravel-apn-notification-channel
If you're installing the package in Laravel 5.4 or lower, you must import the service provider:
// config/app.php 'providers' => [ // ... SmileyThane\ApnNotificationChannel\ApnServiceProvider::class, ],
Setting up the APN service
Add the credentials to your config/broadcasting.php
:
If you are using JWT-based authentication:
// config/broadcasting.php 'connections' => [ ... 'apn' => [ 'driver' => 'jwt', 'is_production' => env('APP_ENV') === 'production', 'key_id' => env('APN_KEY_ID'), // The Key ID of the p8 file (available at https://developer.apple.com/account/ios/authkey/) 'team_id' => env('APN_TEAM_ID'), // The Team ID of your Apple Developer Account (available at https://developer.apple.com/account/#/membership/) 'app_bundle_id' => env('APN_APP_BUNDLE_ID'), // The Bundle ID of your application. For example, "com.company.application" 'private_key_path' => env('APN_PRIVATE_KEY', storage_path('apns-private-key.p8')), 'private_key_secret' => env('APN_PRIVATE_KEY_SECRET'), ], ... ],
If you are using Certificate-based authentication:
// config/broadcasting.php 'connections' => [ ... 'apn' => [ 'driver' => 'certificate', 'is_production' => env('APP_ENV') === 'production', 'app_bundle_id' => env('APN_APP_BUNDLE_ID'), // The Bundle ID of your application. For example, "com.company.application" 'certificate_path' => env('APN_CERTIFICATE_PATH', storage_path('apns-certificate.pem')), 'certificate_secret' => env('APN_CERTIFICATE_SECRET'), ], ... ],
Usage
Now you can use the channel in your via()
method inside the notification:
use Illuminate\Notifications\Notification; use SmileyThane\ApnNotificationChannel\ApnMessage; class AccountApproved extends Notification { /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['apn']; } /** * Get the APN representation of the notification. * * @param mixed $notifiable * @return ApnMessage */ public function toApn($notifiable) { return ApnMessage::create() ->badge(1) ->title('Account approved') ->body("Your {$notifiable->service} account was approved!"); } }
In your notifiable
model, make sure to include a routeNotificationForApn()
method, which return one or an array of device tokens.
/** * Route notifications for the APN channel. * * @return string|array */ public function routeNotificationForApn() { return $this->apn_token; }
Available Message methods
title($str)
subtitle($str)
body($str)
badge($int)
sound($str)
category($str)
launchImage($str)
threadId($str)
Security
If you discover any security related issues, please email semyon.chetvertnyh@gmail.com instead of using the issue tracker.
Contributing
Please see CONTRIBUTING for details.
Credits
License
The MIT License (MIT). Please see License File for more information.