定制 larafact/spn 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

larafact/spn

Composer 安装命令:

composer require larafact/spn

包简介

Simple classes for sending Push Notifications via Firebase Cloud Messaging

README 文档

README

A very simple way for sending, and nothing else, push notifications using FireBase Clouding Messaging.

About

Package for Pushing Notifications using Firebase Cloud Messaging Protocol.

Such as its name suggests, the package is intended for providing a simple way for pushing notifications, and nothing else.

Note: It has not any support for pushing messages or notifications based on topics

Main features about SPN are:

For all about errors and exception triggering, please take a look at:

Installation

Require the latest version of Spn into your project

composer require larafact/spn

Or you can add it directly into your project's composer.json file:

{
    "require": {
        "larafact/spn": "^0.1.0"
    }
}

Laravel configuration

Register the Spn Service Provider into your app configuration file config/app.php:

'providers' => [
    // ...
    
    larafact\Spn\SpnServiceProvider::class,
]

Then publish the package config file:

php artisan vendor:publish

And finally in your .env file, add your Server's keys and project ID using the Keys you got from FCM:

FCM_PROJECT_ID=<your_project_id>
FCM_KEY=<your_fcm_server_key>

To get these keys, you must create a new application on the Firebase Cloud Messaging console.

Getting started

Once everything is installed and configured, you can start to using all the helpers exposed by SPN, to achieve all tasks related with

  • Push notifications.
  • Querying responses.
  • Handling Exceptions.
  • Device Group Management.

Push Notifications

SPN can only handle Notification Messages via Firebase Http Protocol. The XMPP protocol is not currently supported.

Single Device

 $response = push_notification(<device_token_id>, 'Greetings', 'Hi, from SPN :)');

Multiple devices

$recipients = [device_token, device_token, ..., device_token] // Up to 1000 device tokens
$response = push_notification($repicpients, 'Greetings', 'Hi, from SPN :)');

Devices Group

$response = push_notification(<devices_group_notification_key>, 'Greetings', 'Hi, from SPN :)');

Handling responses

Once a notification message has been sent, SPN holds the FCM response, so you can querying it for useful information. Check it out the following examples:

Getting the FCM's raw response

$response = push_notification(<device_token>, 'Greetings', 'Hi, from SPN :)');
$rawResponse = $response->rawResponse();  

it returns:

{"multicast_id":8724186164068196172,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1488747479995544%6975114c6975114c"}]}

Response's stats

$response = push_notification(<device_token>, 'Greetings', 'Hi, from SPN :)');
$stats = $response->stats();  

it returns:

[
    'delivered' => [device_token, device_token, ..., device_token],
    'undelivered' => [device_token, device_token, ..., device_token],
    'shouldBeDeleted' => [device_token, device_token, ..., device_token],
    'shouldBeResend' => [device_token, device_token, ..., device_token]
]

If you like to get only an specific stats information, you can use one of the following methods:

$delivered = $response->delivered(); // delivered tokens devices array.
$undelivered = $response->undelivered(); // undelivered tokens devices array.
$tokensForDeletion = $response->tokensForDeletion(); // invalid tokens.
$tokensForResending = $response->tokensForResending(); // tokens for resending.

Note: For notification messages sent to a Device Group, the shouldBeDeleted, and shouldBeResend always be null.

Handling errors and Exceptions.

SPN config file config/spn.php defines 2 keys for specifying how errors should be handled:

  • on_error: tell if an exception will be triggered when any of errors described in Interpreting a downstream message response are found
  • on_partial_deliveries: tell if an exception will be triggered when a notification cannot be delivered to all of its recipients.

SPN defines the following exceptions:

  • ConnectionException: Any exception thrown by GuzzleClient class.
  • InvalidServerKeyException: There was an error authenticating the sender account.
  • BadRequestException: Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields
  • InvalidServerErrorException: Any fatal error.
  • UndeliveredNotificationException: Triggered when a notification was not delivered to any of its recipients (it requires setting on_partial_deliveries = true in config/spn.php )
  • NontificationKeyAlreadyException: The Device Group cannot be created because it already exists.
  • NotificationKeyNotFound: The Device Group Notification Key is invalid.

Device Group Messaging

According FCM:

"With device group messaging, you can send a single message to multiple instances of an app running on devices belonging to a group. Typically, "group" refers a set of different devices that belong to a single user. All devices in a group share a common notification key, which is the token that FCM uses to fan out messages to all devices in the group."

SPN exposes helpers for Device Group Management tasks:

Creating a Device Group

$devices = [device_token, device_token, ...., device_token];
$response = dgm_create(
    $devices,
    'appUser-Chris'
);

it replies with a notification_key:

{
   "notification_key": "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}

Adding members to a Device Group

$devices = [device_token, device_token, ...., device_token];
$notificationKey = '<group_notification_key>';
$notificationKeyName = 'appUser-Chris';
$response = dgm_add(
    $devices,
    $notificationKey,
    $notificationKeyName
);

it replies with a notification_key:

{
   "notification_key": "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}

Removing members from a Device Group

$devices = [device_token, device_token, ...., device_token];
$notificationKey = '<group_notification_key>';
$notificationKeyName = 'appUser-Chris';
$response = dgm_remove(
    $devices,
    $notificationKey,
    $notificationKeyName
);

it replies with a notification_key:

{
   "notification_key": "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}

License

Copyright (c) 2017 - Cobis (jcobis@gmail.com)

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

larafact/spn 适用场景与选型建议

larafact/spn 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 11 次下载、GitHub Stars 达 0, 最近一次更新时间为 2018 年 09 月 28 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「laravel」 「push notification」 「FCM」 「dgm」 「device group manager」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 larafact/spn 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 larafact/spn 我们能提供哪些服务?
定制开发 / 二次开发

基于 larafact/spn 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 11
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 15
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 2
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2018-09-28