laravel框架使用极光推送消息操作示例


Posted in PHP onFebruary 15, 2020

本文实例讲述了laravel框架使用极光推送消息。分享给大家供大家参考,具体如下:

最近需要使用极光推送往客户端推消息,所以这里记录下使用过程。

极光推送的服务端文档:

https://docs.jiguang.cn/jpush/server/push/server_overview/

极光推送服务端PHP代码:

https://github.com/jpush/jpush-api-php-client

在laravel项目下安装极光推送

composer require jpush/jpush

我们在config目录下创建一个jpush.php文件,用于获取key和secret

<?php
return [
  'app_key' => env('JPUSH_APP_KEY', ''),
  'master_secret' => env('JPUSH_MASTER_SECRET', ''),
  'apns_production' => env('JPUSH_APNS_PRODUCTION', true),
];

然后在 .env 文件中配置相应参数

JPUSH_APP_KEY=
JPUSH_MASTER_SECRET=
JPUSH_APNS_PRODUCTION=true

然后我们在app目录下,创建一个 Services目录,并创建JPushService.php

<?php
namespace App\Services;
use JPush\Client as JPush;
use Log;
class JPushService
{
  protected static $client = null;
  //推送类型
  const PUSH_TYPE_ALL = 1;
  const PUSH_TYPE_TAG = 2;
  const PUSH_TYPE_ALIAS = 3;
  const PUSH_TYPE_REG_ID = 4;
  private function __construct()
  {
  }
  private function __clone()
  {
  }
  /**
   * 获取实例
   */
  public static function getInstance()
  {
    if (!self::$client) {
      self::$client = new JPush(config('jpush.app_key'), config('jpush.master_secret'), null);
    }
    return self::$client;
  }
  /**
   * 给android或ios推送消息
   */
  public static function pushNotify($params)
  {
    //推送平台
    $platform = $params['platform'] ?? 'all';
    //推送标题
    $title = $params['title'] ?? '';
    //推送内容
    $content = $params['content'] ?? '';
    //通知栏样式ID
    $builder_id = $params['builder_id'] ?? 0;
    //附加字段
    $extras = $params['extras'] ?? '';
    //推送类型
    $type = $params['type'] ?? '';
    //推送目标(注册ID)
    $reg_id = $params['reg_id'] ?? '';
    //推送目标(标签)
    $tag = $params['tag'] ?? '';
    //推送目标(别名)
    $alias = $params['alias'] ?? '';
    try {
      $push = self::getInstance()->push();
      //设置平台
      $push->setPlatform($platform);
      switch ($type) {
        case self::PUSH_TYPE_ALL:
          $push->addAllAudience();
          break;
        case self::PUSH_TYPE_TAG:
          $push->addTag($tag);
          break;
        case self::PUSH_TYPE_ALIAS:
          $push->addAlias($alias);
          break;
        case self::PUSH_TYPE_REG_ID:
          $push->addRegistrationId($reg_id);
          break;
      }
      $push->androidNotification($content, [
        'title' => $title,
        'builder_id' => $builder_id,
        'extras' => $extras,
      ])->iosNotification($content, [
        'sound' => 'sound',
        'badge' => '+1',
        'extras' => $extras
      ])->options([
        'apns_production' => config('jpush.apns_production', true),
        //表示离线消息保留时长(秒)
        'time_to_live' => 86400,
      ]);
      $response = $push->send();
      if ($response['http_code'] != 200) {
        Log::channel('jpush')->error(json_encode($response, JSON_UNESCAPED_UNICODE));
      }
      return $response;
    } catch (\Throwable $e) {
      Log::channel('jpush')->error(json_encode([
        'file' => $e->getFile(),
        'line' => $e->getLine(),
        'message' => $e->getMessage(),
        'params' => $params,
      ], JSON_UNESCAPED_UNICODE));
    }
  }
  /**
   * 获取指定设备的别名和标签
   */
  public static function getDevices($reg_id)
  {
    $response = self::getInstance()->device()->getDevices($reg_id);
    if ($response['http_code'] == 200) {
      return $response['body'];
    }
    return [];
  }
  /**
   * 给指定设备添加标签
   */
  public static function addTags($reg_id, $tags = [])
  {
    $response = self::getInstance()->device()->addTags($reg_id, $tags);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
  /**
   * 清空指定设备的标签
   */
  public static function clearTags($reg_id)
  {
    $response = self::getInstance()->device()->clearTags($reg_id);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
  /**
   * 清空指定设备的标签
   */
  public static function removeTags($reg_id, $tags = [])
  {
    $response = self::getInstance()->device()->removeTags($reg_id, $tags);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
  /**
   * 更新指定设备的别名
   */
  public static function updateAlias($reg_id, $alias)
  {
    $response = self::getInstance()->device()->updateAlias($reg_id, $alias);
    if ($response['http_code'] == 200) {
      return true;
    }
    return false;
  }
}

创建完后,我们就可以在项目中调用 JPushService::pushNotify() 来推消息了。

JPushService::pushNotify([
  //标题
  'title' => '测试',
  //内容
  'content' => '测试',
  //设备标识,跟设备相关
  'reg_id' => 'xxxxxxxxxxx',
  //扩展字段
  'extras' => [
    'key' => 'value',
  ],
  //推送类型
  'type' => JPushService::PUSH_TYPE_REG_ID,
]);

reg_id是前端安卓或IOS获取到后,传给PHP后端,然后跟用户关联,存起来。

注意,reg_id是跟设备相关的,同一个设备上的APP,当不同用户登陆时,reg_id是一样的,这样会导致一个问题。

A用户登APP后,又切换到B用户,那B用户会收到发送给A用户的消息,这会造成消息错乱。

解决方法:

通过别名来发送消息,因为一个设备只能绑定一个别名,当A用户登陆时,把 reg_id 绑定到别名 user_a,切换用户或退出时,就把别名置空。

然后B用户登陆,就把 reg_id 绑定到 user_b 上。推消息时,就通过别名来推送消息。

绑定别名(推荐使用用户ID来区分不同的别名):

JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);

置空别名:

JPushService::updateAlias($user->jpush_reg_id, '');

通过别名发送:

JPushService::pushNotify([
  'title' => '测试',
  'content' => '测试',
  'alias' => 'user_id_' . $message->receive_id,
  'extras' => $extras,
  'type' => JPushService::PUSH_TYPE_ALIAS,
]);

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php MySQL与分页效率
Jun 04 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
PHP json_decode函数详细解析
Feb 17 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
php使用mysqli向数据库添加数据的方法
Mar 20 PHP
利用php输出不同的心形图案
Apr 22 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
May 21 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
Apr 06 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 #PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 #PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 #PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
Feb 12 #PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 #PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 #PHP
thinkphp5框架路由原理与用法详解
Feb 11 #PHP
You might like
php 什么是PEAR?
2009/03/19 PHP
php目录操作实例代码
2014/02/21 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
深入php内核之php in array
2015/11/10 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
解释&amp;&amp;和||在javascript中的另类用法
2014/07/28 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
python二分法实现实例
2013/11/21 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python中的id()函数指的什么
2017/10/17 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
Python3中列表list合并的四种方法
2019/04/19 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
爱游人:Travelliker
2017/09/05 全球购物
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
外贸业务员工作职责
2014/01/06 职场文书
公司委托书格式范本
2014/09/16 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
导游词之阆中古城
2019/12/23 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL