Laravel API - 使用 Firebase FCM 向 android 和 iOS 客户端应用程序发送通知

Posted

技术标签:

【中文标题】Laravel API - 使用 Firebase FCM 向 android 和 iOS 客户端应用程序发送通知【英文标题】:Laravel API -Send Notifications to android and iOS client apps with Firebase FCM 【发布时间】:2022-01-01 14:03:36 【问题描述】:

我正在开发一个项目,它使用 androidios 作为前端,后端作为 Laravel API。 因此,我想在某些事件发生时向所有用户(包括 android/iOS)发送通知,例如 New Offer Created/New Stock available.. 所以要做到这一点,已经通过了一些谷歌搜索,最后知道 curl 方法似乎是已弃用..所以有没有更好的方法将firebase FCM集成到我的Laravel项目中..如果是这样怎么办? 我希望有人能回答这个.. 提前致谢

【问题讨论】:

github.com/brozot/Laravel-FCM 你经历过吗? 【参考方案1】:

核心的 Fcm 已在此处回答 How to send Notification to Android from php? 所以在 laravel 你可以

config 文件夹中创建一个config file 并将其命名为firebase.php

 <?php

        return [
            'fcm_url'=>env('FCM_URL'),
            'fcm_api_key'=>env('FCM_API_KEY'),
        ];

在环境文件中

FCM_URL=https://fcm.googleapis.com/fcm/send
FCM_API_KEY=

您可以在代码中创建 Trait 类

<?php


namespace App\Traits;

use Illuminate\Support\Facades\Http;

trait Firebase


    public  function firebaseNotification($fcmNotification)

        $fcmUrl =config('firebase.fcm_url');

        $apiKey=config('firebase.fcm_api_key');

        $http=Http::withHeaders([
            'Authorization:key'=>$apiKey,
            'Content-Type'=>'application/json'
        ])  ->post($fcmUrl,$fcmNotification);

        return  $http->json();
    

然后你可以在任何你想调用的类中包含这个特征

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Traits\Firebase;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller

    use Firebase,AuthenticatesUsers;

    
    public function sendNotification()
        $token="";
        $notification = [
            'title' =>'title',
            'body' => 'body of message.',
            'icon' =>'myIcon',
            'sound' => 'mySound'
        ];
        $extraNotificationData = ["message" => $notification,"moredata" =>'dd'];

        $fcmNotification = [
            //'registration_ids' => $tokenList, //multple token array
            'to'        => $token, //single token
            'notification' => $notification,
            'data' => $extraNotificationData
        ];
        
        return $this->firebaseNotification($fcmNotification); 

    

另外我建议创建基于更好的代码优化的事件

另请阅读

https://firebase.google.com/docs/cloud-messaging/http-server-ref

registration_ids多个用户

此参数指定多播消息的接收者,一个 消息发送到多个注册令牌。

该值应该是要发送到的注册令牌数组 多播消息。该数组必须至少包含 1 且最多包含 1000 个注册令牌。要将消息发送到单个设备,请使用 to 参数。

组播消息只允许使用 HTTP JSON 格式。

@JEJ 评论中提到的新版本

https://firebase.google.com/docs/cloud-messaging/migrate-v1#python_1

原来如此

  $http=Http::withHeaders([
                'Authorization'=>'Bearer '.$apiKey,
                'Content-Type'=>'application/json; UTF-8'
            ])  ->post($fcmUrl,$fcmNotification);
    
            return  $http->json();

$fcmNotification 的简单通知消息


  "message": 
    "topic": "news",
    "notification": 
      "title": "Breaking News",
      "body": "New news story available."
    ,
    "data": 
      "story_id": "story_12345"
    
  

针对多个平台


  "message": 
    "topic": "news",
    "notification": 
      "title": "Breaking News",
      "body": "New news story available."
    ,
    "data": 
      "story_id": "story_12345"
    ,
    "android": 
      "notification": 
        "click_action": "TOP_STORY_ACTIVITY"
      
    ,
    "apns": 
      "payload": 
        "aps": 
          "category" : "NEW_MESSAGE_CATEGORY"
        
      
    
  

【讨论】:

注册令牌超过1000个怎么办? @jej 你必须使用块。例如,如果你在 db 中有 5000 个用户,你可以使用 1000 个块。所以在循环内你可以调用 $this->firebaseNotification($fcmNotification)跨度> 是的..谢谢@John firebase.google.com/docs/cloud-messaging/migrate-v1 需要更改东西才能发送群消息? @JEJ。我最近没有使用 fcm 新的变化。如果我以后有时间我会检查一下【参考方案2】:

试试Laravel FCM package

为方便起见,请在此处编写步骤...

设置

    安装(终端)

    composer require brozot/laravel-fcm
    

    配置/app.php

    供应商

    'providers' => [
        // ...
    
        LaravelFCM\FCMServiceProvider::class,
    ]
    

    别名

    'aliases' => [
        ...
    
        'FCM'      => LaravelFCM\Facades\FCM::class,
    ]
    

    发布包配置文件(终端)

    php artisan vendor:publish --provider="LaravelFCM\FCMServiceProvider"
    

用法

    在您的控制器中,

    导入库

    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" /* OR */ [ /* Array of tokens */ ];
    
    $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();
    

【讨论】:

以上是关于Laravel API - 使用 Firebase FCM 向 android 和 iOS 客户端应用程序发送通知的主要内容,如果未能解决你的问题,请参考以下文章

Laravel API 推送通知到 Flutter

如何在 Flutter 中使用 rest api 不使用 firebase 以 google 或 facebook 登录

使用 Laravel 5.2 连接到 Firebase -“创建资源时出错”

使用 Laravel 托管 ReactJS

如何将 firebase 令牌传递给 Laravel 应用程序?

如何在 google firebase 上托管我的 laravel 项目