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中inlcude()性能对比详解
Sep 16 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
php服务器的系统详解
Oct 12 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 PHP
php实现文件上传基本验证
Mar 04 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 PHP
PHP的imageTtfText()函数深入详解
Mar 03 PHP
Swoole扩展的6种模式深入详解
Mar 04 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
如何根据业务封装自己的功能组件
2019/04/19 Javascript
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
Python3基础之list列表实例解析
2014/08/13 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
python制作mysql数据迁移脚本
2019/01/01 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
Python for循环与getitem的关系详解
2020/01/02 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
地理科学专业毕业生求职信
2013/10/15 职场文书
怎么写好自荐信
2013/10/30 职场文书
运动会通讯稿400字
2014/01/28 职场文书
主管会计岗位责任制
2014/02/10 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
仓库管理制度范本
2015/08/04 职场文书
学习经验交流会策划书
2015/11/02 职场文书
如何写好活动总结
2019/06/21 职场文书