当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-12 10:45:50 浏览: 评论:0 

本文实例讲述了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

  1. <?php 
  2. return [ 
  3.   'app_key' => env('JPUSH_APP_KEY'''), 
  4.   'master_secret' => env('JPUSH_MASTER_SECRET'''), 
  5.   'apns_production' => env('JPUSH_APNS_PRODUCTION', true), 
  6. ]; 

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

JPUSH_APP_KEY=

JPUSH_MASTER_SECRET=

JPUSH_APNS_PRODUCTION=true

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

  1. <?php 
  2. namespace App\Services; 
  3. use JPush\Client as JPush; 
  4. use Log; 
  5. class JPushService 
  6.   protected static $client = null; 
  7.   //推送类型 
  8.   const PUSH_TYPE_ALL = 1; 
  9.   const PUSH_TYPE_TAG = 2; 
  10.   const PUSH_TYPE_ALIAS = 3; 
  11.   const PUSH_TYPE_REG_ID = 4; 
  12.   private function __construct() 
  13.   { 
  14.   } 
  15.   private function __clone() 
  16.   { 
  17.   } 
  18.   /** 
  19.    * 获取实例 
  20.    */ 
  21.   public static function getInstance() 
  22.   { 
  23.     if (!self::$client) { 
  24.       self::$client = new JPush(config('jpush.app_key'), config('jpush.master_secret'), null); 
  25.     } 
  26.     return self::$client
  27.   } 
  28.   /** 
  29.    * 给android或ios推送消息 
  30.    */ 
  31.   public static function pushNotify($params
  32.   { 
  33.     //推送平台 
  34.     $platform = $params['platform'] ?? 'all'
  35.     //推送标题 
  36.     $title = $params['title'] ?? ''
  37.     //推送内容 
  38.     $content = $params['content'] ?? ''
  39.     //通知栏样式ID 
  40.     $builder_id = $params['builder_id'] ?? 0; 
  41.     //附加字段 
  42.     $extras = $params['extras'] ?? ''
  43.     //推送类型 
  44.     $type = $params['type'] ?? ''
  45.     //推送目标(注册ID) 
  46.     $reg_id = $params['reg_id'] ?? ''
  47.     //推送目标(标签) 
  48.     $tag = $params['tag'] ?? ''
  49.     //推送目标(别名) 
  50.     $alias = $params['alias'] ?? ''
  51.     try { 
  52.       $push = self::getInstance()->push(); 
  53.       //设置平台 
  54.       $push->setPlatform($platform); 
  55.       switch ($type) { 
  56.         case self::PUSH_TYPE_ALL: 
  57.           $push->addAllAudience(); 
  58.           break
  59.         case self::PUSH_TYPE_TAG: 
  60.           $push->addTag($tag); 
  61.           break
  62.         case self::PUSH_TYPE_ALIAS: 
  63.           $push->addAlias($alias); 
  64.           break
  65.         case self::PUSH_TYPE_REG_ID: 
  66.           $push->addRegistrationId($reg_id); 
  67.           break
  68.       } 
  69.       $push->androidNotification($content, [ 
  70.         'title' => $title
  71.         'builder_id' => $builder_id
  72.         'extras' => $extras
  73.       ])->iosNotification($content, [ 
  74.         'sound' => 'sound'
  75.         'badge' => '+1'
  76.         'extras' => $extras 
  77.       ])->options([ 
  78.         'apns_production' => config('jpush.apns_production', true), 
  79.         //表示离线消息保留时长(秒) 
  80.         'time_to_live' => 86400, 
  81.       ]); 
  82.       $response = $push->send(); 
  83.       if ($response['http_code'] != 200) { 
  84.         Log::channel('jpush')->error(json_encode($response, JSON_UNESCAPED_UNICODE)); 
  85.       } 
  86.       return $response
  87.     } catch (\Throwable $e) { 
  88.       Log::channel('jpush')->error(json_encode([ 
  89.         'file' => $e->getFile(), 
  90.         'line' => $e->getLine(), 
  91.         'message' => $e->getMessage(), 
  92.         'params' => $params
  93.       ], JSON_UNESCAPED_UNICODE)); 
  94.     } 
  95.   } 
  96.   /** 
  97.    * 获取指定设备的别名和标签 
  98.    */ 
  99.   public static function getDevices($reg_id
  100.   { 
  101.     $response = self::getInstance()->device()->getDevices($reg_id); 
  102.     if ($response['http_code'] == 200) { 
  103.       return $response['body']; 
  104.     } 
  105.     return []; 
  106.   } 
  107.   /** 
  108.    * 给指定设备添加标签 
  109.    */ 
  110.   public static function addTags($reg_id$tags = []) 
  111.   { 
  112.     $response = self::getInstance()->device()->addTags($reg_id$tags); 
  113.     if ($response['http_code'] == 200) { 
  114.       return true; 
  115.     } 
  116.     return false; 
  117.   } 
  118.   /** 
  119.    * 清空指定设备的标签 
  120.    */ 
  121.   public static function clearTags($reg_id
  122.   { 
  123.     $response = self::getInstance()->device()->clearTags($reg_id); 
  124.     if ($response['http_code'] == 200) { 
  125.       return true; 
  126.     } 
  127.     return false; 
  128.   } 
  129.   /** 
  130.    * 清空指定设备的标签 
  131.    */ 
  132.   public static function removeTags($reg_id$tags = []) 
  133.   { 
  134.     $response = self::getInstance()->device()->removeTags($reg_id$tags); 
  135.     if ($response['http_code'] == 200) { 
  136.       return true; 
  137.     } 
  138.     return false; 
  139.   } 
  140.   /** 
  141.    * 更新指定设备的别名 
  142.    */ 
  143.   public static function updateAlias($reg_id$alias
  144.   { 
  145.     $response = self::getInstance()->device()->updateAlias($reg_id$alias); 
  146.     if ($response['http_code'] == 200) { 
  147.       return true; 
  148.     } 
  149.     return false; 
  150.   } 

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

  1. JPushService::pushNotify([ 
  2.   //标题 
  3.   'title' => '测试'
  4.   //内容 
  5.   'content' => '测试'
  6.   //设备标识,跟设备相关 
  7.   'reg_id' => 'xxxxxxxxxxx'
  8.   //扩展字段 
  9.   'extras' => [ 
  10.     'key' => 'value'
  11.   ], 
  12.   //推送类型 
  13.   'type' => JPushService::PUSH_TYPE_REG_ID, 
  14. ]); 

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, '');

通过别名发送:

  1. JPushService::pushNotify([ 
  2.   'title' => '测试'
  3.   'content' => '测试'
  4.   'alias' => 'user_id_' . $message->receive_id, 
  5.   'extras' => $extras
  6.   'type' => JPushService::PUSH_TYPE_ALIAS, 
  7. ]);

Tags: laravel极光推送消息

分享到: