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 相关文章推荐
Content-type 的说明
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
分享PHP入门的学习方法
Jan 02 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
理解PHP中的stdClass类
Apr 18 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 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中英混合字符串截取函数代码
2011/07/17 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
PHP加密解密类实例代码
2016/07/20 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
layui--js控制switch的切换方法
2019/09/03 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
JS实现简单日历特效
2020/01/03 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
keras多显卡训练方式
2020/06/10 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
优秀毕业生推荐信
2013/11/02 职场文书
工作鉴定评语
2014/05/04 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
检讨书格式
2019/04/25 职场文书
Python List remove()实例用法详解
2021/08/02 Python
oracle索引总结
2021/09/25 Oracle