在 Laravel 中使用 极光推送

最近在项目中需要用到推送,抽出时间看了看极光推送,记录一下
Github地址:https://github.com/jpush/jpush-api-php-cli...
Push API:https://github.com/jpush/jpush-api-php-cli...
极光推送官方文档地址:https://docs.jiguang.cn/jpush/server/push/...

环境

  • PHP 7.1.29
  • Laravel 5.6

安装 Jpush

composer.json 文件中的 require 下添加 "jpush/jpush": "^3.6"

"require": {
        "jpush/jpush": "^3.6",
},

执行命令:composer install

配置

config 目录下新建文件 Jpush.php 并进行如下配置:

return [
        'android_app_key' => env('JPUSH_APP_KEY'),
        'android_master_secret' => env('JPUSH_APP_MASTER_SECRET'),

        'ios_app_key' => env('JPUSH_IOS_KEY'),
        'ios_master_secret' => env('JPUSH_IOS_MASTER_SECRET'),

        // 环境 true-生产环境 false-开发环境
        'environment' => env('JPUSH_APNS_PRODUCTION', true),
];

.env 文件进行如下配置:

JPUSH_APP_KEY=极光推送的app_key(android)
JPUSH_APP_MASTER_SECRET=极光推送的master_secret(android)
JPUSH_IOS_KEY=极光推送的app_key(ios)
JPUSH_IOS_MASTER_SECRET=极光推送的master_secret(ios)
JPUSH_APNS_PRODUCTION=true

使用

Modules 目录下新建目录 Jpush,然后在 Jpush 目录下新建文件 JpushService.php 内容如下:

<?php
namespace App\Modules\Jpush;

use App\BaseService;
use App\Exceptions\BaseResponseException;
use JPush\Client;
use Log;

class JpushService extends BaseService
{
    /**
     * 初始化 JPushClient
     * @param $app
     * @return Client
     */
    public static function newJpushClient($app)
    {
        if ($app == 'android') {
            $appKey = config('Jpush.android_app_key');
            $master = config('Jpush.android_master_secret');
        } elseif ($app == 'ios') {
            $appKey = config('Jpush.ios_app_key');
            $master = config('Jpush.ios_master_secret');
        } else {
            throw new BaseResponseException('APP类型错误');
        }
        $client = new Client($appKey, $master);
        return $client;
    }

    /**
     * android 或 ios 通过 别名 给单个设备或多个设备推送消息
     * @param $params
     * @return array
     */
    public static function androidOrIosPushByAlias($params)
    {
        // 推送平台
        $platform = array_get($params, 'platform');
        // 推送标题
        $title = array_get($params, 'title');
        // 推送内容
        $content = array_get($params, 'content');
        // 通知栏样式 ID
        $builderId = array_get($params, 'builderId');
        // 附加字段 (可用于给前端返回,进行其他业务操作,例如:返回orderId,用于点击通知后跳转到订单详情页面)
        $extras = array_get($params, 'extras');
        // 推送目标 (别名)
        $alias = array_get($params, 'alias');
        // 推送目标 (注册ID)
        $registrationId = array_get($params, 'registrationId');
        // 推送类型 (1-别名 2-注册id 3-全部(ios 或 android))
        $type = array_get($params, 'type');

        // 返回一个推送 Payload 构建器
        $push = self::newJpushClient($platform)->push();

        $push->setPlatform($platform);
        switch ($type) {
            // 通过别名推送
            case 1:
                $push->addAlias($alias);
                break;
            // 通过注册 ID 推送
            case 2:
                $push->addRegistrationId($registrationId);
                break;
            // 推送全部(android 或 ios)
            case 3:
                $push->addAllAudience();
                break;
        }

        $push->androidNotification($content, [ // android 通知
            "title" => $title,
            "builder_id" => $builderId,
            "extras" => $extras,
        ])->iosNotification($content, [ // ios 通知
            "sound" => "sound", // 通知提示声音,如果无此字段,则此消息无声音提示;
            "badge" => "+1", // 应用角标(APP右上角的数字)0 清除 默认 +1
            "extras" => $extras
        ])->options([ // 推送参数
            'apns_production' => config('Jpush.environment') // APNs 是否生产环境 (ios)
        ]);

        $response = $push->send();

        if ($response['http_code'] != 200) {
            Log::info('推送失败 by alias',
                compact('response', 'type', 'platform', 'alias', 'registrationId', 'title', 'content')
            );
        }

        return $response;
    }
}

新建路由:

// 手动推送测试(极光推送)
Route::post('message/jpush', 'MessageController@testJpush');

新建控制器并添加方法如下:

  /**
     * 手动测试推送(极光推送)
     */
    public function testJpush()
    {
        // 推送平台 ios android
        $params['platform'] = 'android';
        // 推送标题
        $params['title'] = '恭喜您中奖了!';
        // 推送内容
        $params['content'] = '恭喜您中奖了!500万元大奖哦!';
        // 通知栏样式 ID
        $params['builderId'] = 1;
        // 附加字段(这里自定义 Key / value 信息,以供业务使用)
        $params['extras'] = [
            'orderid' => 13545,
        ];
        // 推送类型 1-别名 2-注册id 3-全部
        $params['type'] = 1;

        // 注册ID 可以是单个 也可以是 数组
        // $params['registrationId'] = '170976fsdas554ewerr98f28';
        // or
        // $params['registrationId'] = [
        //     '170976fsdas554ewerr98f28',
        //     '120c8545we15we46b8929e'
        // ];

        // 别名 可以是单个 也可以是 数组
        // $params['alias'] = '51651545154';
        // or
        // $params['alias'] = [
        //     '51651545154',
        //     '61654564897',
        // ];

        // 开始推送
        $data = JpushService::androidOrIosPushByAlias($params);

        dd($data);
    }

最后,请求该测试方法,得到返回结果如下:

在 Laravel 中使用 极光推送

在 Laravel 中使用 极光推送

在 Laravel 中使用 极光推送

本文只用到了最常用的通知栏推送,如需其他方式请参考 官方文档

以上方法在 android demo 以及 ios 真机测试过,可用,Good Luck,Thanks♪(・ω・)ノ。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 1年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6

用laravel做推送,不考虑性能问题吗😁

5年前 评论

startPush这个方法不存在的

5年前 评论
一个人的江湖 (楼主) 5年前

极光的到达率咋样,我们之前也用的极光,但到达率不是太好,现在换成阿里的移动推送了

5年前 评论
一个人的江湖 (楼主) 5年前

registrationId 应该如何获取, 如何和 user 表的用户对应?

4年前 评论
一个人的江湖 (楼主) 4年前
gyp719 (作者) 4年前
疾风刺火 4年前
一个人的江湖 (楼主) 4年前
疾风刺火 4年前
一个人的江湖 (楼主) 4年前

App\BaseService 这个类是你自定义的吗?里面有什么内容?

4年前 评论
一个人的江湖 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!