rasyid46 / laravel-fcm
Laravel / Lumen 的 Firebase 云消息推送包
Requires
- php: ^7.2.5|^8.0
- guzzlehttp/guzzle: ^6 || ^7
- illuminate/support: 5.* || ^6 || ^7 || ^8
- monolog/monolog: ^1.12|^2.0
Requires (Dev)
- laravel/laravel: ^6.0|^7.0|^8.0
- mockery/mockery: ^1.3.1|^1.4.4
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^8.4|^9.3|^9.5
This package is auto-updated.
Last update: 2024-09-20 09:58:12 UTC
README
简介
Laravel-FCM 是一个易于使用的包,可以与 Laravel 和 Lumen 一起使用,通过 Firebase 云消息推送 (FCM) 发送推送通知。
目前它只支持 HTTP 协议,用于
- 向一个或多个设备发送下行消息
- 管理群组并发送群组消息
- 发送主题消息
注意:目前不支持 XMPP 协议。
安装
要在项目中获取 Laravel-FCM 的最新版本,请从 "composer" 中引入它
$ composer require rasyid46/laravel-fcm:dev-master
或者您可以直接在 composer.json 文件中添加它
{ "require": { "rasyid46/laravel-fcm": "1.3.*" } }
Laravel
直接在您的 app 配置文件 config/app.php 中注册提供者 config/app.php
Laravel >= 5.5 提供了包自动发现,归功于 rasmuscnielsen 和 luiztessadri,他们在 Laravel-FCM 中帮助实现此功能,因此不再需要注册提供者和外观。
'providers' => [ // ... LaravelFCM\FCMServiceProvider::class, ]
在相同文件中添加外观别名
'aliases' => [ ... 'FCM' => LaravelFCM\Facades\FCM::class, 'FCMGroup' => LaravelFCM\Facades\FCMGroup::class, // Optional ]
注意:只有当您想管理应用程序中的群组消息时,才需要 FCMGroup 外观。
使用以下命令发布包配置文件
$ php artisan vendor:publish --provider="LaravelFCM\FCMServiceProvider"
Lumen
在您的 bootstrap/app.php 应用文件中注册提供者
在文件底部的 "注册服务提供者" 部分添加以下行。
$app->register(LaravelFCM\FCMServiceProvider::class);
对于外观,在 "创建应用程序" 部分添加以下行。FCMGroup 外观仅在您想使用群组消息时才需要。
class_alias(\LaravelFCM\Facades\FCM::class, 'FCM'); class_alias(\LaravelFCM\Facades\FCMGroup::class, 'FCMGroup');
将配置文件 fcm.php
从 /vendor/rasyid46/laravel-fcm/config
目录手动复制到 /config
目录(您可能需要创建此目录)。
包配置
在您的 .env
文件中,添加 Firebase 云消息推送的服务器密钥和密钥
FCM_SERVER_KEY=my_secret_server_key FCM_SENDER_ID=my_secret_sender_id
要获取这些密钥,您必须在 Firebase 云消息推送控制台 上创建一个新的应用程序。
在 Firebase 上创建您的应用程序后,您可以在 项目设置 -> 云消息
中找到密钥。
基本用法
可以使用 Laravel-FCM 发送两种类型的消息
- 通知消息,有时被称为“显示消息”
- 数据消息,由客户端应用程序处理
更多信息请参阅 官方文档。
下行消息
下行消息是您通过其 registration_Ids 向目标设备或多个目标设备发送的通知消息、数据消息或两者的组合。
以下示例需要以下使用声明
use LaravelFCM\Message\OptionsBuilder; use LaravelFCM\Message\PayloadDataBuilder; use LaravelFCM\Message\PayloadNotificationBuilder; use FCM;
向设备发送下行消息
$optionBuilder = new OptionsBuilder(); $optionBuilder->setTimeToLive(60*20); $notificationBuilder = new PayloadNotificationBuilder('my title'); $notificationBuilder->setBody('Hello world') ->setSound('default'); $dataBuilder = new PayloadDataBuilder(); $dataBuilder->addData(['a_data' => 'my_data']); $option = $optionBuilder->build(); $notification = $notificationBuilder->build(); $data = $dataBuilder->build(); $token = "a_registration_from_your_database"; $downstreamResponse = FCM::sendTo($token, $option, $notification, $data); $downstreamResponse->numberSuccess(); $downstreamResponse->numberFailure(); $downstreamResponse->numberModification(); // return Array - you must remove all this tokens in your database $downstreamResponse->tokensToDelete(); // return Array (key : oldToken, value : new token - you must change the token in your database) $downstreamResponse->tokensToModify(); // return Array - you should try to resend the message to the tokens in the array $downstreamResponse->tokensToRetry(); // return Array (key:token, value:error) - in production you should remove from your database the tokens $downstreamResponse->tokensWithError();
向多个设备发送下行消息
$optionBuilder = new OptionsBuilder(); $optionBuilder->setTimeToLive(60*20); $notificationBuilder = new PayloadNotificationBuilder('my title'); $notificationBuilder->setBody('Hello world') ->setSound('default'); $dataBuilder = new PayloadDataBuilder(); $dataBuilder->addData(['a_data' => 'my_data']); $option = $optionBuilder->build(); $notification = $notificationBuilder->build(); $data = $dataBuilder->build(); // You must change it to get your tokens $tokens = MYDATABASE::pluck('fcm_token')->toArray(); $downstreamResponse = FCM::sendTo($tokens, $option, $notification, $data); $downstreamResponse->numberSuccess(); $downstreamResponse->numberFailure(); $downstreamResponse->numberModification(); // return Array - you must remove all this tokens in your database $downstreamResponse->tokensToDelete(); // return Array (key : oldToken, value : new token - you must change the token in your database) $downstreamResponse->tokensToModify(); // return Array - you should try to resend the message to the tokens in the array $downstreamResponse->tokensToRetry(); // return Array (key:token, value:error) - in production you should remove from your database the tokens present in this array $downstreamResponse->tokensWithError();
有关更多信息,请参阅 下行消息错误响应代码 文档。
主题消息
主题消息是您向注册到此主题的所有设备发送的通知消息、数据消息或两者的组合。
注意:主题名称必须由您的应用程序管理并由服务器知晓。Laravel-FCM包或fcm没有提供一种简单的方法来实现这一点。
以下使用声明是下面示例所必需的
use LaravelFCM\Message\Topics;
向主题发送消息
$notificationBuilder = new PayloadNotificationBuilder('my title'); $notificationBuilder->setBody('Hello world') ->setSound('default'); $notification = $notificationBuilder->build(); $topic = new Topics(); $topic->topic('news'); $topicResponse = FCM::sendToTopic($topic, null, $notification, null); $topicResponse->isSuccess(); $topicResponse->shouldRetry(); $topicResponse->error();
向多个主题发送消息
它将通知发送到以下主题已注册的设备
- 新闻和经济学
- 新闻和文化
注意:主题支持每个表达式两个运算符
$notificationBuilder = new PayloadNotificationBuilder('my title'); $notificationBuilder->setBody('Hello world') ->setSound('default'); $notification = $notificationBuilder->build(); $topic = new Topics(); $topic->topic('news')->andTopic(function($condition) { $condition->topic('economic')->orTopic('cultural'); }); $topicResponse = FCM::sendToTopic($topic, null, $notification, null); $topicResponse->isSuccess(); $topicResponse->shouldRetry(); $topicResponse->error());
群组消息
向群组发送通知
$notificationKey = ['a_notification_key']; $notificationBuilder = new PayloadNotificationBuilder('my title'); $notificationBuilder->setBody('Hello world') ->setSound('default'); $notification = $notificationBuilder->build(); $groupResponse = FCM::sendToGroup($notificationKey, null, $notification, null); $groupResponse->numberSuccess(); $groupResponse->numberFailure(); $groupResponse->tokensFailed();
创建群组
$tokens = ['a_registration_id_at_add_to_group']; $groupName = "a_group"; $notificationKey // Save notification key in your database you must use it to send messages or for managing this group $notification_key = FCMGroup::createGroup($groupName, $tokens);
将设备添加到群组
$tokens = ['a_registration_id_at_add_to_the_new_group']; $groupName = "a_group"; $notificationKey = "notification_key_received_when_group_was_created"; $key = FCMGroup::addToGroup($groupName, $notificationKey, $tokens);
从群组中删除设备
注意:如果从群组中删除所有设备,则群组将自动在“fcm”中删除。
$tokens = ['a_registration_id_at_remove_from_the_group']; $groupName = "a_group"; $notificationKey = "notification_key_received_when_group_was_created"; $key = FCMGroup::removeFromGroup($groupName, $notificationKey, $tokens);
选项
Laravel-FCM支持基于Firebase云消息传递的选项。这些选项可以帮助您定义通知的特定性。
您可以根据以下方式构建一个选项
$optionsBuilder = new OptionsBuilder(); $optionsBuilder->setTimeToLive(42*60) ->setCollapseKey('a_collapse_key'); $options = $optionsBuilder->build();
通知消息
通知有效载荷用于发送通知,其行为由接收设备的应用程序状态和操作系统定义。
当应用程序在后台时,通知消息会传递到通知托盘。对于前台应用程序,消息由以下回调处理
- didReceiveRemoteNotification:在iOS上
- onMessageReceived() 在Android上。数据包中的通知键包含通知。
请参阅官方文档。
$notificationBuilder = new PayloadNotificationBuilder(); $notificationBuilder->setTitle('title') ->setBody('body') ->setSound('sound') ->setBadge('badge'); $notification = $notificationBuilder->build();
数据消息
使用您自定义的关键字对设置数据键,向客户端应用程序发送数据有效载荷。数据消息可以有4KB的最大有效载荷。
- iOS,FCM存储消息,只有在应用程序在前台并建立了FCM连接时才会传递。
- Android,客户端应用程序在onMessageReceived()中接收到数据消息,并可以相应地处理键值对。
请参阅官方文档。
$dataBuilder = new PayloadDataBuilder(); $dataBuilder->addData([ 'data_1' => 'first_data' ]); $data = $dataBuilder->build();
通知和数据消息
接收包含通知和数据有效载荷的消息时,应用程序的行为取决于应用程序是否在后台或前台——基本上,它是否在接收时处于活动状态(来源)。
- 后台,应用程序在通知托盘接收通知有效载荷,并且只有在用户点击通知时才会处理数据有效载荷。
- 前台,您的应用程序接收一个包含两个有效载荷的消息对象。
主题
对于主题消息,Laravel-FCM提供了一个易于使用的API,用于抽象Firebase条件。要制作例如在Firebase官方文档中给出的条件,必须像下面这样使用Laravel-FCM
官方文档条件
'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)
$topics = new Topics(); $topics->topic('TopicA') ->andTopic(function($condition) { $condition->topic('TopicB')->orTopic('TopicC'); });
测试
对于集成测试,您可以使用mockery和Mocks提供的包模拟响应。
该包提供了3种“MockResponse”
- MockDownstreamResponse
- MockGroupResponse
- MockTopicResponse
您可以根据以下示例模拟FCM调用
$numberSucess = 2; $mockResponse = new \LaravelFCM\Mocks\MockDownstreamResponse(numberSucess); $mockResponse->addTokenToDelete('token_to_delete'); $mockResponse->addTokenToModify('token_to_modify', 'token_modified'); $mockResponse->setMissingToken(true); $sender = Mockery::mock(\LaravelFCM\Sender\FCMSender::class); $sender->shouldReceive('sendTo')->once()->andReturn($mockResponse); $this->app->singleton('fcm.sender', function($app) use($sender) { return $sender; });
API文档
您可以在API参考中找到有关API的更多文档。
许可证
此库是开源软件,许可协议为MIT许可证。
本文档中的一些内容来自官方文档。您可以在Firebase云消息传递网站上找到完整的文档。