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程序
Oct 09 PHP
php email邮箱正则
Oct 08 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
php伪静态之APACHE篇
Jun 02 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
twig里使用js变量的方法
Feb 05 PHP
java微信开发之上传下载多媒体文件
Jun 24 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
php获取是星期几的的一些常用姿势
Dec 15 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中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python抽象类的新写法
2015/06/18 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
python 多进程队列数据处理详解
2019/12/23 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
部队领导证婚词
2014/01/12 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
九不准学习心得体会
2016/01/23 职场文书
Python基础之条件语句详解
2021/06/16 Python