• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    laravel框架使用极光推送消息操作示例

    本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

    您可能感兴趣的文章:
    • Laravel使用swoole实现websocket主动消息推送的方法介绍
    • laravel框架使用阿里云短信发送消息操作示例
    • Laravel admin实现消息提醒、播放音频功能
    • Laravel Validator自定义错误返回提示消息并在前端展示
    • Laravel使用消息队列需要注意的一些问题
    • PHP的Laravel框架中使用消息队列queue及异步队列的方法
    • 在Laravel框架里实现发送邮件实例(邮箱验证)
    • Laravel框架实现发送短信验证功能代码
    • 使用 laravel sms 构建短信验证码发送校验功能
    • laravel5.4利用163邮箱发送邮件的步骤详解
    • laravel中短信发送验证码的实现方法
    • 用Laravel Sms实现laravel短信验证码的发送的实现
    上一篇:laravel框架使用阿里云短信发送消息操作示例
    下一篇:Laravel框架路由与MVC实例详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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